package org.enhydra.jawe.base.panel;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.enhydra.jawe.JaWEManager;
import org.enhydra.jawe.ResourceManager;
import org.enhydra.jawe.Settings;
import org.enhydra.jawe.base.panel.panels.XMLBasicPanel;
import org.enhydra.jawe.base.panel.panels.XMLGroupPanel;
import org.enhydra.jawe.base.panel.panels.XMLPanel;
import org.enhydra.jawe.base.panel.panels.XMLTabbedPanel;
import org.enhydra.jawe.base.transitionhandler.TransitionHandler;
import org.enhydra.shark.xpdl.XMLAttribute;
import org.enhydra.shark.xpdl.XMLCollection;
import org.enhydra.shark.xpdl.XMLCollectionElement;
import org.enhydra.shark.xpdl.XMLComplexChoice;
import org.enhydra.shark.xpdl.XMLComplexElement;
import org.enhydra.shark.xpdl.XMLElement;
import org.enhydra.shark.xpdl.XMLSimpleElement;
import org.enhydra.shark.xpdl.XMLUtil;
import org.enhydra.shark.xpdl.XPDLConstants;
import org.enhydra.shark.xpdl.XPDLValidationErrorIds;
import org.enhydra.shark.xpdl.elements.*;
import org.enhydra.shark.xpdl.elements.Package;
/**
* Class used to validate panels for all XPDL entities.
*
* @author Sasa Bojanic
*/
public class StandardPanelValidator implements PanelValidator {
protected Properties properties;
public void configure(Properties props) throws Exception {
this.properties = props;
}
public boolean validatePanel(Activities el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Activity el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ActivitySet el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ActivitySets el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ActivityTypes el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ActualParameter el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ActualParameters el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Application el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Applications el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ApplicationTypes el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ArrayType el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Author el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Automatic el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(BasicType el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(BlockActivity el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Codepage el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Condition el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ConformanceClass el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Cost el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(CostUnit el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Countrykey el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Created el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(DataField el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(DataFields el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(DataType el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(DataTypes el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Deadline el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(DeadlineCondition el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Deadlines el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(DeclaredType el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Description el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Documentation el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Duration el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(EnumerationType el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(EnumerationValue el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ExceptionName el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ExtendedAttribute el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ExtendedAttributes el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ExternalPackage el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ExternalPackages el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ExternalReference el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(FinishMode el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(FormalParameter el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(FormalParameters el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Icon el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Implementation el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ImplementationTypes el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(InitialValue el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Join el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Length el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Limit el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ListType el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Manual el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Member el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Namespace el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Namespaces el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(No el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(org.enhydra.shark.xpdl.elements.Package el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(PackageHeader el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Participant el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Participants el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ParticipantType el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Performer el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Priority el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(PriorityUnit el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ProcessHeader el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(RecordType el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(RedefinableHeader el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Responsible el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Responsibles el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Route el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(SchemaType el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Script el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(SimulationInformation el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Split el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(StartFinishModes el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(StartMode el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(SubFlow el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(TimeEstimation el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Tool el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Tools el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Transition el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(TransitionRef el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(TransitionRefs el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(TransitionRestriction el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(TransitionRestrictions el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Transitions el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(TypeDeclaration el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(TypeDeclarations el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(UnionType el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ValidFrom el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(ValidTo el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Vendor el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(Version el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(WaitingTime el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(WorkflowProcess el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(WorkflowProcesses el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(WorkingTime el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(XPDLVersion el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(XMLComplexChoice el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(XMLCollection el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(XMLCollectionElement el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(XMLComplexElement el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(XMLSimpleElement el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(XMLAttribute el, XMLPanel panel) {
return standardPanelValidation(el, panel);
}
public boolean validatePanel(XMLElement el, XMLPanel panel) {
try {
Class cl = el.getClass();
Method m = null;
try {
m = this.getClass().getMethod("validatePanel", new Class[]{cl, XMLPanel.class});
} catch (Exception ex) {
if (!(cl == XMLSimpleElement.class || cl == XMLAttribute.class || cl == XMLComplexChoice.class || cl == XMLComplexElement.class || cl == XMLCollectionElement.class || cl == XMLCollection.class)) {
if (XMLComplexChoice.class.isAssignableFrom(cl)) {
cl = XMLComplexChoice.class;
} else if (XMLAttribute.class.isAssignableFrom(cl)) {
cl = XMLAttribute.class;
} else if (XMLSimpleElement.class.isAssignableFrom(cl)) {
cl = XMLSimpleElement.class;
} else if (XMLComplexElement.class.isAssignableFrom(cl)) {
cl = XMLComplexElement.class;
} else if (XMLCollection.class.isAssignableFrom(cl)) {
cl = XMLCollection.class;
}
}
}
m = this.getClass().getMethod("validatePanel", new Class[]{cl, XMLPanel.class});
return ((Boolean) m.invoke(this, new Object[]{el, panel})).booleanValue();
} catch (Throwable e) {
e.printStackTrace();
}
return standardPanelValidation(el, panel);
}
public boolean standardPanelValidation(XMLElement el, XMLPanel panel) {
boolean idValidation = false;
//CUSTOM
boolean nameValidation = false;
if (el instanceof Tool) {
idValidation = false;
nameValidation = false;
} else if (el instanceof XMLCollectionElement || el instanceof Package) {
idValidation = true;
nameValidation = true;
} else if (el instanceof XMLAttribute && el.toName().equals("Id") && (el.getParent() instanceof XMLCollectionElement || el.getParent() instanceof Package)) {
idValidation = true;
} else if (el instanceof XMLAttribute && el.toName().equals("Name") && (el.getParent() instanceof XMLCollectionElement || el.getParent() instanceof Package)) {
nameValidation = true;
}
if (idValidation) {
if (!validateId(panel, el)) {
return false;
}
}
if (nameValidation) {
if (!validateName(panel, el)) {
return false;
}
}
//END CUSTOM
if (el instanceof Transition || el instanceof Condition || el.getParent() instanceof Transition || el.getParent() instanceof Condition) {
if (!validateTransition(panel, el)) {
return false;
}
}
return true;
}
protected boolean validateId(XMLPanel pnl, XMLElement el) {
XMLComplexElement cel = null;
String newId = null;
XMLPanel idPanel = null;
if (el instanceof XMLAttribute) {
XMLElement parent = el.getParent();
if (parent instanceof XMLCollectionElement) {
cel = (XMLCollectionElement) parent;
newId = cel.get("Id").toValue();
if (pnl.getValue() instanceof String) {
newId = ((String) pnl.getValue()).trim();
idPanel = pnl;
}
} else if (parent instanceof Package) {
cel = (Package) parent;
newId = cel.get("Id").toValue();
if (pnl.getValue() instanceof String) {
newId = ((String) pnl.getValue()).trim();
idPanel = pnl;
}
}
} else if (el instanceof XMLComplexElement) {
cel = (XMLComplexElement) el;
newId = cel.get("Id").toValue();
idPanel = findPanel(pnl, cel.get("Id"));
if (idPanel != null) {
if (idPanel.getValue() instanceof String) {
newId = ((String) idPanel.getValue()).trim();
}
}
}
System.err.println("Valid for " + el + ", par=" + el.getParent() + ", newid=" + newId + ", idp=" + idPanel);
boolean isValid = XMLUtil.isIdValid(newId);
//check for period (.)
if(isValid && newId.contains(".")){
isValid = false;
}
if (!isValid) {
XMLBasicPanel.errorMessage(pnl.getWindow(), ResourceManager.getLanguageDependentString("ErrorMessageKey"), "",
ResourceManager.getLanguageDependentString(XPDLValidationErrorIds.ERROR_INVALID_ID));
idPanel.requestFocus();
return false;
}
if (cel != null) {
boolean isUniqueId = true;
if (cel instanceof XMLCollectionElement) {
isUniqueId = JaWEManager.getInstance().getIdFactory().isIdUnique((XMLCollectionElement) cel, newId);
} else {
Package fp = JaWEManager.getInstance().getXPDLHandler().getPackageById(newId);
if (fp != null && fp != cel && fp.getId().equals(newId)) {
isUniqueId = false;
}
}
if (!isUniqueId) {
XMLBasicPanel.errorMessage(pnl.getWindow(), ResourceManager.getLanguageDependentString("ErrorMessageKey"),
"", ResourceManager.getLanguageDependentString(XPDLValidationErrorIds.ERROR_NON_UNIQUE_ID));
idPanel.requestFocus();
return false;
}
}
return true;
}
protected boolean validateName(XMLPanel pnl, XMLElement el) {
XMLComplexElement cel = null;
String newName = null;
XMLPanel namePanel = null;
if (el instanceof XMLAttribute) {
XMLElement parent = el.getParent();
if (parent instanceof XMLCollectionElement) {
cel = (XMLCollectionElement) parent;
newName = cel.get("Name").toValue();
if (pnl.getValue() instanceof String) {
newName = ((String) pnl.getValue()).trim();
namePanel = pnl;
}
} else if (parent instanceof Package) {
cel = (Package) parent;
newName = cel.get("Name").toValue();
if (pnl.getValue() instanceof String) {
newName = ((String) pnl.getValue()).trim();
namePanel = pnl;
}
}
} else if (el instanceof XMLComplexElement) {
cel = (XMLComplexElement) el;
newName = cel.get("Name") != null ? cel.get("Name").toValue() : "";
namePanel = findPanel(pnl, cel.get("Name"));
if (namePanel != null) {
if (namePanel.getValue() instanceof String) {
newName = ((String) namePanel.getValue()).trim();
}
}
}
System.err.println("Valid for " + el + ", par=" + el.getParent() + ", newname=" + newName + ", namep=" + namePanel);
return true;
}
protected boolean validateTransition(XMLPanel pnl, XMLElement el) {
Transition tra = XMLUtil.getTransition(el);
String oldFrom = tra.getFrom();
String oldTo = tra.getTo();
String newFrom = oldFrom;
String newTo = oldTo;
String newType = tra.getCondition().getType();
if (el instanceof Transition) {
XMLPanel ftPanel = findPanel(pnl, tra.get("From"));
if (ftPanel != null) {
Object v = ftPanel.getValue();
if (v instanceof XMLElement) {
if (v instanceof Activity) {
newFrom = ((Activity) v).getId();
}
} else if (v instanceof String) {
newFrom = ((String) v).trim();
}
}
ftPanel = findPanel(pnl, tra.get("To"));
if (ftPanel != null) {
Object v = ftPanel.getValue();
if (v instanceof XMLElement) {
if (v instanceof Activity) {
newTo = ((Activity) v).getId();
}
} else if (v instanceof String) {
newTo = ((String) v).trim();
}
}
ftPanel = findPanel(pnl, ((Condition) tra.get("Condition")).getTypeAttribute());
if (ftPanel != null) {
Object v = ftPanel.getValue();
if (v instanceof String) {
newType = ((String) v).trim();
}
}
} else if (el instanceof XMLAttribute && (el.toName().equals("From") || el.toName().equals("To"))) {
Object v = pnl.getValue();
String toOrFrom = null;
if (v instanceof XMLElement) {
if (v instanceof Activity) {
toOrFrom = ((Activity) v).getId();
}
} else if (v instanceof String) {
toOrFrom = ((String) v).trim();
}
if (toOrFrom != null) {
if (el.toName().equals("From")) {
newFrom = toOrFrom;
} else {
newTo = toOrFrom;
}
}
} else if (el instanceof Condition) {
XMLPanel ftPanel = findPanel(pnl, ((Condition) tra.get("Condition")).getTypeAttribute());
if (ftPanel != null) {
Object v = ftPanel.getValue();
if (v instanceof String) {
newType = ((String) v).trim();
}
}
} else if (el instanceof XMLAttribute && el.getParent() instanceof Condition && el.toName().equals("Type")) {
Object v = pnl.getValue();
if (v instanceof String) {
newType = ((String) v).trim();
}
}
boolean isExcTra = false;
if (newType.equals(XPDLConstants.CONDITION_TYPE_EXCEPTION) ||
newType.equals(XPDLConstants.CONDITION_TYPE_DEFAULTEXCEPTION)) {
isExcTra = true;
}
Activities acts = (Activities) ((XMLCollectionElement) tra.getParent().getParent()).get("Activities");
Activity actFrom = acts.getActivity(newFrom);
Activity actTo = acts.getActivity(newTo);
if (actFrom == null || actTo == null) {
return false;
}
TransitionHandler th = JaWEManager.getInstance().getTransitionHandler();
List status = new ArrayList();
boolean ac = th.allowsConnection(actFrom, actTo, tra, isExcTra, status);
if (!ac) {
String errorMsg = "WarningSourceActivityCannotHaveMoreOutgoingTransitions";
if (((Integer) status.get(0)).intValue() == 2) {
errorMsg = "WarningTargetActivityCannotHaveMoreIncomingTransitions";
} else if (((Integer) status.get(0)).intValue() == 3) {
errorMsg = "ErrorActivityCannotHaveMoreThenOneIncomingOutgoingTransitionFromToTheSameActivity";
}
XMLBasicPanel.errorMessage(pnl.getWindow(), ResourceManager.getLanguageDependentString("ErrorMessageKey"), "",
ResourceManager.getLanguageDependentString(errorMsg));
}
return ac;
}
public static XMLPanel findPanel(XMLPanel p, XMLElement idEl) {
if (p instanceof XMLTabbedPanel) {
return ((XMLTabbedPanel) p).getPanelForElement(idEl);
} else if (p instanceof XMLGroupPanel) {
return ((XMLGroupPanel) p).getPanelForElement(idEl);
}
return null;
}
public Settings getSettings() {
return null;
}
}