/* * (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.foundation.viewpoint; import java.lang.reflect.Type; import java.util.Vector; import java.util.logging.Logger; import org.openflexo.antar.binding.Bindable; import org.openflexo.antar.binding.BindingDefinition; import org.openflexo.antar.binding.BindingDefinition.BindingDefinitionType; import org.openflexo.antar.binding.BindingModel; import org.openflexo.foundation.validation.CompoundIssue; import org.openflexo.foundation.validation.ValidationError; import org.openflexo.foundation.validation.ValidationIssue; import org.openflexo.foundation.validation.ValidationRule; import org.openflexo.foundation.view.View; import org.openflexo.foundation.view.action.EditionSchemeAction; import org.openflexo.foundation.viewpoint.ViewPoint.ViewPointBuilder; import org.openflexo.foundation.viewpoint.binding.ViewPointDataBinding; public class AddEditionPattern extends AssignableAction { private static final Logger logger = Logger.getLogger(AddEditionPattern.class.getPackage().getName()); private EditionPattern editionPatternType; private CreationScheme creationScheme; private String _creationSchemeURI; public AddEditionPattern(ViewPointBuilder builder) { super(builder); } @Override public EditionActionType getEditionActionType() { return EditionActionType.AddEditionPattern; } /*@Override public List<EditionPatternPatternRole> getAvailablePatternRoles() { return getEditionPattern().getPatternRoles(EditionPatternPatternRole.class); }*/ @Override public String getInspectorName() { return null; } public View getView(EditionSchemeAction action) { return (View) getView().getBindingValue(action); } /*@Override public EditionPatternPatternRole getPatternRole() { try { return super.getPatternRole(); } catch (ClassCastException e) { logger.warning("Unexpected pattern role type"); setPatternRole(null); return null; } }*/ // FIXME: if we remove this useless code, some FIB won't work (see EditionPatternView.fib, inspect an AddEditionPattern) // Need to be fixed in KeyValueProperty.java /*@Override public void setPatternRole(EditionPatternPatternRole patternRole) { super.setPatternRole(patternRole); }*/ private ViewPointDataBinding view; private BindingDefinition VIEW = new BindingDefinition("view", View.class, BindingDefinitionType.GET, true); public BindingDefinition getViewBindingDefinition() { return VIEW; } public ViewPointDataBinding getView() { if (view == null) { view = new ViewPointDataBinding(this, EditionActionBindingAttribute.view, getViewBindingDefinition()); } return view; } public void setView(ViewPointDataBinding aView) { if (aView != null) { aView.setOwner(this); aView.setBindingAttribute(EditionActionBindingAttribute.view); aView.setBindingDefinition(getViewBindingDefinition()); } this.view = aView; } public EditionPattern getEditionPatternType() { if (getCreationScheme() != null) { return getCreationScheme().getEditionPattern(); } return editionPatternType; } public void setEditionPatternType(EditionPattern editionPatternType) { this.editionPatternType = editionPatternType; if (getCreationScheme() != null && getCreationScheme().getEditionPattern() != editionPatternType) { setCreationScheme(null); } } public String _getCreationSchemeURI() { if (getCreationScheme() != null) { return getCreationScheme().getURI(); } return _creationSchemeURI; } public void _setCreationSchemeURI(String uri) { if (getViewPointLibrary() != null) { creationScheme = (CreationScheme) getViewPointLibrary().getEditionScheme(uri); } _creationSchemeURI = uri; } public CreationScheme getCreationScheme() { if (getPatternRole() instanceof EditionPatternPatternRole) { return ((EditionPatternPatternRole) getPatternRole()).getCreationScheme(); } if (creationScheme == null && _creationSchemeURI != null && getViewPointLibrary() != null) { creationScheme = (CreationScheme) getViewPointLibrary().getEditionScheme(_creationSchemeURI); } return creationScheme; } public void setCreationScheme(CreationScheme creationScheme) { this.creationScheme = creationScheme; if (creationScheme != null) { _creationSchemeURI = creationScheme.getURI(); } } private Vector<AddEditionPatternParameter> parameters = new Vector<AddEditionPattern.AddEditionPatternParameter>(); public Vector<AddEditionPatternParameter> getParameters() { updateParameters(); return parameters; } public void setParameters(Vector<AddEditionPatternParameter> parameters) { this.parameters = parameters; } public void addToParameters(AddEditionPatternParameter parameter) { parameter.setAction(this); parameters.add(parameter); } public void removeFromParameters(AddEditionPatternParameter parameter) { parameter.setAction(null); parameters.remove(parameter); } public AddEditionPatternParameter getParameter(EditionSchemeParameter p) { for (AddEditionPatternParameter addEPParam : parameters) { if (addEPParam.getParam() == p) { return addEPParam; } } return null; } private void updateParameters() { Vector<AddEditionPatternParameter> parametersToRemove = new Vector<AddEditionPattern.AddEditionPatternParameter>(parameters); if (getCreationScheme() != null) { for (EditionSchemeParameter p : getCreationScheme().getParameters()) { AddEditionPatternParameter existingParam = getParameter(p); if (existingParam != null) { parametersToRemove.remove(existingParam); } else { addToParameters(new AddEditionPatternParameter(p)); } } } for (AddEditionPatternParameter removeThis : parametersToRemove) { removeFromParameters(removeThis); } } public static class AddEditionPatternParameter extends EditionSchemeObject implements Bindable { @SuppressWarnings("unused") private static final Logger logger = Logger.getLogger(GraphicalElementSpecification.class.getPackage().getName()); private AddEditionPattern action; private EditionSchemeParameter param; private String paramName; private ViewPointDataBinding value; private BindingDefinition BD; // Use it only for deserialization public AddEditionPatternParameter(ViewPointBuilder builder) { super(builder); } public AddEditionPatternParameter(EditionSchemeParameter param) { super(null); this.param = param; BD = new BindingDefinition(param.getName(), param.getType(), BindingDefinitionType.GET, true); } public EditionSchemeParameter getParameter() { return param; } @Override public EditionPattern getEditionPattern() { if (param != null) { return param.getEditionPattern(); } return null; } @Override public EditionScheme getEditionScheme() { if (param != null) { return param.getEditionScheme(); } return null; } public ViewPointDataBinding getValue() { if (value == null) { value = new ViewPointDataBinding(this, param, getBindingDefinition()); } if (value.getBindingDefinition() == null) { value.setBindingDefinition(getBindingDefinition()); } return value; } public void setValue(ViewPointDataBinding value) { if (value != null) { value.setOwner(this); value.setBindingAttribute(param); value.setBindingDefinition(getBindingDefinition()); } this.value = value; } public Object evaluateParameterValue(EditionSchemeAction action) { if (getValue() == null || getValue().isUnset()) { /*logger.info("Le binding for " + param.getName() + " is not set"); if (param instanceof URIParameter) { logger.info("C'est une URI, de base " + ((URIParameter) param).getBaseURI()); logger.info("Je retourne " + ((URIParameter) param).getBaseURI().getBinding().getBindingValue(action)); return ((URIParameter) param).getBaseURI().getBinding().getBindingValue(action); } else if (param.getDefaultValue() != null && param.getDefaultValue().isSet() && param.getDefaultValue().isValid()) { return param.getDefaultValue().getBinding().getBindingValue(action); } if (param.getIsRequired()) { logger.warning("Required parameter missing: " + param + ", some strange behaviour may happen from now..."); }*/ return null; } else if (getValue().isValid()) { return getValue().getBindingValue(action); } else { logger.warning("Invalid binding: " + getValue()); getValue().getBinding().debugIsBindingValid(); } return null; } public BindingDefinition getBindingDefinition() { if (BD == null && getParam() != null) { BD = new BindingDefinition(getParam().getName(), getParam().getType(), BindingDefinitionType.GET, true); } return BD; } @Override public String getInspectorName() { // TODO Auto-generated method stub return null; } @Override public BindingModel getBindingModel() { if (getAction() != null) { return getAction().getBindingModel(); } return null; } @Override public ViewPoint getViewPoint() { if (getAction() != null) { return getAction().getViewPoint(); } return null; } public AddEditionPattern getAction() { return action; } public void setAction(AddEditionPattern action) { this.action = action; } public EditionSchemeParameter getParam() { if (param == null && paramName != null && getAction() != null && getAction().getCreationScheme() != null) { param = getAction().getCreationScheme().getParameter(paramName); } return param; } public String _getParamName() { if (param != null) { return param.getName(); } return paramName; } public void _setParamName(String param) { this.paramName = param; } } @Override public Type getAssignableType() { return getEditionPatternType(); } public static class AddEditionPatternMustAddressACreationScheme extends ValidationRule<AddEditionPatternMustAddressACreationScheme, AddEditionPattern> { public AddEditionPatternMustAddressACreationScheme() { super(AddEditionPattern.class, "add_edition_pattern_action_must_address_a_valid_creation_scheme"); } @Override public ValidationIssue<AddEditionPatternMustAddressACreationScheme, AddEditionPattern> applyValidation(AddEditionPattern action) { if (action.getCreationScheme() == null) { if (action.getEditionPatternType() == null) { return new ValidationError<AddEditionPatternMustAddressACreationScheme, AddEditionPattern>(this, action, "add_edition_pattern_action_doesn't_define_any_edition_pattern"); } else { return new ValidationError<AddEditionPatternMustAddressACreationScheme, AddEditionPattern>(this, action, "add_edition_pattern_action_doesn't_define_any_creation_scheme"); } } return null; } } public static class AddEditionPatternParametersMustBeValid extends ValidationRule<AddEditionPatternParametersMustBeValid, AddEditionPattern> { public AddEditionPatternParametersMustBeValid() { super(AddEditionPattern.class, "add_edition_pattern_parameters_must_be_valid"); } @Override public ValidationIssue<AddEditionPatternParametersMustBeValid, AddEditionPattern> applyValidation(AddEditionPattern action) { if (action.getCreationScheme() != null) { Vector<ValidationIssue<AddEditionPatternParametersMustBeValid, AddEditionPattern>> issues = new Vector<ValidationIssue<AddEditionPatternParametersMustBeValid, AddEditionPattern>>(); for (AddEditionPatternParameter p : action.getParameters()) { if (p.getParam().getIsRequired()) { if (p.getValue() == null || !p.getValue().isSet()) { if (p.getParam() instanceof URIParameter && ((URIParameter) p.getParam()).getBaseURI().isSet() && ((URIParameter) p.getParam()).getBaseURI().isValid()) { // Special case, we will find a way to manage this } else { issues.add(new ValidationError(this, action, "parameter_s_value_is_not_defined: " + p.getParam().getName())); } } else if (!p.getValue().isValid()) { logger.info("Binding NOT valid: " + p.getValue() + " for " + p.paramName + " object=" + p.action.getFullyQualifiedName() + ". Reason follows."); p.getValue().getBinding().debugIsBindingValid(); issues.add(new ValidationError(this, action, "parameter_s_value_is_not_valid: " + p.getParam().getName())); } } } if (issues.size() == 0) { return null; } else if (issues.size() == 1) { return issues.firstElement(); } else { return new CompoundIssue<AddEditionPattern.AddEditionPatternParametersMustBeValid, AddEditionPattern>(action, issues); } } return null; } } public static class ViewBindingIsRequiredAndMustBeValid extends BindingIsRequiredAndMustBeValid<AddEditionPattern> { public ViewBindingIsRequiredAndMustBeValid() { super("'view'_binding_is_not_valid", AddEditionPattern.class); } @Override public ViewPointDataBinding getBinding(AddEditionPattern object) { return object.getView(); } @Override public BindingDefinition getBindingDefinition(AddEditionPattern object) { return object.getViewBindingDefinition(); } } }