/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.workbench.screens.guided.dtable.client.editor; import java.util.List; import java.util.Set; import javax.enterprise.event.Event; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.ProvidesResize; import com.google.gwt.user.client.ui.RequiresResize; import org.drools.workbench.models.guided.dtable.shared.model.GuidedDecisionTable52; import org.drools.workbench.screens.guided.dtable.client.editor.menu.EditMenuBuilder; import org.drools.workbench.screens.guided.dtable.client.editor.menu.InsertMenuBuilder; import org.drools.workbench.screens.guided.dtable.client.editor.menu.RadarMenuBuilder; import org.drools.workbench.screens.guided.dtable.client.editor.menu.ViewMenuBuilder; import org.drools.workbench.screens.guided.dtable.client.widget.table.GuidedDecisionTableModellerView; import org.drools.workbench.screens.guided.dtable.client.widget.table.GuidedDecisionTableView; import org.drools.workbench.screens.guided.dtable.client.widget.table.events.cdi.DecisionTableSelectedEvent; import org.drools.workbench.screens.guided.dtable.model.GuidedDecisionTableEditorContent; import org.drools.workbench.screens.guided.dtable.service.GuidedDecisionTableEditorService; import org.guvnor.common.services.project.context.ProjectContext; import org.guvnor.common.services.shared.metadata.model.Metadata; import org.guvnor.common.services.shared.validation.model.ValidationMessage; import org.jboss.errai.common.client.api.Caller; import org.jboss.errai.common.client.api.RemoteCallback; import org.jboss.errai.ioc.client.container.SyncBeanManager; import org.kie.workbench.common.widgets.client.menu.FileMenuBuilder; import org.kie.workbench.common.widgets.client.popups.validation.ValidationPopup; import org.kie.workbench.common.widgets.client.resources.i18n.CommonConstants; import org.kie.workbench.common.widgets.configresource.client.widget.bound.ImportsWidgetPresenter; import org.kie.workbench.common.widgets.metadata.client.KieEditorView; import org.kie.workbench.common.widgets.metadata.client.KieMultipleDocumentEditor; import org.kie.workbench.common.widgets.metadata.client.KieMultipleDocumentEditorWrapperView; import org.kie.workbench.common.widgets.metadata.client.menu.RegisteredDocumentsMenuBuilder; import org.kie.workbench.common.widgets.metadata.client.widget.OverviewWidgetPresenter; import org.uberfire.backend.vfs.ObservablePath; import org.uberfire.client.mvp.PlaceManager; import org.uberfire.client.workbench.events.ChangeTitleWidgetEvent; import org.uberfire.client.workbench.type.ClientResourceType; import org.uberfire.ext.editor.commons.client.file.popups.SavePopUpPresenter; import org.uberfire.ext.editor.commons.client.history.VersionRecordManager; import org.uberfire.ext.editor.commons.client.validation.DefaultFileNameValidator; import org.uberfire.ext.widgets.common.client.callbacks.HasBusyIndicatorDefaultErrorCallback; import org.uberfire.mvp.PlaceRequest; import org.uberfire.workbench.events.NotificationEvent; import org.uberfire.workbench.model.menu.MenuItem; /** * Guided Decision Table Editor Presenter */ public abstract class BaseGuidedDecisionTableEditorPresenter extends KieMultipleDocumentEditor<GuidedDecisionTableView.Presenter> { public interface View extends RequiresResize, ProvidesResize, KieEditorView, IsWidget { void setModellerView( final GuidedDecisionTableModellerView view ); } protected View view; protected Caller<GuidedDecisionTableEditorService> service; protected Event<NotificationEvent> notification; protected Event<DecisionTableSelectedEvent> decisionTableSelectedEvent; protected ValidationPopup validationPopup; protected ClientResourceType resourceType; protected EditMenuBuilder editMenuBuilder; protected ViewMenuBuilder viewMenuBuilder; protected InsertMenuBuilder insertMenuBuilder; protected RadarMenuBuilder radarMenuBuilder; protected GuidedDecisionTableModellerView.Presenter modeller; protected ObservablePath editorPath; protected PlaceRequest editorPlaceRequest; protected MenuItem editMenuItem; protected MenuItem viewMenuItem; protected MenuItem insertMenuItem; protected MenuItem radarMenuItem; protected SyncBeanManager beanManager; protected PlaceManager placeManager; public BaseGuidedDecisionTableEditorPresenter( final View view, final Caller<GuidedDecisionTableEditorService> service, final Event<NotificationEvent> notification, final Event<DecisionTableSelectedEvent> decisionTableSelectedEvent, final ValidationPopup validationPopup, final ClientResourceType resourceType, final EditMenuBuilder editMenuBuilder, final ViewMenuBuilder viewMenuBuilder, final InsertMenuBuilder insertMenuBuilder, final RadarMenuBuilder radarMenuBuilder, final GuidedDecisionTableModellerView.Presenter modeller, final SyncBeanManager beanManager, final PlaceManager placeManager ) { super( view ); this.view = view; this.service = service; this.notification = notification; this.decisionTableSelectedEvent = decisionTableSelectedEvent; this.validationPopup = validationPopup; this.resourceType = resourceType; this.editMenuBuilder = editMenuBuilder; this.viewMenuBuilder = viewMenuBuilder; this.insertMenuBuilder = insertMenuBuilder; this.radarMenuBuilder = radarMenuBuilder; this.modeller = modeller; this.beanManager = beanManager; this.placeManager = placeManager; } @Override //Delegated to expose package-protected setter for Unit Tests protected void setupMenuBar() { super.setupMenuBar(); } @Override //Delegated to expose package-protected setter for Unit Tests protected void setKieEditorWrapperView( final KieMultipleDocumentEditorWrapperView kieEditorWrapperView ) { super.setKieEditorWrapperView( kieEditorWrapperView ); } @Override //Delegated to expose package-protected setter for Unit Tests protected void setOverviewWidget( final OverviewWidgetPresenter overviewWidget ) { super.setOverviewWidget( overviewWidget ); } @Override //Delegated to expose package-protected setter for Unit Tests protected void setSavePopUpPresenter( final SavePopUpPresenter savePopUpPresenter ) { super.setSavePopUpPresenter( savePopUpPresenter ); } @Override //Delegated to expose package-protected setter for Unit Tests protected void setImportsWidget( final ImportsWidgetPresenter importsWidget ) { super.setImportsWidget( importsWidget ); } @Override //Delegated to expose package-protected setter for Unit Tests protected void setNotificationEvent( final Event<NotificationEvent> notificationEvent ) { super.setNotificationEvent( notificationEvent ); } @Override //Delegated to expose package-protected setter for Unit Tests protected void setChangeTitleEvent( final Event<ChangeTitleWidgetEvent> changeTitleEvent ) { super.setChangeTitleEvent( changeTitleEvent ); } @Override //Delegated to expose package-protected setter for Unit Tests protected void setWorkbenchContext( final ProjectContext workbenchContext ) { super.setWorkbenchContext( workbenchContext ); } @Override //Delegated to expose package-protected setter for Unit Tests protected void setVersionRecordManager( final VersionRecordManager versionRecordManager ) { super.setVersionRecordManager( versionRecordManager ); } @Override //Delegated to expose package-protected setter for Unit Tests protected void setFileMenuBuilder( final FileMenuBuilder fileMenuBuilder ) { super.setFileMenuBuilder( fileMenuBuilder ); } @Override //Delegated to expose package-protected setter for Unit Tests protected void setRegisteredDocumentsMenuBuilder( final RegisteredDocumentsMenuBuilder registeredDocumentsMenuBuilder ) { super.setRegisteredDocumentsMenuBuilder( registeredDocumentsMenuBuilder ); } @Override //Delegated to expose package-protected setter for Unit Tests protected void setFileNameValidator( final DefaultFileNameValidator fileNameValidator ) { super.setFileNameValidator( fileNameValidator ); } protected void init() { viewMenuBuilder.setModeller( modeller ); insertMenuBuilder.setModeller( modeller ); radarMenuBuilder.setModeller( modeller ); view.setModellerView( modeller.getView() ); } protected void onStartup( final ObservablePath path, final PlaceRequest placeRequest ) { this.editorPath = path; this.editorPlaceRequest = placeRequest; } protected void onFocus() { if ( modeller.getActiveDecisionTable() != null ) { decisionTableSelectedEvent.fire( new DecisionTableSelectedEvent( modeller.getActiveDecisionTable() ) ); modeller.getActiveDecisionTable().initialiseAnalysis(); } } protected String getTitleText() { return resourceType.getDescription(); } @Override public String getDocumentTitle( final GuidedDecisionTableView.Presenter dtPresenter ) { return dtPresenter.getCurrentPath().getFileName() + " - " + resourceType.getDescription(); } protected boolean mayClose() { for ( GuidedDecisionTableView.Presenter dtPresenter : modeller.getAvailableDecisionTables() ) { if ( !mayClose( dtPresenter ) ) { return false; } } return true; } protected boolean mayClose( final GuidedDecisionTableView.Presenter dtPresenter ) { final Integer originalHashCode = dtPresenter.getOriginalHashCode(); final Integer currentHashCode = dtPresenter.getModel().hashCode(); return mayClose( originalHashCode, currentHashCode ); } @Override public void onClose() { super.onClose(); modeller.onClose(); } protected void onDecisionTableSelected( final DecisionTableSelectedEvent event ) { final GuidedDecisionTableView.Presenter dtPresenter = event.getPresenter(); if ( dtPresenter == null ) { return; } if ( !modeller.isDecisionTableAvailable( dtPresenter ) ) { return; } if ( dtPresenter.equals( getActiveDocument() ) ) { return; } activateDocument( dtPresenter ); } protected void activateDocument( final GuidedDecisionTableView.Presenter dtPresenter ) { enableMenus( true ); dtPresenter.activate(); activateDocument( dtPresenter, dtPresenter.getOverview(), dtPresenter.getDataModelOracle(), dtPresenter.getModel().getImports(), !dtPresenter.getAccess().isEditable() ); } @Override public void refreshDocument( final GuidedDecisionTableView.Presenter dtPresenter ) { final ObservablePath versionPath = dtPresenter.getCurrentPath(); view.showLoading(); service.call( getRefreshContentSuccessCallback( dtPresenter ), getNoSuchFileExceptionErrorCallback() ).loadContent( versionPath ); } private RemoteCallback<GuidedDecisionTableEditorContent> getRefreshContentSuccessCallback( final GuidedDecisionTableView.Presenter dtPresenter ) { final ObservablePath path = dtPresenter.getLatestPath(); final PlaceRequest place = dtPresenter.getPlaceRequest(); final boolean isReadOnly = dtPresenter.isReadOnly(); return ( content ) -> { //Refresh Decision Table in modeller modeller.refreshDecisionTable( dtPresenter, path, place, content, isReadOnly ); activateDocument( dtPresenter ); view.hideBusyIndicator(); }; } @Override public void removeDocument( final GuidedDecisionTableView.Presenter dtPresenter ) { modeller.removeDecisionTable( dtPresenter ); deregisterDocument( dtPresenter ); dtPresenter.onClose(); openOtherDecisionTable(); } void openOtherDecisionTable() { final Set<GuidedDecisionTableView.Presenter> availableDecisionTables = modeller.getAvailableDecisionTables(); if ( availableDecisionTables == null || availableDecisionTables.isEmpty() ) { placeManager.forceClosePlace( editorPlaceRequest ); } else { final GuidedDecisionTableView.Presenter dtPresenter = availableDecisionTables.iterator().next(); activateDocument( dtPresenter ); } } @Override public void onValidate( final GuidedDecisionTableView.Presenter dtPresenter ) { final ObservablePath path = dtPresenter.getCurrentPath(); final GuidedDecisionTable52 model = dtPresenter.getModel(); service.call( new RemoteCallback<List<ValidationMessage>>() { @Override public void callback( final List<ValidationMessage> results ) { if ( results == null || results.isEmpty() ) { notification.fire( new NotificationEvent( CommonConstants.INSTANCE.ItemValidatedSuccessfully(), NotificationEvent.NotificationType.SUCCESS ) ); } else { showValidationPopup( results ); } } } ).validate( path, model ); } void showValidationPopup( final List<ValidationMessage> results ) { validationPopup.showMessages( results ); } @Override public void onSave( final GuidedDecisionTableView.Presenter dtPresenter, final String commitMessage ) { final ObservablePath path = dtPresenter.getCurrentPath(); final GuidedDecisionTable52 model = dtPresenter.getModel(); final Metadata metadata = dtPresenter.getOverview().getMetadata(); service.call( getSaveSuccessCallback( dtPresenter, model.hashCode() ), new HasBusyIndicatorDefaultErrorCallback( view ) ).saveAndUpdateGraphEntries( path, model, metadata, commitMessage ); } @Override public void onSourceTabSelected( final GuidedDecisionTableView.Presenter dtPresenter ) { final ObservablePath path = dtPresenter.getCurrentPath(); final GuidedDecisionTable52 model = dtPresenter.getModel(); service.call( new RemoteCallback<String>() { @Override public void callback( String source ) { updateSource( source ); } }, getCouldNotGenerateSourceErrorCallback() ).toSource( path, model ); } protected MenuItem getEditMenuItem() { if ( editMenuItem == null ) { editMenuItem = editMenuBuilder.build(); } return editMenuItem; } protected MenuItem getViewMenuItem() { if ( viewMenuItem == null ) { viewMenuItem = viewMenuBuilder.build(); } return viewMenuItem; } protected MenuItem getInsertMenuItem() { if ( insertMenuItem == null ) { insertMenuItem = insertMenuBuilder.build(); } return insertMenuItem; } protected MenuItem getRadarMenuItem() { if ( radarMenuItem == null ) { radarMenuItem = radarMenuBuilder.build(); } return radarMenuItem; } @Override protected void enableMenus( final boolean enabled ) { super.enableMenus( enabled ); getEditMenuItem().setEnabled( enabled ); getViewMenuItem().setEnabled( enabled ); getInsertMenuItem().setEnabled( enabled ); getRadarMenuItem().setEnabled( enabled ); } }