/*
* (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.view.controller;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Hashtable;
import java.util.Map;
import java.util.logging.Level;
import org.openflexo.action.ImportProjectInitializer;
import org.openflexo.action.ProjectExcelExportInitializer;
import org.openflexo.action.RemoveImportedProjectInitializer;
import org.openflexo.action.UploadPrjInitializer;
import org.openflexo.antar.binding.TypeUtils;
import org.openflexo.foundation.FlexoEditor;
import org.openflexo.foundation.FlexoModelObject;
import org.openflexo.foundation.FlexoProperty;
import org.openflexo.foundation.action.AddFlexoProperty;
import org.openflexo.foundation.action.DeleteFlexoProperty;
import org.openflexo.foundation.action.FlexoAction;
import org.openflexo.foundation.action.FlexoActionEnableCondition;
import org.openflexo.foundation.action.FlexoActionFinalizer;
import org.openflexo.foundation.action.FlexoActionInitializer;
import org.openflexo.foundation.action.FlexoActionRedoFinalizer;
import org.openflexo.foundation.action.FlexoActionRedoInitializer;
import org.openflexo.foundation.action.FlexoActionType;
import org.openflexo.foundation.action.FlexoActionUndoFinalizer;
import org.openflexo.foundation.action.FlexoActionUndoInitializer;
import org.openflexo.foundation.action.FlexoActionVisibleCondition;
import org.openflexo.foundation.action.FlexoActionizer;
import org.openflexo.foundation.action.FlexoActionizer.EditorProvider;
import org.openflexo.foundation.action.FlexoExceptionHandler;
import org.openflexo.foundation.action.SortFlexoProperties;
import org.openflexo.module.FlexoModule;
import org.openflexo.view.controller.action.AddFlexoPropertyActionizer;
import org.openflexo.view.controller.action.DeleteFlexoPropertyActionizer;
import org.openflexo.view.controller.action.HelpActionizer;
import org.openflexo.view.controller.action.InspectActionizer;
import org.openflexo.view.controller.action.LoadAllImportedProjectInitializer;
import org.openflexo.view.controller.action.RefreshImportedProcessesActionInitializer;
import org.openflexo.view.controller.action.RefreshImportedRolesActionInitializer;
import org.openflexo.view.controller.action.SortFlexoPropertiesActionizer;
import org.openflexo.view.controller.action.SubmitDocumentationActionizer;
public class ControllerActionInitializer implements EditorProvider {
private static final java.util.logging.Logger logger = org.openflexo.logging.FlexoLogger.getLogger(ControllerActionInitializer.class
.getPackage().getName());
private final FlexoController _controller;
private Map<FlexoActionType<?, ?, ?>, ActionInitializer<?, ?, ?>> initializers;
private Map<Class<?>, ActionInitializer<?, ?, ?>> initializersByActionClass;
protected ControllerActionInitializer(FlexoController controller) {
super();
initializers = new Hashtable<FlexoActionType<?, ?, ?>, ActionInitializer<?, ?, ?>>();
initializersByActionClass = new Hashtable<Class<?>, ActionInitializer<?, ?, ?>>();
_controller = controller;
initializeActions();
}
public Map<FlexoActionType<?, ?, ?>, ActionInitializer<?, ?, ?>> getActionInitializers() {
return initializers;
}
public FlexoModule getFlexoModule() {
return getController().getModule();
}
public <A extends FlexoAction<A, T1, T2>, T1 extends FlexoModelObject, T2 extends FlexoModelObject> void registerInitializer(
FlexoActionType<A, T1, T2> actionType, ActionInitializer<A, T1, T2> initializer) {
if (actionType != null) {
initializers.put(actionType, initializer);
} else {
Type superClass = initializer.getClass().getGenericSuperclass();
if (superClass instanceof ParameterizedType) {
Class<?> actionClass = TypeUtils.getBaseClass(((ParameterizedType) superClass).getActualTypeArguments()[0]);
initializersByActionClass.put(actionClass, initializer);
} else {
if (logger.isLoggable(Level.SEVERE)) {
logger.severe("You registered an action initializer without providing an action type and this method does not know how to retrieve the action Action class.");
}
}
}
}
@Override
public FlexoEditor getEditor() {
return getController().getEditor();
}
public FlexoController getController() {
return _controller;
}
public FlexoModule getModule() {
return getController().getModule();
}
public void initializeActions() {
new InspectActionizer(this);
new ImportProjectInitializer(this);
new RemoveImportedProjectInitializer(this);
new HelpActionizer(this);
new SubmitDocumentationActionizer(this);
new RefreshImportedRolesActionInitializer(this);
new RefreshImportedProcessesActionInitializer(this);
new UploadPrjInitializer(this);
new ProjectExcelExportInitializer(this);
new LoadAllImportedProjectInitializer(this);
new AddFlexoPropertyActionizer(this);
new DeleteFlexoPropertyActionizer(this);
new SortFlexoPropertiesActionizer(this);
if (FlexoModelObject.addFlexoPropertyActionizer == null) {
FlexoModelObject.addFlexoPropertyActionizer = new FlexoActionizer<AddFlexoProperty, FlexoModelObject, FlexoModelObject>(
AddFlexoProperty.actionType, this);
}
if (FlexoModelObject.sortFlexoPropertiesActionizer == null) {
FlexoModelObject.sortFlexoPropertiesActionizer = new FlexoActionizer<SortFlexoProperties, FlexoModelObject, FlexoModelObject>(
SortFlexoProperties.actionType, this);
}
if (FlexoModelObject.deleteFlexoPropertyActionizer == null) {
FlexoModelObject.deleteFlexoPropertyActionizer = new FlexoActionizer<DeleteFlexoProperty, FlexoProperty, FlexoProperty>(
DeleteFlexoProperty.actionType, this);
}
}
@SuppressWarnings("unchecked")
public <A extends FlexoAction<A, T1, T2>, T1 extends FlexoModelObject, T2 extends FlexoModelObject> ActionInitializer<A, T1, T2> getActionInitializer(
FlexoActionType<A, T1, T2> actionType) {
ActionInitializer<A, T1, T2> actionInitializer = (ActionInitializer<A, T1, T2>) initializers.get(actionType);
if (actionInitializer == null) {
Type superClass = actionType.getClass().getGenericSuperclass();
if (superClass instanceof ParameterizedType) {
Class<?> actionClass = TypeUtils.getBaseClass(((ParameterizedType) superClass).getActualTypeArguments()[0]);
actionInitializer = (ActionInitializer<A, T1, T2>) initializersByActionClass.get(actionClass);
}
}
return actionInitializer;
}
public <A extends FlexoAction<A, T1, T2>, T1 extends FlexoModelObject, T2 extends FlexoModelObject> FlexoActionFinalizer<A> getFinalizerFor(
FlexoActionType<A, T1, T2> actionType) {
ActionInitializer<A, T1, T2> initializer = getActionInitializer(actionType);
if (initializer != null) {
return initializer.getDefaultFinalizer();
}
return null;
}
public <A extends FlexoAction<A, T1, T2>, T1 extends FlexoModelObject, T2 extends FlexoModelObject> FlexoActionInitializer<A> getInitializerFor(
FlexoActionType<A, T1, T2> actionType) {
ActionInitializer<A, T1, T2> initializer = getActionInitializer(actionType);
if (initializer != null) {
return initializer.getDefaultInitializer();
}
return null;
}
public <A extends FlexoAction<A, T1, T2>, T1 extends FlexoModelObject, T2 extends FlexoModelObject> FlexoActionUndoFinalizer<A> getUndoFinalizerFor(
FlexoActionType<A, T1, T2> actionType) {
ActionInitializer<A, T1, T2> initializer = getActionInitializer(actionType);
if (initializer != null) {
return initializer.getDefaultUndoFinalizer();
}
return null;
}
public <A extends FlexoAction<A, T1, T2>, T1 extends FlexoModelObject, T2 extends FlexoModelObject> FlexoActionUndoInitializer<A> getUndoInitializerFor(
FlexoActionType<A, T1, T2> actionType) {
ActionInitializer<A, T1, T2> initializer = getActionInitializer(actionType);
if (initializer != null) {
return initializer.getDefaultUndoInitializer();
}
return null;
}
public <A extends FlexoAction<A, T1, T2>, T1 extends FlexoModelObject, T2 extends FlexoModelObject> FlexoActionRedoFinalizer<A> getRedoFinalizerFor(
FlexoActionType<A, T1, T2> actionType) {
ActionInitializer<A, T1, T2> initializer = getActionInitializer(actionType);
if (initializer != null) {
return initializer.getDefaultRedoFinalizer();
}
return null;
}
public <A extends FlexoAction<A, T1, T2>, T1 extends FlexoModelObject, T2 extends FlexoModelObject> FlexoActionRedoInitializer<A> getRedoInitializerFor(
FlexoActionType<A, T1, T2> actionType) {
ActionInitializer<A, T1, T2> initializer = getActionInitializer(actionType);
if (initializer != null) {
return initializer.getDefaultRedoInitializer();
}
return null;
}
public <A extends FlexoAction<A, T1, T2>, T1 extends FlexoModelObject, T2 extends FlexoModelObject> FlexoActionEnableCondition<A, T1, T2> getEnableConditionFor(
FlexoActionType<A, T1, T2> actionType) {
ActionInitializer<A, T1, T2> initializer = getActionInitializer(actionType);
if (initializer != null) {
return initializer.getEnableCondition();
}
return null;
}
public <A extends FlexoAction<A, T1, T2>, T1 extends FlexoModelObject, T2 extends FlexoModelObject> FlexoActionVisibleCondition<A, T1, T2> getVisibleConditionFor(
FlexoActionType<A, T1, T2> actionType) {
ActionInitializer<A, T1, T2> initializer = getActionInitializer(actionType);
if (initializer != null) {
return initializer.getVisibleCondition();
}
return null;
}
public <A extends FlexoAction<A, T1, T2>, T1 extends FlexoModelObject, T2 extends FlexoModelObject> FlexoExceptionHandler<A> getExceptionHandlerFor(
FlexoActionType<A, T1, T2> actionType) {
ActionInitializer<A, T1, T2> initializer = getActionInitializer(actionType);
if (initializer != null) {
return initializer.getDefaultExceptionHandler();
}
return null;
}
}