/*
* (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.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Vector;
import java.util.logging.Logger;
import org.openflexo.antar.binding.BindingModel;
import org.openflexo.antar.binding.CustomType;
import org.openflexo.antar.binding.TypeUtils;
import org.openflexo.foundation.Inspectors;
import org.openflexo.foundation.resource.FlexoResourceCenter;
import org.openflexo.foundation.validation.FixProposal;
import org.openflexo.foundation.validation.ValidationIssue;
import org.openflexo.foundation.validation.ValidationRule;
import org.openflexo.foundation.validation.ValidationWarning;
import org.openflexo.foundation.viewpoint.ViewPoint.ViewPointBuilder;
import org.openflexo.foundation.viewpoint.binding.PatternRolePathElement;
import org.openflexo.foundation.viewpoint.binding.ViewPointDataBinding;
import org.openflexo.foundation.viewpoint.dm.EditionSchemeInserted;
import org.openflexo.foundation.viewpoint.dm.EditionSchemeRemoved;
import org.openflexo.foundation.viewpoint.dm.PatternRoleInserted;
import org.openflexo.foundation.viewpoint.dm.PatternRoleRemoved;
import org.openflexo.foundation.viewpoint.inspector.EditionPatternInspector;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.logging.FlexoLogger;
import org.openflexo.toolbox.StringUtils;
import org.openflexo.xmlcode.StringConvertable;
import org.openflexo.xmlcode.StringEncoder;
public class EditionPattern extends EditionPatternObject implements StringConvertable<EditionPattern>, CustomType {
protected static final Logger logger = FlexoLogger.getLogger(EditionPattern.class.getPackage().getName());
private String name;
private Vector<PatternRole> patternRoles;
private Vector<EditionScheme> editionSchemes;
private EditionPatternInspector inspector;
private OntologicObjectPatternRole primaryConceptRole;
private GraphicalElementPatternRole primaryRepresentationRole;
private ViewPoint _viewPoint;
private EditionPattern parentEditionPattern = null;
private Vector<EditionPattern> childEditionPatterns = new Vector<EditionPattern>();
@Override
public String getDescription() {
// TODO Auto-generated method stub
return super.getDescription();
}
public EditionPattern(ViewPointBuilder builder) {
super(builder);
patternRoles = new Vector<PatternRole>();
editionSchemes = new Vector<EditionScheme>();
if (builder != null) {
setViewPoint(builder.getViewPoint());
}
}
@Override
public EditionPattern getEditionPattern() {
return this;
}
@Override
public void delete() {
delete(false);
}
public void delete(boolean deleteChildren) {
if (getViewPoint() != null) {
getViewPoint().removeFromEditionPatterns(this);
}
for (EditionPattern child : new ArrayList<EditionPattern>(getChildEditionPatterns())) {
if (deleteChildren) {
child.delete(deleteChildren);
} else {
child.setParentEditionPattern(null);
}
}
super.delete();
deleteObservers();
}
@Override
public String getFullyQualifiedName() {
return (getViewPoint() != null ? getViewPoint().getFullyQualifiedName() : "null") + "#" + getName();
}
@Override
public String getURI() {
return getViewPoint().getURI() + "#" + getName();
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
if (name != null) {
// We prevent ',' so that we can use it as a delimiter in tags.
name = name.replace(",", "");
}
this.name = name;
}
public EditionScheme getEditionScheme(String editionSchemeName) {
for (EditionScheme es : editionSchemes) {
if (es.getName().equals(editionSchemeName)) {
return es;
}
}
logger.warning("Not found EditionScheme:" + editionSchemeName);
return null;
}
public Vector<EditionScheme> getEditionSchemes() {
return editionSchemes;
}
public void setEditionSchemes(Vector<EditionScheme> someEditionScheme) {
editionSchemes = someEditionScheme;
}
public void addToEditionSchemes(EditionScheme anEditionScheme) {
anEditionScheme.setEditionPattern(this);
editionSchemes.add(anEditionScheme);
if (getViewPoint() != null) {
getViewPoint().notifyEditionSchemeModified();
}
setChanged();
notifyObservers(new EditionSchemeInserted(anEditionScheme, this));
}
public void removeFromEditionSchemes(EditionScheme anEditionScheme) {
anEditionScheme.setEditionPattern(null);
editionSchemes.remove(anEditionScheme);
if (getViewPoint() != null) {
getViewPoint().notifyEditionSchemeModified();
}
setChanged();
notifyObservers(new EditionSchemeRemoved(anEditionScheme, this));
}
public Vector<PatternRole> getPatternRoles() {
return patternRoles;
}
public void setPatternRoles(Vector<PatternRole> somePatternRole) {
patternRoles = somePatternRole;
availablePatternRoleNames = null;
}
public void addToPatternRoles(PatternRole aPatternRole) {
availablePatternRoleNames = null;
aPatternRole.setEditionPattern(this);
patternRoles.add(aPatternRole);
setChanged();
notifyObservers(new PatternRoleInserted(aPatternRole, this));
if (_bindingModel != null) {
updateBindingModel();
}
}
public void removeFromPatternRoles(PatternRole aPatternRole) {
availablePatternRoleNames = null;
aPatternRole.setEditionPattern(null);
patternRoles.remove(aPatternRole);
setChanged();
notifyObservers(new PatternRoleRemoved(aPatternRole, this));
if (_bindingModel != null) {
updateBindingModel();
}
}
public <R> List<R> getPatternRoles(Class<R> type) {
List<R> returned = new ArrayList<R>();
for (PatternRole r : patternRoles) {
if (TypeUtils.isTypeAssignableFrom(type, r.getClass())) {
returned.add((R) r);
}
}
return returned;
}
public List<IndividualPatternRole> getIndividualPatternRoles() {
return getPatternRoles(IndividualPatternRole.class);
}
public List<ClassPatternRole> getClassPatternRoles() {
return getPatternRoles(ClassPatternRole.class);
}
public List<ObjectPropertyStatementPatternRole> getObjectPropertyStatementPatternRoles() {
return getPatternRoles(ObjectPropertyStatementPatternRole.class);
}
public List<DataPropertyStatementPatternRole> getDataPropertyStatementPatternRoles() {
return getPatternRoles(DataPropertyStatementPatternRole.class);
}
public List<GraphicalElementPatternRole> getGraphicalElementPatternRoles() {
return getPatternRoles(GraphicalElementPatternRole.class);
}
public List<ShapePatternRole> getShapePatternRoles() {
return getPatternRoles(ShapePatternRole.class);
}
public List<ConnectorPatternRole> getConnectorPatternRoles() {
return getPatternRoles(ConnectorPatternRole.class);
}
public ShapePatternRole getDefaultShapePatternRole() {
List<ShapePatternRole> l = getShapePatternRoles();
if (l.size() > 0) {
return l.get(0);
}
return null;
}
public ConnectorPatternRole getDefaultConnectorPatternRole() {
List<ConnectorPatternRole> l = getConnectorPatternRoles();
if (l.size() > 0) {
return l.get(0);
}
return null;
}
private Vector<String> availablePatternRoleNames = null;
public Vector<String> getAvailablePatternRoleNames() {
if (availablePatternRoleNames == null) {
availablePatternRoleNames = new Vector<String>();
for (PatternRole r : getPatternRoles()) {
availablePatternRoleNames.add(r.getName());
}
}
return availablePatternRoleNames;
}
public String getAvailableRoleName(String baseName) {
String testName = baseName;
int index = 2;
while (getPatternRole(testName) != null) {
testName = baseName + index;
index++;
}
return testName;
}
public PatternRole createShapePatternRole() {
ShapePatternRole newPatternRole = new ShapePatternRole(null);
newPatternRole.setPatternRoleName(getAvailableRoleName("shape"));
addToPatternRoles(newPatternRole);
return newPatternRole;
}
public ConnectorPatternRole createConnectorPatternRole() {
ConnectorPatternRole newPatternRole = new ConnectorPatternRole(null);
newPatternRole.setPatternRoleName(getAvailableRoleName("connector"));
addToPatternRoles(newPatternRole);
return newPatternRole;
}
public DiagramPatternRole createDiagramPatternRole() {
DiagramPatternRole newPatternRole = new DiagramPatternRole(null);
newPatternRole.setPatternRoleName(getAvailableRoleName("diagram"));
addToPatternRoles(newPatternRole);
return newPatternRole;
}
public FlexoModelObjectPatternRole createFlexoModelObjectPatternRole() {
FlexoModelObjectPatternRole newPatternRole = new FlexoModelObjectPatternRole(null);
newPatternRole.setPatternRoleName(getAvailableRoleName("flexoObject"));
addToPatternRoles(newPatternRole);
return newPatternRole;
}
public EditionPatternPatternRole createEditionPatternPatternRole() {
EditionPatternPatternRole newPatternRole = new EditionPatternPatternRole(null);
newPatternRole.setPatternRoleName(getAvailableRoleName("editionPattern"));
addToPatternRoles(newPatternRole);
return newPatternRole;
}
public ClassPatternRole createClassPatternRole() {
ClassPatternRole newPatternRole = new ClassPatternRole(null);
newPatternRole.setPatternRoleName(getAvailableRoleName("class"));
addToPatternRoles(newPatternRole);
return newPatternRole;
}
public IndividualPatternRole createIndividualPatternRole() {
IndividualPatternRole newPatternRole = new IndividualPatternRole(null);
newPatternRole.setPatternRoleName(getAvailableRoleName("individual"));
addToPatternRoles(newPatternRole);
return newPatternRole;
}
public PropertyPatternRole createPropertyPatternRole() {
PropertyPatternRole newPatternRole = new PropertyPatternRole(null);
newPatternRole.setPatternRoleName(getAvailableRoleName("property"));
addToPatternRoles(newPatternRole);
return newPatternRole;
}
public ObjectPropertyPatternRole createObjectPropertyPatternRole() {
ObjectPropertyPatternRole newPatternRole = new ObjectPropertyPatternRole(null);
newPatternRole.setPatternRoleName(getAvailableRoleName("property"));
addToPatternRoles(newPatternRole);
return newPatternRole;
}
public DataPropertyPatternRole createDataPropertyPatternRole() {
DataPropertyPatternRole newPatternRole = new DataPropertyPatternRole(null);
newPatternRole.setPatternRoleName(getAvailableRoleName("property"));
addToPatternRoles(newPatternRole);
return newPatternRole;
}
public IsAStatementPatternRole createIsAStatementPatternRole() {
IsAStatementPatternRole newPatternRole = new IsAStatementPatternRole(null);
newPatternRole.setPatternRoleName(getAvailableRoleName("fact"));
addToPatternRoles(newPatternRole);
return newPatternRole;
}
public ObjectPropertyStatementPatternRole createObjectPropertyStatementPatternRole() {
ObjectPropertyStatementPatternRole newPatternRole = new ObjectPropertyStatementPatternRole(null);
newPatternRole.setPatternRoleName(getAvailableRoleName("fact"));
addToPatternRoles(newPatternRole);
return newPatternRole;
}
public DataPropertyStatementPatternRole createDataPropertyStatementPatternRole() {
DataPropertyStatementPatternRole newPatternRole = new DataPropertyStatementPatternRole(null);
newPatternRole.setPatternRoleName(getAvailableRoleName("fact"));
addToPatternRoles(newPatternRole);
return newPatternRole;
}
public RestrictionStatementPatternRole createRestrictionStatementPatternRole() {
RestrictionStatementPatternRole newPatternRole = new RestrictionStatementPatternRole(null);
newPatternRole.setPatternRoleName(getAvailableRoleName("fact"));
addToPatternRoles(newPatternRole);
return newPatternRole;
}
public PrimitivePatternRole createPrimitivePatternRole() {
PrimitivePatternRole newPatternRole = new PrimitivePatternRole(null);
newPatternRole.setPatternRoleName(getAvailableRoleName("primitive"));
addToPatternRoles(newPatternRole);
return newPatternRole;
}
public PatternRole deletePatternRole(PatternRole aPatternRole) {
removeFromPatternRoles(aPatternRole);
aPatternRole.delete();
return aPatternRole;
}
public PatternRole getPatternRole(String patternRole) {
for (PatternRole pr : patternRoles) {
if (pr.getPatternRoleName() != null && pr.getPatternRoleName().equals(patternRole)) {
return pr;
}
}
return null;
}
public Vector<DropScheme> getDropSchemes() {
Vector<DropScheme> returned = new Vector<DropScheme>();
for (EditionScheme es : getEditionSchemes()) {
if (es instanceof DropScheme) {
returned.add((DropScheme) es);
}
}
return returned;
}
public Vector<LinkScheme> getLinkSchemes() {
Vector<LinkScheme> returned = new Vector<LinkScheme>();
for (EditionScheme es : getEditionSchemes()) {
if (es instanceof LinkScheme) {
returned.add((LinkScheme) es);
}
}
return returned;
}
public Vector<AbstractActionScheme> getAbstractActionSchemes() {
Vector<AbstractActionScheme> returned = new Vector<AbstractActionScheme>();
for (EditionScheme es : getEditionSchemes()) {
if (es instanceof AbstractActionScheme) {
returned.add((AbstractActionScheme) es);
}
}
return returned;
}
public Vector<ActionScheme> getActionSchemes() {
Vector<ActionScheme> returned = new Vector<ActionScheme>();
for (EditionScheme es : getEditionSchemes()) {
if (es instanceof ActionScheme) {
returned.add((ActionScheme) es);
}
}
return returned;
}
public Vector<DeletionScheme> getDeletionSchemes() {
Vector<DeletionScheme> returned = new Vector<DeletionScheme>();
for (EditionScheme es : getEditionSchemes()) {
if (es instanceof DeletionScheme) {
returned.add((DeletionScheme) es);
}
}
return returned;
}
public Vector<NavigationScheme> getNavigationSchemes() {
Vector<NavigationScheme> returned = new Vector<NavigationScheme>();
for (EditionScheme es : getEditionSchemes()) {
if (es instanceof NavigationScheme) {
returned.add((NavigationScheme) es);
}
}
return returned;
}
public Vector<AbstractCreationScheme> getAbstractCreationSchemes() {
Vector<AbstractCreationScheme> returned = new Vector<AbstractCreationScheme>();
for (EditionScheme es : getEditionSchemes()) {
if (es instanceof AbstractCreationScheme) {
returned.add((AbstractCreationScheme) es);
}
}
return returned;
}
public Vector<CreationScheme> getCreationSchemes() {
Vector<CreationScheme> returned = new Vector<CreationScheme>();
for (EditionScheme es : getEditionSchemes()) {
if (es instanceof CreationScheme) {
returned.add((CreationScheme) es);
}
}
return returned;
}
public boolean hasDropScheme() {
for (EditionScheme es : getEditionSchemes()) {
if (es instanceof DropScheme) {
return true;
}
}
return false;
}
public boolean hasLinkScheme() {
for (EditionScheme es : getEditionSchemes()) {
if (es instanceof LinkScheme) {
return true;
}
}
return false;
}
public boolean hasActionScheme() {
for (EditionScheme es : getEditionSchemes()) {
if (es instanceof ActionScheme) {
return true;
}
}
return false;
}
public boolean hasNavigationScheme() {
for (EditionScheme es : getEditionSchemes()) {
if (es instanceof NavigationScheme) {
return true;
}
}
return false;
}
public CreationScheme createCreationScheme() {
CreationScheme newCreationScheme = new CreationScheme(null);
newCreationScheme.setName("creation");
addToEditionSchemes(newCreationScheme);
return newCreationScheme;
}
public CloningScheme createCloningScheme() {
CloningScheme newCloningScheme = new CloningScheme(null);
newCloningScheme.setName("clone");
addToEditionSchemes(newCloningScheme);
return newCloningScheme;
}
public DropScheme createDropScheme() {
DropScheme newDropScheme = new DropScheme(null);
newDropScheme.setName("drop");
addToEditionSchemes(newDropScheme);
return newDropScheme;
}
public LinkScheme createLinkScheme() {
LinkScheme newLinkScheme = new LinkScheme(null);
newLinkScheme.setName("link");
addToEditionSchemes(newLinkScheme);
return newLinkScheme;
}
public ActionScheme createActionScheme() {
ActionScheme newActionScheme = new ActionScheme(null);
newActionScheme.setName("action");
addToEditionSchemes(newActionScheme);
return newActionScheme;
}
public NavigationScheme createNavigationScheme() {
NavigationScheme newNavigationScheme = new NavigationScheme(null);
newNavigationScheme.setName("navigation");
addToEditionSchemes(newNavigationScheme);
return newNavigationScheme;
}
public DeletionScheme createDeletionScheme() {
DeletionScheme newDeletionScheme = generateDefaultDeletionScheme();
return newDeletionScheme;
}
public EditionScheme deleteEditionScheme(EditionScheme editionScheme) {
removeFromEditionSchemes(editionScheme);
editionScheme.delete();
return editionScheme;
}
public DeletionScheme getDefaultDeletionScheme() {
if (getDeletionSchemes().size() > 0) {
return getDeletionSchemes().firstElement();
}
return null;
}
public DeletionScheme generateDefaultDeletionScheme() {
DeletionScheme newDeletionScheme = new DeletionScheme(null);
newDeletionScheme.setName("deletion");
Vector<PatternRole> rolesToDelete = new Vector<PatternRole>();
for (PatternRole pr : getPatternRoles()) {
if (pr instanceof GraphicalElementPatternRole || pr instanceof IndividualPatternRole || pr instanceof StatementPatternRole) {
rolesToDelete.add(pr);
}
}
Collections.sort(rolesToDelete, new Comparator<PatternRole>() {
@Override
public int compare(PatternRole o1, PatternRole o2) {
if (o1 instanceof ShapePatternRole && o2 instanceof ConnectorPatternRole) {
return 1;
} else if (o1 instanceof ConnectorPatternRole && o2 instanceof ShapePatternRole) {
return -1;
}
if (o1 instanceof ShapePatternRole) {
if (o2 instanceof ShapePatternRole) {
if (((ShapePatternRole) o1).isEmbeddedIn((ShapePatternRole) o2)) {
return -1;
}
if (((ShapePatternRole) o2).isEmbeddedIn((ShapePatternRole) o1)) {
return 1;
}
return 0;
}
}
return 0;
}
});
for (PatternRole pr : rolesToDelete) {
DeleteAction a = new DeleteAction(null);
a.setObject(new ViewPointDataBinding(pr.getPatternRoleName()));
newDeletionScheme.addToActions(a);
}
addToEditionSchemes(newDeletionScheme);
return newDeletionScheme;
}
public EditionPatternInspector getInspector() {
if (inspector == null) {
inspector = EditionPatternInspector.makeEditionPatternInspector(this);
}
return inspector;
}
public void setInspector(EditionPatternInspector inspector) {
inspector.setEditionPattern(this);
this.inspector = inspector;
}
@Override
public ViewPoint getViewPoint() {
return _viewPoint;
}
public void setViewPoint(ViewPoint viewPoint) {
_viewPoint = viewPoint;
}
@Deprecated
public void setCalc(ViewPoint viewPoint) {
setViewPoint(viewPoint);
}
@Override
public String getInspectorName() {
return Inspectors.VPM.EDITION_PATTERN_INSPECTOR;
}
public static class EditionPatternConverter extends StringEncoder.Converter<EditionPattern> {
private final FlexoResourceCenter _resourceCenter;
public EditionPatternConverter(FlexoResourceCenter resourceCenter) {
super(EditionPattern.class);
_resourceCenter = resourceCenter;
}
@Override
public EditionPattern convertFromString(String value) {
return _resourceCenter.retrieveViewPointLibrary().getEditionPattern(value);
}
@Override
public String convertToString(EditionPattern value) {
return value.getViewPoint().getViewPointURI() + "#" + value.getName();
}
}
@Override
public EditionPatternConverter getConverter() {
return getViewPointLibrary().editionPatternConverter;
/*if (getProject()!=null)
return getProject().getEditionPatternConverter();
return null;*/
}
/* public EditionAction getAction(String patternRole)
{
return getEditionScheme().getAction(patternRole);
}
public AddShape getAddShapeAction(String patternRole)
{
return getEditionScheme().getAddShapeAction(patternRole);
}
public AddShemaElementAction getAddShemaElementAction(String patternRole)
{
return getEditionScheme().getAddShemaElementAction(patternRole);
}
public AddClass getAddClassAction(String patternRole)
{
return getEditionScheme().getAddClassAction(patternRole);
}
public AddIndividual getAddIndividualAction(String patternRole)
{
return getEditionScheme().getAddIndividualAction(patternRole);
}
public AddConnector getAddConnectorAction(String patternRole)
{
return getEditionScheme().getAddConnectorAction(patternRole);
}
*/
@Override
public String toString() {
return "EditionPattern:" + getName();
}
public void finalizeEditionPatternDeserialization() {
createBindingModel();
for (EditionScheme es : getEditionSchemes()) {
es.finalizeEditionSchemeDeserialization();
}
for (PatternRole pr : getPatternRoles()) {
pr.finalizePatternRoleDeserialization();
}
}
public void finalizeParentEditionPatternDeserialization() {
if (StringUtils.isNotEmpty(parentEditionPatternURI)) {
setParentEditionPattern(getParentEditionPattern());
}
}
public void debug() {
System.out.println(getXMLRepresentation());
}
public void save() {
getViewPoint().save();
}
private BindingModel _bindingModel;
@Override
public BindingModel getBindingModel() {
if (_bindingModel == null) {
createBindingModel();
}
return _bindingModel;
}
public void updateBindingModel() {
logger.fine("updateBindingModel()");
_bindingModel = null;
createBindingModel();
for (EditionScheme es : getEditionSchemes()) {
es.updateBindingModels();
}
}
private void createBindingModel() {
_bindingModel = new BindingModel();
for (PatternRole role : getPatternRoles()) {
_bindingModel.addToBindingVariables(PatternRolePathElement.makePatternRolePathElement(role, this));
}
notifyBindingModelChanged();
}
@Override
public void notifyBindingModelChanged() {
super.notifyBindingModelChanged();
// SGU: as all pattern roles share the edition pattern binding model, they should
// all notify change of their binding models
for (PatternRole pr : getPatternRoles()) {
pr.notifyBindingModelChanged();
}
getInspector().notifyBindingModelChanged();
}
public OntologicObjectPatternRole getDefaultPrimaryConceptRole() {
List<OntologicObjectPatternRole> roles = getPatternRoles(OntologicObjectPatternRole.class);
if (roles.size() > 0) {
return roles.get(0);
}
return null;
}
public GraphicalElementPatternRole getDefaultPrimaryRepresentationRole() {
List<GraphicalElementPatternRole> roles = getPatternRoles(GraphicalElementPatternRole.class);
if (roles.size() > 0) {
return roles.get(0);
}
return null;
}
public OntologicObjectPatternRole getPrimaryConceptRole() {
if (primaryConceptRole == null) {
return getDefaultPrimaryConceptRole();
}
return primaryConceptRole;
}
public void setPrimaryConceptRole(OntologicObjectPatternRole primaryConceptRole) {
this.primaryConceptRole = primaryConceptRole;
}
public GraphicalElementPatternRole getPrimaryRepresentationRole() {
if (primaryRepresentationRole == null) {
return getDefaultPrimaryRepresentationRole();
}
return primaryRepresentationRole;
}
public void setPrimaryRepresentationRole(GraphicalElementPatternRole primaryRepresentationRole) {
this.primaryRepresentationRole = primaryRepresentationRole;
}
@Override
public String simpleRepresentation() {
return "EditionPattern:" + FlexoLocalization.localizedForKey(getLocalizedDictionary(), getName());
}
@Override
public String fullQualifiedRepresentation() {
return simpleRepresentation();
}
@Override
public Class getBaseClass() {
return EditionPattern.class;
}
@Override
public boolean isTypeAssignableFrom(Type aType, boolean permissive) {
return aType == this;
}
/**
* Duplicates this EditionPattern, given a new name<br>
* Newly created EditionPattern is added to ViewPoint
*
* @param newName
* @return
*/
public EditionPattern duplicate(String newName) {
EditionPattern newEditionPattern = (EditionPattern) cloneUsingXMLMapping();
newEditionPattern.setName(newName);
getViewPoint().addToEditionPatterns(newEditionPattern);
return newEditionPattern;
}
public boolean isRoot() {
return getParentEditionPattern() == null;
}
private String parentEditionPatternURI;
public String getParentEditionPatternURI() {
if (getParentEditionPattern() != null) {
return getParentEditionPattern().getURI();
}
return parentEditionPatternURI;
}
public void _setParentEditionPatternURI(String aParentEditionPatternURI) {
parentEditionPatternURI = aParentEditionPatternURI;
}
public EditionPattern getParentEditionPattern() {
if (parentEditionPattern == null && StringUtils.isNotEmpty(parentEditionPatternURI)) {
if (getViewPointLibrary() != null) {
setParentEditionPattern(getViewPointLibrary().getEditionPattern(parentEditionPatternURI));
}
}
return parentEditionPattern;
}
public void setParentEditionPattern(EditionPattern aParentEP) {
if (this.parentEditionPattern != aParentEP) {
if (aParentEP == null) {
this.parentEditionPattern.childEditionPatterns.remove(this);
this.parentEditionPattern = aParentEP;
this.parentEditionPattern.setChanged();
this.parentEditionPattern.notifyObservers(new EditionPatternHierarchyChanged(this));
this.parentEditionPattern.notifyChange("childEditionPatterns", null, getChildEditionPatterns());
} else {
aParentEP.childEditionPatterns.add(this);
this.parentEditionPattern = aParentEP;
aParentEP.setChanged();
aParentEP.notifyObservers(new EditionPatternHierarchyChanged(this));
aParentEP.notifyChange("childEditionPatterns", null, getChildEditionPatterns());
}
if (getViewPoint() != null) {
getViewPoint().setChanged();
getViewPoint().notifyObservers(new EditionPatternHierarchyChanged(this));
getViewPoint().notifyChange("allRootEditionPatterns", null, getViewPoint().getAllRootEditionPatterns());
}
}
}
public Vector<EditionPattern> getChildEditionPatterns() {
return childEditionPatterns;
}
public boolean isAssignableFrom(EditionPattern editionPattern) {
if (editionPattern == this) {
return true;
}
if (editionPattern.getParentEditionPattern() != null) {
return isAssignableFrom(editionPattern.getParentEditionPattern());
}
return false;
}
@Override
public String getLanguageRepresentation() {
// Voir du cote de GeneratorFormatter pour formatter tout ca
StringBuilder sb = new StringBuilder();
sb.append("EditionPattern ").append(getName());
sb.append(" {").append(StringUtils.LINE_SEPARATOR);
sb.append(StringUtils.LINE_SEPARATOR);
for (PatternRole pr : getPatternRoles()) {
sb.append(pr.getLanguageRepresentation());
sb.append(StringUtils.LINE_SEPARATOR);
}
sb.append("}").append(StringUtils.LINE_SEPARATOR);
return sb.toString();
}
public static class EditionPatternShouldHaveRoles extends ValidationRule<EditionPatternShouldHaveRoles, EditionPattern> {
public EditionPatternShouldHaveRoles() {
super(EditionPattern.class, "edition_pattern_should_have_roles");
}
@Override
public ValidationIssue<EditionPatternShouldHaveRoles, EditionPattern> applyValidation(EditionPattern editionPattern) {
if (editionPattern.getPatternRoles().size() == 0) {
return new ValidationWarning<EditionPatternShouldHaveRoles, EditionPattern>(this, editionPattern,
"edition_pattern_role_has_no_role");
}
return null;
}
}
public static class EditionPatternShouldHaveEditionSchemes extends
ValidationRule<EditionPatternShouldHaveEditionSchemes, EditionPattern> {
public EditionPatternShouldHaveEditionSchemes() {
super(EditionPattern.class, "edition_pattern_should_have_edition_scheme");
}
@Override
public ValidationIssue<EditionPatternShouldHaveEditionSchemes, EditionPattern> applyValidation(EditionPattern editionPattern) {
if (editionPattern.getEditionSchemes().size() == 0) {
return new ValidationWarning<EditionPatternShouldHaveEditionSchemes, EditionPattern>(this, editionPattern,
"edition_pattern_has_no_edition_scheme");
}
return null;
}
}
public static class EditionPatternShouldHaveDeletionScheme extends
ValidationRule<EditionPatternShouldHaveDeletionScheme, EditionPattern> {
public EditionPatternShouldHaveDeletionScheme() {
super(EditionPattern.class, "edition_pattern_should_have_deletion_scheme");
}
@Override
public ValidationIssue<EditionPatternShouldHaveDeletionScheme, EditionPattern> applyValidation(EditionPattern editionPattern) {
if (editionPattern.getDeletionSchemes().size() == 0) {
CreateDefaultDeletionScheme fixProposal = new CreateDefaultDeletionScheme(editionPattern);
return new ValidationWarning<EditionPatternShouldHaveDeletionScheme, EditionPattern>(this, editionPattern,
"edition_pattern_has_no_deletion_scheme", fixProposal);
}
return null;
}
protected static class CreateDefaultDeletionScheme extends FixProposal<EditionPatternShouldHaveDeletionScheme, EditionPattern> {
private EditionPattern editionPattern;
private DeletionScheme newDefaultDeletionScheme;
public CreateDefaultDeletionScheme(EditionPattern anEditionPattern) {
super("create_default_deletion_scheme");
this.editionPattern = anEditionPattern;
}
public EditionPattern getEditionPattern() {
return editionPattern;
}
public DeletionScheme getDeletionScheme() {
return newDefaultDeletionScheme;
}
@Override
protected void fixAction() {
newDefaultDeletionScheme = editionPattern.createDeletionScheme();
// AddIndividual action = getObject();
// action.setAssignation(new ViewPointDataBinding(patternRole.getPatternRoleName()));
}
}
}
}