All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ow2.bonita.parsing.binding.MajorElementBinding Maven / Gradle / Ivy

/**
 * Copyright (C) 2006  Bull S. A. S.
 * Bull, Rue Jean Jaures, B.P.68, 78340, Les Clayes-sous-Bois
 * This library is free software; you can redistribute it and/or modify it under the terms
 * of the GNU Lesser General Public License as published by the Free Software Foundation
 * version 2.1 of the License.
 * This library 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 Lesser General Public License for more details.
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
 * Floor, Boston, MA  02110-1301, USA.
 **/
package org.ow2.bonita.parsing.binding;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.ow2.bonita.facade.def.dataType.DataTypeDefinition;
import org.ow2.bonita.facade.def.element.ExternalReferenceDefinition;
import org.ow2.bonita.facade.def.element.FormalParameterDefinition;
import org.ow2.bonita.facade.def.element.FormalParameterDefinition.Mode;
import org.ow2.bonita.facade.def.element.impl.ExternalReferenceDefinitionImpl;
import org.ow2.bonita.facade.def.element.impl.FormalParameterDefinitionImpl;
import org.ow2.bonita.facade.def.majorElement.ActivityDefinition;
import org.ow2.bonita.facade.def.majorElement.ActivitySetDefinition;
import org.ow2.bonita.facade.def.majorElement.ApplicationDefinition;
import org.ow2.bonita.facade.def.majorElement.DataFieldDefinition;
import org.ow2.bonita.facade.def.majorElement.DefinitionRecord;
import org.ow2.bonita.facade.def.majorElement.PackageDefinition;
import org.ow2.bonita.facade.def.majorElement.ParticipantDefinition;
import org.ow2.bonita.facade.def.majorElement.ProcessDefinition;
import org.ow2.bonita.facade.def.majorElement.TransitionDefinition;
import org.ow2.bonita.parsing.XpdlParser;
import org.ow2.bonita.parsing.XpdlParserException;
import org.ow2.bonita.pvm.internal.util.TagBinding;
import org.ow2.bonita.pvm.internal.util.XmlUtil;
import org.ow2.bonita.pvm.internal.xml.Parse;
import org.ow2.bonita.pvm.internal.xml.Parser;
import org.ow2.bonita.util.Misc;
import org.ow2.bonita.util.XmlConstants;
import org.w3c.dom.Element;

/**
 * @author Marc Blachon, Guillaume Porcher, Charles Souillard, Miguel Valdes, Pierre Vigneras
 */
public abstract class MajorElementBinding extends TagBinding {
  
  protected MajorElementBinding(String tagName) {
    super(tagName, XmlConstants.XPDL_1_0_NS, XpdlParser.CATEGORY_MAJOR_ELT);
  }
  
  protected String getId(Element domElement) {
    String id = XmlUtil.attribute(domElement, "Id");
    if (id == null) {
      throw new XpdlParserException("Error: id is null for " + domElement);
    }
    return id;
  }
  protected String getName(Element domElement) {
    String name = XmlUtil.attribute(domElement, "Name");
    if (name == null) {
      name = getId(domElement);
    }
    return name;
  }

  protected  T getObject(Class clazz, Parse parse) {
    return parse.findObject(clazz);
  }
  /**
   * returns a list of formal parameters: parameters are ordered and index attribute is not required
   * (index attribute has been removed in Xpdl 2)
   * TODO: check that a formal parameter in a workflow process does not hide a data field name.
   */
  protected List getFormalParameters(Element fatherElement, Parse parse, Parser parser) {
    List formalParameters = null;
    Element formalParametersElement = XmlUtil.element(fatherElement, "FormalParameters");
    if (formalParametersElement != null) {
      List formalParameterElements = XmlUtil.elements(formalParametersElement, "FormalParameter");
      if (formalParameterElements != null) {
        formalParameters = new ArrayList();
        for (Element formalParameterElement : formalParameterElements) {
          DataTypeDefinition dataTypeDefinition = null;
          Element dataTypeElement = XmlUtil.element(formalParameterElement, "DataType");
          if (dataTypeElement != null) {
            dataTypeDefinition = (DataTypeDefinition) parser.parseElement(dataTypeElement, parse, "dataTypes");
          }
          String description = getChildTextContent(formalParameterElement, "Description");

          String id = XmlUtil.attribute(formalParameterElement, "Id");
          String index = XmlUtil.attribute(formalParameterElement, "Index");
          Mode mode = getEnumValue(Mode.class, XmlUtil.attribute(formalParameterElement, "Mode"), Mode.IN);
          FormalParameterDefinition formalParameterDefinition =
            new FormalParameterDefinitionImpl(dataTypeDefinition, description, id, index, mode);
          formalParameters.add(formalParameterDefinition);
        }
      }
    }
    return formalParameters;
  }

