/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenFlexo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package org.openflexo.wkf.controller.action; import java.util.EventObject; import java.util.Vector; import java.util.logging.Logger; import javax.swing.SwingUtilities; import org.openflexo.components.validation.PartialConsistencyCheckDialog; import org.openflexo.foundation.FlexoException; import org.openflexo.foundation.action.FlexoActionFinalizer; import org.openflexo.foundation.action.FlexoActionInitializer; import org.openflexo.foundation.action.FlexoExceptionHandler; import org.openflexo.foundation.action.SetPropertyAction; import org.openflexo.foundation.wkf.FlexoProcess; import org.openflexo.foundation.wkf.InvalidParentProcessException; import org.openflexo.foundation.wkf.InvalidProcessReferencesException; import org.openflexo.foundation.wkf.WKFObject; import org.openflexo.foundation.wkf.action.WKFDelete; import org.openflexo.foundation.wkf.node.LoopSubProcessNode; import org.openflexo.foundation.wkf.node.OperationNode; import org.openflexo.foundation.wkf.node.SingleInstanceSubProcessNode; import org.openflexo.foundation.wkf.node.SubProcessNode; import org.openflexo.foundation.wkf.node.WSCallSubProcessNode; import org.openflexo.foundation.wkf.utils.OperationAssociatedWithComponentSuccessfully; import org.openflexo.localization.FlexoLocalization; import org.openflexo.view.controller.ActionInitializer; import org.openflexo.view.controller.ControllerActionInitializer; import org.openflexo.view.controller.FlexoController; import org.openflexo.wkf.controller.WKFController; import org.openflexo.wkf.controller.WKFExceptionHandler; public class WKFSetPropertyInitializer extends ActionInitializer { private static final Logger logger = Logger.getLogger(ControllerActionInitializer.class.getPackage().getName()); public WKFSetPropertyInitializer(ControllerActionInitializer actionInitializer) { super(SetPropertyAction.actionType, actionInitializer); } @Override protected FlexoActionInitializer<SetPropertyAction> getDefaultInitializer() { return new FlexoActionInitializer<SetPropertyAction>() { @Override public boolean run(EventObject e, SetPropertyAction action) { if (action.getFocusedObject() == null) { return false; } logger.info("SetPropertyAction in WKF: focusedObject=" + action.getFocusedObject() + " key=" + action.getKey()); if (action.getFocusedObject() instanceof FlexoProcess && action.getKey().equals("parentProcess")) { FlexoProcess newParentProcess = (FlexoProcess) action.getValue(); FlexoProcess movedProcess = (FlexoProcess) action.getFocusedObject(); if (!movedProcess.isAcceptableAsParentProcess(newParentProcess)) { FlexoController.notify(FlexoLocalization.localizedForKey("could_not_move_process_inconsistent_process_hierarchy")); return false; } String message; if (newParentProcess == null) { message = "would_you_really_like_to_make_process_($0)_without_context"; } else { message = "would_you_really_like_to_move_process_($0)_to_($1)"; } return FlexoController.confirm(FlexoLocalization.localizedForKeyWithParams(message, movedProcess.getName(), newParentProcess != null ? newParentProcess.getName() : null)); } /*if (exception instanceof ProcessMovingConfirmation) { String message; FlexoProcess newParentProcess = ((ProcessMovingConfirmation) exception).params.newParentProcess; FlexoProcess movedProcess = ((ProcessMovingConfirmation) exception).params.movedProcess; if (!movedProcess.isAcceptableAsParentProcess(newParentProcess)) { notify(FlexoLocalization.localizedForKey("could_not_move_process_inconsistent_process_hierarchy")); return true; } if (newParentProcess == null) { message = "would_you_really_like_to_make_process_($movedProcess)_without_context"; } else { message = "would_you_really_like_to_move_process_($movedProcess)_to_($newParentProcess)"; } if (confirm(FlexoLocalization.localizedForKeyWithParams(message, ((ProcessMovingConfirmation) exception).params))) { try { movedProcess.setParentProcess(newParentProcess); getWorkflowBrowser().focusOn(movedProcess); } catch (InvalidParentProcessException e) { showError(FlexoLocalization.localizedForKey("could_not_move_process_inconsistent_process_hierarchy")); } catch (InvalidProcessReferencesException e) { logger.info("InvalidProcessReferencesException: launching CheckConsistency dialog"); e.report.setLocalizedTitle(FlexoLocalization.localizedForKey("refactoring_has_generated_following_inconsistency")); PartialConsistencyCheckDialog pccd = new PartialConsistencyCheckDialog(FlexoLocalization .localizedForKey("moving_process"), this, e.report); pccd.show(); } } return true; }*/ return true; } }; } @Override protected FlexoActionFinalizer<SetPropertyAction> getDefaultFinalizer() { return new FlexoActionFinalizer<SetPropertyAction>() { @Override public boolean run(EventObject e, SetPropertyAction action) { if (action.getFocusedObject() instanceof FlexoProcess && action.getKey().equals("parentProcess")) { FlexoProcess movedProcess = (FlexoProcess) action.getFocusedObject(); ((WKFController) getController()).getWorkflowBrowser().focusOn(movedProcess); } else if (action.getFocusedObject() instanceof SubProcessNode && action.getKey().equals("subProcess")) { if (action.getPreviousValue() instanceof FlexoProcess && ((FlexoProcess) action.getPreviousValue()).isImported() && !(action.getValue() instanceof FlexoProcess && ((FlexoProcess) action.getValue()).isImported())) { if (action.getFocusedObject() instanceof SingleInstanceSubProcessNode || action.getFocusedObject() instanceof WSCallSubProcessNode || action.getFocusedObject() instanceof LoopSubProcessNode) { if (((SubProcessNode) action.getFocusedObject()).getPreConditions().size() > 0) { WKFDelete delete = WKFDelete.actionType .makeNewAction(null, new Vector<WKFObject>(((SubProcessNode) action.getFocusedObject()).getPreConditions()), getEditor()); delete.setNoConfirmation(true); delete.doAction(); } if (((SubProcessNode) action.getFocusedObject()).getOutgoingPostConditions().size() > 0) { WKFDelete delete = WKFDelete.actionType.makeNewAction(null, new Vector<WKFObject>(((SubProcessNode) action.getFocusedObject()).getOutgoingPostConditions()), getEditor()); delete.setNoConfirmation(true); delete.doAction(); } } } } return true; } }; } @Override protected FlexoExceptionHandler<SetPropertyAction> getDefaultExceptionHandler() { return new FlexoExceptionHandler<SetPropertyAction>() { @Override public boolean handleException(FlexoException exception, final SetPropertyAction action) { if (action.getFocusedObject() instanceof OperationNode && exception instanceof OperationAssociatedWithComponentSuccessfully) { WKFExceptionHandler.handleAssociation((OperationAssociatedWithComponentSuccessfully) exception, (WKFController) getController()); return true; } else if (action.getFocusedObject() instanceof FlexoProcess) { if (action.getKey().equals("parentProcess")) { if (exception instanceof InvalidParentProcessException) { if (((FlexoProcess) action.getFocusedObject()).getIsWebService()) { FlexoController.showError(FlexoLocalization.localizedForKey("web_service_cannot_be_moved")); return true; } FlexoController.showError(FlexoLocalization .localizedForKey("could_not_move_process_inconsistent_process_hierarchy")); return true; } else if (exception instanceof InvalidProcessReferencesException) { if (action.getPerformValidate()) { logger.info("InvalidProcessReferencesException: launching CheckConsistency dialog"); ((InvalidProcessReferencesException) exception).report.setLocalizedTitle(FlexoLocalization .localizedForKey("refactoring_has_generated_following_inconsistency")); PartialConsistencyCheckDialog pccd = new PartialConsistencyCheckDialog( FlexoLocalization.localizedForKey("moving_process"), getController(), ((InvalidProcessReferencesException) exception).report); pccd.show(); } return true; } } else if (action.getKey().equals("name")) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { FlexoController.notify(FlexoLocalization.localizedForKey("could_not_rename_process_to") + " " + (action.getValue() == null || action.getValue().equals("") ? FlexoLocalization .localizedForKey("empty_value") : action.getValue()) + " " + FlexoLocalization.localizedForKey("because_there_is_already_a_process_with_that_name")); } }); return true; } } exception.printStackTrace(); FlexoController.notify(FlexoLocalization.localizedForKey("could_not_set_property") + " " + (action.getLocalizedPropertyName() != null ? "'" + action.getLocalizedPropertyName() + "' " : "") + FlexoLocalization.localizedForKey("to") + " " + (action.getValue() == null || action.getValue().equals("") ? FlexoLocalization.localizedForKey("empty_value") : action.getValue()) + (exception.getLocalizedMessage() != null ? "\n(" + FlexoLocalization.localizedForKey("details: ") + exception.getLocalizedMessage() + ")" : "")); return true; } }; } }