Package com.ptby.dynamicreturntypeplugin.config.valuereplacement

Source Code of com.ptby.dynamicreturntypeplugin.config.valuereplacement.ScriptFileCallbackReplacementStrategy

package com.ptby.dynamicreturntypeplugin.config.valuereplacement;

import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.ptby.dynamicreturntypeplugin.scripting.CustomScriptEngineFactory;
import com.ptby.dynamicreturntypeplugin.scripting.PhpCallReferenceInfo;
import com.ptby.dynamicreturntypeplugin.scripting.CallableScriptConfiguration;
import com.ptby.dynamicreturntypeplugin.scripting.ScriptReplacementExecutor;

import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.IOException;

public class ScriptFileCallbackReplacementStrategy implements ValueReplacementStrategy {
    private final ScriptEngineManager scriptEngineManager;

    private final String className;
    private final String methodName;
    private final String scriptFileName;
    private final String javascriptFunctionCall;
    private final String absoluteJavaScriptFileLocationPath;
    private ScriptReplacementExecutor scriptReplacementExecutor;


    public ScriptFileCallbackReplacementStrategy( ScriptEngineManager scriptEngineManager,
                                                  String scriptParentDirectory,
                                                  String className,
                                                  String methodName,
                                                  String scriptFileName,
                                                  String javascriptFunctionCall ) {
        this.scriptEngineManager = scriptEngineManager;
        this.className = className;
        this.methodName = methodName;
        this.scriptFileName = scriptFileName;
        this.javascriptFunctionCall = javascriptFunctionCall;

        this.absoluteJavaScriptFileLocationPath = scriptParentDirectory + "/" + scriptFileName;

        loadJavascript();
    }


    private void loadJavascript() {
        VirtualFile fileByPath =
                LocalFileSystem.getInstance().findFileByPath( absoluteJavaScriptFileLocationPath );
        if ( fileByPath == null ) {
            String message = "Local file system could not find script  " + absoluteJavaScriptFileLocationPath;

            Notifications.Bus.notify( createWarningNotification( message ) );
            return;
        }

        try {
            String script = new String( fileByPath.contentsToByteArray() );
            CallableScriptConfiguration callableScriptConfiguration = new CallableScriptConfiguration(
                    absoluteJavaScriptFileLocationPath,
                    script,
                    javascriptFunctionCall
            );

            scriptReplacementExecutor = new ScriptReplacementExecutor(
                    CustomScriptEngineFactory.OBJECT$.createFactory( scriptEngineManager, calculateScriptType() ),
                    new PhpCallReferenceInfo( className, methodName ),
                    callableScriptConfiguration
            );

        } catch ( IOException e ) {
            String message = "Could not read javascript call back file " + absoluteJavaScriptFileLocationPath +
                    "\n" + e.getMessage();

            Notifications.Bus.notify( createWarningNotification( message ) );
        } catch ( ScriptException e ) {
            String message = "Could not evaluate javascript call back file " + absoluteJavaScriptFileLocationPath +
                    "\n" + e.getMessage();

            Notifications.Bus.notify( createWarningNotification( message ) );
        }
    }


    @Override
    public String toString() {
        return "ScriptFileCallbackReplacementStrategy{" +
                "\nclassName='" + className + '\'' +
                "\n, methodName='" + methodName + '\'' +
                "\n, scriptFileName='" + scriptFileName + '\'' +
                "\n, javascriptFunctionCall='" + javascriptFunctionCall + '\'' +
                "\n, absoluteJavaScriptFileLocationPath='" + absoluteJavaScriptFileLocationPath + '\'' +
                "\n, scriptReplacementExecutor=" + scriptReplacementExecutor +
                '}';
    }


    private Notification createWarningNotification( String message ) {
        return new Notification(
                "DynamicReturnTypePlugin",
                "Script file error",
                message,
                NotificationType.WARNING
        );
    }


    private String calculateScriptType() {
        String scriptExtension = "";
        int i = scriptFileName.lastIndexOf( '.' );
        if ( i > 0 ) {
            scriptExtension = scriptFileName.substring( i + 1 ).toLowerCase();
        }
        if ( scriptExtension.equals( "groovy" ) ) {
            return ScriptReplacementExecutor.SCRIPT_LANGUAGE_GROOVY;
        }

        return ScriptReplacementExecutor.SCRIPT_LANGUAGE_JAVASCRIPT;
    }


    @Override
    public String replaceCalculatedValue( String currentValue ) {
        if ( scriptReplacementExecutor == null ) {
            return currentValue;
        }

        return scriptReplacementExecutor.executeAndReplace( currentValue );
    }


    @Override
    public boolean equals( Object o ) {
        if ( this == o ) {
            return true;
        }
        if ( !( o instanceof ScriptFileCallbackReplacementStrategy ) ) {
            return false;
        }

        ScriptFileCallbackReplacementStrategy that = ( ScriptFileCallbackReplacementStrategy ) o;

        if ( absoluteJavaScriptFileLocationPath != null ? !absoluteJavaScriptFileLocationPath
                .equals( that.absoluteJavaScriptFileLocationPath ) : that.absoluteJavaScriptFileLocationPath != null ) {
            return false;
        }
        if ( className != null ? !className.equals( that.className ) : that.className != null ) {
            return false;
        }
        if ( javascriptFunctionCall != null ? !javascriptFunctionCall
                .equals( that.javascriptFunctionCall ) : that.javascriptFunctionCall != null ) {
            return false;
        }
        if ( methodName != null ? !methodName.equals( that.methodName ) : that.methodName != null ) {
            return false;
        }
        if ( scriptFileName != null ? !scriptFileName.equals( that.scriptFileName ) : that.scriptFileName != null ) {
            return false;
        }
        if ( scriptReplacementExecutor != null ? !scriptReplacementExecutor
                .equals( that.scriptReplacementExecutor ) : that.scriptReplacementExecutor != null ) {
            return false;
        }

        return true;
    }


    @Override
    public int hashCode() {
        int result = className != null ? className.hashCode() : 0;
        result = 31 * result + ( methodName != null ? methodName.hashCode() : 0 );
        result = 31 * result + ( scriptFileName != null ? scriptFileName.hashCode() : 0 );
        result = 31 * result + ( javascriptFunctionCall != null ? javascriptFunctionCall.hashCode() : 0 );
        result = 31 * result + ( absoluteJavaScriptFileLocationPath != null ? absoluteJavaScriptFileLocationPath
                .hashCode() : 0 );
        result = 31 * result + ( scriptReplacementExecutor != null ? scriptReplacementExecutor.hashCode() : 0 );
        return result;
    }
}
TOP

Related Classes of com.ptby.dynamicreturntypeplugin.config.valuereplacement.ScriptFileCallbackReplacementStrategy

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.