  @SuppressWarnings("unchecked")
  protected  Set parseXpdlMajorElementList(Element fatherElement,
      String listName, String elementName, Parse parse, Parser parser) {

    Element listElement = XmlUtil.element(fatherElement, listName);
    if (listElement != null) {
      Set xpdlMajorElements = new HashSet();
      Set ids = new HashSet();
      Set names = new HashSet();
      List subElements = XmlUtil.elements(listElement, elementName);
      if (subElements != null) {
        for (Element subElement : subElements) {
          T majorElement = (T) parser.parseElement(subElement, parse, "majorElements");
          String id = getDefinitionId(majorElement);
          if (!ids.add(id)) {
            throw new XpdlParserException("Error: Duplicate processId " + id + " for majorElement " + elementName);
          }
          if (!names.add(majorElement.getName())) {
            throw new XpdlParserException("Error: Duplicate name " + majorElement.getName()
                + " for majorElement " + elementName);
          }
          xpdlMajorElements.add(majorElement);
        }
      }
      return xpdlMajorElements;
    }
    return null;
  }

  private String getDefinitionId(DefinitionRecord definitionRecord) {
    if (definitionRecord instanceof PackageDefinition) {
      return ((PackageDefinition)definitionRecord).getPackageId();
    } else if (definitionRecord instanceof ProcessDefinition) {
      return ((ProcessDefinition)definitionRecord).getProcessId();
    } else if (definitionRecord instanceof ActivityDefinition) {
      return ((ActivityDefinition)definitionRecord).getActivityId();
    } else if (definitionRecord instanceof ActivitySetDefinition) {
      return ((ActivitySetDefinition)definitionRecord).getActivitySetId();
    } else if (definitionRecord instanceof ApplicationDefinition) {
      return ((ApplicationDefinition)definitionRecord).getApplicationId();
    } else if (definitionRecord instanceof DataFieldDefinition) {
      return ((DataFieldDefinition)definitionRecord).getDataFieldId();
    } else if (definitionRecord instanceof ParticipantDefinition) {
      return ((ParticipantDefinition)definitionRecord).getParticipantId();
    } else if (definitionRecord instanceof TransitionDefinition) {
      return ((TransitionDefinition)definitionRecord).getTransitionId();
    } else {
      throw new XpdlParserException("Unknown DefinitionRecord : " + definitionRecord
          + ", class : " + definitionRecord.getClass());
    }
  }

  protected ExternalReferenceDefinition getExternalereference(Element fatherElement) {
    ExternalReferenceDefinition externalReference = null;
    Element externalReferenceElement = XmlUtil.element(fatherElement, "ExternalReference");
    if (externalReferenceElement != null) {
      String xref = XmlUtil.attribute(externalReferenceElement, "xref");
      String location = XmlUtil.attribute(externalReferenceElement, "location");
      String namespace = XmlUtil.attribute(externalReferenceElement, "namespace");
      externalReference = new ExternalReferenceDefinitionImpl(location, namespace, xref);
    }
    return externalReference;
  }
  protected String getChildTextContent(Element fatherElement, String childTagName) {
    if (fatherElement == null) {
      return null;
    }
    Element childElement = XmlUtil.element(fatherElement, childTagName);
    if (childElement != null) {
      return childElement.getTextContent().trim();
    }
    return null;
  }

  protected  > T getEnumValue(Class< T > enumType, String valueAsString, T defaultValue) {
    if (valueAsString == null) {
      return defaultValue;
    }
    try {
      return Misc.stringToEnum(enumType, valueAsString);
    } catch (IllegalArgumentException e) {
      throw new XpdlParserException("Invalid enum value: " + valueAsString + " is not in " + enumType.getName(), e);
    }
  }

  protected boolean containsExtendedAttribute(Element domElement, String extendedAttributeName) {
    return getExtendedAttribute(domElement, extendedAttributeName) != null;
  }

  protected Element getExtendedAttribute(Element domElement, String extendedAttributeName) {
    Element extendedAttributesElement = XmlUtil.element(domElement, "ExtendedAttributes");
    if (extendedAttributesElement != null) {
      List extendedAttributeElements = XmlUtil.elements(extendedAttributesElement, "ExtendedAttribute");
      if (extendedAttributeElements != null) {
        for (Element extendedAttributeElement : extendedAttributeElements) {
          String name = XmlUtil.attribute(extendedAttributeElement, "Name");
          if (name != null && name.equals(extendedAttributeName)) {
            return extendedAttributeElement;
          }
        }
      }
    }
    return null;
  }

  protected Set getExtendedAttributes(Element domElement, String extendedAttributeName) {
    Set result = null;
    Element extendedAttributesElement = XmlUtil.element(domElement, "ExtendedAttributes");
    if (extendedAttributesElement != null) {
      List extendedAttributeElements = XmlUtil.elements(extendedAttributesElement, "ExtendedAttribute");
      if (extendedAttributeElements != null) {
        result = new HashSet();
        for (Element extendedAttributeElement : extendedAttributeElements) {
          String name = XmlUtil.attribute(extendedAttributeElement, "Name");
          if (name != null && name.equals(extendedAttributeName)) {
            result.add(extendedAttributeElement);
          }
        }
      }
    }
    return result;
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy