package org.drools.guvnor.client.ruleeditor; import com.google.gwt.core.client.GWT; import org.drools.guvnor.client.common.GenericCallback; import org.drools.guvnor.client.common.LoadingPopup; import org.drools.guvnor.client.rpc.RuleAsset; import org.drools.guvnor.client.rulelist.EditItemEvent; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.DockLayoutPanel; import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.ScrollPanel; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import org.drools.guvnor.client.messages.Constants; import org.drools.guvnor.client.modeldriven.ui.RuleModellerConfiguration; import org.drools.guvnor.client.packages.WorkingSetManager; import org.drools.guvnor.client.rpc.StandaloneEditorService; import org.drools.guvnor.client.rpc.StandaloneEditorServiceAsync; import org.drools.guvnor.client.ruleeditor.standalone.RealAssetsMultiViewEditorMenuBarCreator; import org.drools.guvnor.client.ruleeditor.standalone.StandaloneEditorInvocationParameters; import org.drools.guvnor.client.ruleeditor.standalone.TemporalAssetsMultiViewEditorMenuBarCreator; import org.drools.guvnor.client.ruleeditor.toolbar.StandaloneEditorIndividualActionToolbarButtonsConfigurationProvider; /** * Class used to manage the stand-alone version of Guvnor's Editors * @author esteban.aliverti@gmail.com * */ public class StandaloneEditorManager { private DockLayoutPanel mainLayout; private Constants constants = GWT.create(Constants.class); private MultiViewEditor editor; private StandaloneEditorServiceAsync standaloneEditorService = GWT.create(StandaloneEditorService.class); private RuleAsset[] assets; public Panel getBaseLayout() { String parametersUUID = Window.Location.getParameter("pUUID"); if (parametersUUID == null || parametersUUID.trim().equals("")) { return null; } //init JS hooks this.setHooks(this); mainLayout = new DockLayoutPanel(Unit.EM); final ScrollPanel mainPanel = new ScrollPanel(); mainLayout.add(mainPanel); //The package must exist (because we need at least a model to work with) //To make things easier (to me), the category must exist too. standaloneEditorService.getInvocationParameters(parametersUUID, new GenericCallback<StandaloneEditorInvocationParameters>() { public void onSuccess(final StandaloneEditorInvocationParameters parameters) { //no assets? This is an error! if (parameters.getAssetsToBeEdited().length == 0) { Window.alert(constants.NoRulesFound()); return; } //we need to store the assets. StandaloneEditorManager.this.assets = parameters.getAssetsToBeEdited(); //Load SCE and create a MultiViewEditor for the assets. //We take the package from the first asset (because all the assets //must belong to the same package) Set<String> validFacts = null; if (parameters.getValidFactTypes() != null){ validFacts = new HashSet<String>(); validFacts.addAll(Arrays.asList(parameters.getValidFactTypes())); } WorkingSetManager.getInstance().applyTemporalWorkingSetForFactTypes(assets[0].metaData.packageName, validFacts, new Command() { public void execute() { LoadingPopup.close(); //Configure RuleModeller RuleModellerConfiguration ruleModellerConfiguration = RuleModellerConfiguration.getInstance(); ruleModellerConfiguration.setHideLHS(parameters.isHideLHS()); ruleModellerConfiguration.setHideRHS(parameters.isHideRHS()); ruleModellerConfiguration.setHideAttributes(parameters.isHideAttributes()); //Create the editor MultiViewEditorMenuBarCreator editorMenuBarCreator; if (parameters.isTemporalAssets()) { editorMenuBarCreator = new TemporalAssetsMultiViewEditorMenuBarCreator(new Command() { //"Done" buton command public void execute() { afterSaveAndClose(); } }, new Command() { //"Cancel button command public void execute() { afterCancelButtonCallbackFunction(); } }); } else { editorMenuBarCreator = new RealAssetsMultiViewEditorMenuBarCreator(new Command() { //"Cancel" button command public void execute() { afterCancelButtonCallbackFunction(); } }); } editor = new MultiViewEditor(parameters.getAssetsToBeEdited(), new EditItemEvent() { public void open(MultiViewRow[] rows) { // TODO Auto-generated method stub } public void open(String key) { // TODO Auto-generated method stub } }, new StandaloneEditorIndividualActionToolbarButtonsConfigurationProvider(), editorMenuBarCreator); editor.setCloseCommand(new Command() { public void execute() { afterSaveAndClose(); } }); //Add the editor to main panel mainPanel.add(editor); } }); } }); return mainLayout; } /** * This method should be invoked from JS using window.getEditorDRL(). * Returns the DRL of the assets we are editing. Because this method is * asynchronous, the DRL code is passed to a callback function specified * in the JS invocation. */ public void getDRLs() { if (assets == null || assets.length == 0) { returnDRL(""); } standaloneEditorService.getAsstesDRL(assets, new GenericCallback<String[]>() { public void onSuccess(String[] drls) { String result = ""; if (drls != null) { for (String drl : drls) { result += drl + "\n\n"; } } returnDRL(result); } }); } /** * This method should be invoked from JS using window.getEditorBRL(). * Returns the BRL of the assets we are editing. Because this method is * asynchronous, the BRL code is passed to a callback function specified * in the JS invocation. */ public void getBRLs() { if (assets == null || assets.length == 0) { returnDRL(""); } standaloneEditorService.getAsstesBRL(assets, new GenericCallback<String[]>() { public void onSuccess(String[] drls) { String result = ""; if (drls != null) { for (String drl : drls) { result += drl + "\n\n"; } } returnBRL(result); } }); } /** * Returns the uuids of the assets that are being edited in JSON format. * @return */ public String getAssetsUUIDs(){ StringBuilder uuids = new StringBuilder("["); String separator = ""; for (int i = 0; i < this.assets.length; i++) { uuids.append(separator); uuids.append("'"); uuids.append(this.assets[i].uuid); uuids.append("'"); if (separator.equals("")){ separator = ","; } } uuids.append("]"); return uuids.toString(); } /** * Creates 2 JS functions in window object: getDRLs() and getBRLs(). These * functions are used to retrieve the source code of the assets this component * is handling. * @param app */ public native void setHooks(StandaloneEditorManager app)/*-{ var guvnorEditorObject = { drlCallbackFunction: null, brlCallbackFunction: null, //close function listener. The function you register here will be called //after the "Save and Close" button is pressed afterSaveAndCloseButtonCallbackFunction: null, afterCancelButtonCallbackFunction: null, getDRL: function (callbackFunction){ this.drlCallbackFunction = callbackFunction; app.@org.drools.guvnor.client.ruleeditor.StandaloneEditorManager::getDRLs()(); }, getBRL: function (callbackFunction){ this.brlCallbackFunction = callbackFunction; app.@org.drools.guvnor.client.ruleeditor.StandaloneEditorManager::getBRLs()(); }, registerAfterSaveAndCloseButtonCallbackFunction: function (callbackFunction){ this.afterSaveAndCloseButtonCallbackFunction = callbackFunction; }, registerAfterCancelButtonCallbackFunction: function (callbackFunction){ this.afterCancelButtonCallbackFunction = callbackFunction; }, getAssetsUUIDs: function(){ return app.@org.drools.guvnor.client.ruleeditor.StandaloneEditorManager::getAssetsUUIDs()(); } } $wnd.guvnorEditorObject = guvnorEditorObject; }-*/; /** * Callback method invoked from getDRLs(). * @param drl */ public native void returnDRL(String drl)/*-{ if ($wnd.guvnorEditorObject.drlCallbackFunction){ $wnd.guvnorEditorObject.drlCallbackFunction(drl); } }-*/; /** * Callback method invoked from getDRLs(). * @param drl */ public native void returnBRL(String brl)/*-{ if ($wnd.guvnorEditorObject.brlCallbackFunction){ $wnd.guvnorEditorObject.brlCallbackFunction(brl); } }-*/; /** * Method invoked after the "Save an Close" button is pressed. */ public native void afterSaveAndClose()/*-{ if ($wnd.guvnorEditorObject.afterSaveAndCloseButtonCallbackFunction){ $wnd.guvnorEditorObject.afterSaveAndCloseButtonCallbackFunction(); } }-*/; public native void afterCancelButtonCallbackFunction()/*-{ if ($wnd.guvnorEditorObject.afterCancelButtonCallbackFunction){ $wnd.guvnorEditorObject.afterCancelButtonCallbackFunction(); } }-*/; }