/**
   * Pathway information is added to the pathway element model.
   *
   * @param title
   * @param version
   * @param organism
   * @param commentList
   * @param bioPaxRefs
   * @return pwElt
   */
  public static PathwayElement createMapInfo(
      String title,
      String version,
      String organism,
      List<String> commentList,
      List<String> bioPaxRefs) {

    // create pathwayElement line
    PathwayElement pwElt = PathwayElement.createPathwayElement(ObjectType.MAPPINFO);
    if (!(title.equals(""))) pwElt.setMapInfoName(title);
    if (!(version.equals(""))) pwElt.setVersion(version);
    if (!(organism.equals(""))) pwElt.setOrganism(organism);

    if (commentList.size() > 0) {
      for (int i = 0; i < commentList.size(); i += 2) {
        pwElt.addComment(commentList.get(i), commentList.get(i + 1));
      }
    }

    if (bioPaxRefs.size() > 0) {
      for (int i = 0; i < bioPaxRefs.size(); i++) {
        pwElt.addBiopaxRef(bioPaxRefs.get(i));
      }
    }
    return pwElt;
  }
  /**
   * State values are added to the pathway element model.
   *
   * @param relX
   * @param relY
   * @param width
   * @param height
   * @param color
   * @param lineStyle
   * @param lnThickness
   * @param fillColor
   * @param shapeType
   * @param zOrder
   * @param database
   * @param ID
   * @param bioPaxRefs
   * @param graphId
   * @param graphRef
   * @param textLabel
   * @param stateType
   * @return pwElt
   */
  public static PathwayElement createState(
      double relX,
      double relY,
      double width,
      double height,
      Color color,
      int lineStyle,
      int lnThickness,
      Color fillColor,
      IShape shapeType,
      int zOrder,
      DataSource database,
      String ID,
      List<String> bioPaxRefs,
      String graphId,
      String graphRef,
      String textLabel,
      String stateType) {

    // create pathwayElement State
    PathwayElement pwElt = PathwayElement.createPathwayElement(ObjectType.STATE);

    // for better definition of identifier and database
    Xref ref = new Xref(ID, database);

    pwElt.setRelX(relX);
    pwElt.setRelY(relY);
    pwElt.setMWidth(width);
    pwElt.setMHeight(height);
    pwElt.setColor(color);
    pwElt.setLineStyle(lineStyle);
    pwElt.setLineThickness(lnThickness);
    pwElt.setFillColor(fillColor);
    pwElt.setShapeType(shapeType);
    pwElt.setZOrder(zOrder);
    pwElt.setDataSource(ref.getDataSource());
    pwElt.setElementID(ref.getId());
    pwElt.setGraphId(graphId);
    pwElt.setGraphRef(graphRef);
    pwElt.setTextLabel(textLabel);

    if (stateType == "unknown") {
    } else {
    }

    if (bioPaxRefs.size() > 0) {
      for (int i = 0; i < bioPaxRefs.size(); i++) {
        pwElt.addBiopaxRef(bioPaxRefs.get(i));
      }
    }
    return pwElt;
  }
  /**
   * GraphicalLine values are added to the pathway element model.
   *
   * @param mPointsDoubles
   * @param relX
   * @param relY
   * @param startGraphRef
   * @param endGraphRef
   * @param pointGraphId
   * @param arrowHead
   * @param anchorList
   * @param color
   * @param lnThickness
   * @param lineStyle
   * @param connectorType
   * @param zOrder
   * @param groupRef
   * @param bioPaxRefs
   * @param graphId
   * @param type
   * @return pwElt
   */
  public static PathwayElement createGraphicalLine(
      List<Double> mPointsDoubles,
      double relX,
      double relY,
      String startGraphRef,
      String endGraphRef,
      String pointGraphId,
      String arrowHead,
      List<String> anchorList,
      Color color,
      int lnThickness,
      int lineStyle,
      String connectorType,
      int zOrder,
      String groupRef,
      List<String> bioPaxRefs,
      String graphId,
      String type) {

    // !!! not done yet

    // create pathwayElement line
    PathwayElement pwElt = PathwayElement.createPathwayElement(ObjectType.GRAPHLINE);

    pwElt.setStartGraphRef(startGraphRef);
    pwElt.setEndGraphRef(endGraphRef);
    pwElt.setGraphId(graphId);
    pwElt.setColor(color);
    pwElt.setLineThickness(lnThickness);
    pwElt.setLineStyle(lineStyle);
    pwElt.setZOrder(zOrder);
    pwElt.setGroupRef(groupRef);
    pwElt.setGraphId(graphId);

    pwElt.setEndLineType(LineType.fromName(arrowHead));

    // add MPoints
    addLineType(pwElt, connectorType, mPointsDoubles);

    // add Anchor
    if (anchorList.size() > 0) {
      createAnchor(pwElt, anchorList);
    }

    if (bioPaxRefs.size() > 0) {
      for (int i = 0; i < bioPaxRefs.size(); i++) {
        pwElt.addBiopaxRef(bioPaxRefs.get(i));
      }
    }

    return null;
  }
  /**
   * Label values are added to the pathway element model.
   *
   * @param centerX
   * @param centerY
   * @param width
   * @param height
   * @param fontName
   * @param fontStyle
   * @param fontDecoration
   * @param fontStrikeThru
   * @param fontWeight
   * @param fontSize
   * @param align
   * @param vAlign
   * @param color
   * @param lnThickness
   * @param fillcolor
   * @param zOrder
   * @param bioPaxRefs
   * @param graphId
   * @param groupId
   * @param textLabel
   * @return pwElt
   */
  public static PathwayElement createLabel(
      Double centerX,
      Double centerY,
      Double width,
      Double height,
      String fontName,
      Boolean fontStyle,
      Boolean fontDecoration,
      Boolean fontStrikeThru,
      Boolean fontWeight,
      Double fontSize,
      String align,
      String vAlign,
      Color color,
      Double lnThickness,
      Color fillcolor,
      Integer zOrder,
      List<String> bioPaxRefs,
      String graphId,
      String groupId,
      String textLabel) {

    // create pathwayElement label
    PathwayElement pwElt = PathwayElement.createPathwayElement(ObjectType.LABEL);

    // put variables in element
    if (centerX != null) {
      pwElt.setMCenterX(centerX);
    } else {
      System.out.println("No CenterX for label!!");
      throw new EmptyStackException();
    }
    if (centerY != null) {
      pwElt.setMCenterY(centerY);
    } else {
      System.out.println("No centerY for label!!");
      throw new EmptyStackException();
    }
    if (width != null) {
      pwElt.setMWidth(width);
    } else {
      System.out.println("No width for label!!");
      throw new EmptyStackException();
    }
    if (height != null) {
      pwElt.setMHeight(height);
    } else {
      System.out.println("No height for label!!");
      throw new EmptyStackException();
    }
    if (fontSize != null) pwElt.setMFontSize(fontSize);
    if (color != null) {
      pwElt.setColor(color);
    }
    if (lnThickness != null) pwElt.setLineThickness(lnThickness);
    if (fillcolor != null) pwElt.setFillColor(fillcolor);
    if (!(graphId.equals(""))) {
      pwElt.setGraphId(graphId);
    } else {
      System.out.println("No GraphId for label!!");
      throw new EmptyStackException();
    }
    if (!(textLabel.equals(""))) {
      pwElt.setTextLabel(textLabel);
    } else {
      System.out.println("No label name for label!!");
      throw new EmptyStackException();
    }
    if (fontStyle == true) pwElt.setItalic(fontStyle);
    if (fontDecoration == true) pwElt.setUnderline(fontDecoration);
    if (fontStrikeThru == true) pwElt.setStrikethru(fontStrikeThru);
    if (fontWeight == true) pwElt.setBold(fontWeight);
    if (!(fontName.equals(""))) pwElt.setFontName(fontName);
    if (zOrder != -1) pwElt.setZOrder(zOrder);
    if (!(groupId.equals(""))) pwElt.setGraphRef(groupId);

    if (align.toLowerCase() == "center") {
      pwElt.setAlign(AlignType.CENTER);
    } else if (align.toLowerCase() == "left") {
      pwElt.setAlign(AlignType.LEFT);
    } else if (align.toLowerCase() == "right") {
      pwElt.setAlign(AlignType.RIGHT);
    } else {
      pwElt.setAlign(AlignType.CENTER);
    }

    if (vAlign.toLowerCase() == "middle") {
      pwElt.setValign(ValignType.MIDDLE);
    } else if (vAlign.toLowerCase() == "bottom") {
      pwElt.setValign(ValignType.BOTTOM);
    } else if (vAlign.toLowerCase() == "top") {
      pwElt.setValign(ValignType.TOP);
    } else {
      pwElt.setValign(ValignType.MIDDLE);
    }

    if (bioPaxRefs.size() > 0) {
      for (int i = 0; i < bioPaxRefs.size(); i++) {
        pwElt.addBiopaxRef(bioPaxRefs.get(i));
      }
    }
    return pwElt;
  }
  /**
   * DataNode values are added to the pathway element model.
   *
   * @param centerX
   * @param centerY
   * @param width
   * @param height
   * @param textLabel
   * @param identifier
   * @param source
   * @param dnType
   * @param graphId
   * @param color
   * @param fontSize
   * @param zOrder
   * @param vAlign
   * @param groupRef
   * @param bioPaxRefs
   * @param commentList
   * @return pwElt
   */
  public static PathwayElement createDataNode(
      Double centerX,
      Double centerY,
      Double width,
      Double height,
      String textLabel,
      String identifier,
      DataSource source,
      String dnType,
      String graphId,
      Color color,
      Double fontSize,
      Integer zOrder,
      String vAlign,
      String groupRef,
      List<String> bioPaxRefs,
      List<String> commentList) {

    // create pathwayElement data node
    PathwayElement pwElt = PathwayElement.createPathwayElement(ObjectType.DATANODE);

    // for better definition of identifier and database
    Xref ref = new Xref(identifier, source);

    // put variables in element
    if (centerX != null) {
      pwElt.setMCenterX(centerX);
    } else {
      System.out.println("No CenterX for datanode!!");
      throw new EmptyStackException();
    }
    if (centerY != null) {
      pwElt.setMCenterY(centerY);
    } else {
      System.out.println("No centerY for datanode!!");
      throw new EmptyStackException();
    }
    if (width != null) {
      pwElt.setMWidth(width);
    } else {
      System.out.println("No width for datanode!!");
      throw new EmptyStackException();
    }
    if (height != null) {
      pwElt.setMHeight(height);
    } else {
      System.out.println("No height for datanode!!");
      throw new EmptyStackException();
    }
    if (!(textLabel.equals(""))) pwElt.setTextLabel(textLabel);
    else {
      System.out.println("No label name for datanode!!");
      throw new EmptyStackException();
    }
    if (!(ref.getId().isEmpty())) pwElt.setElementID(ref.getId());
    if (ref.getDataSource() != null) pwElt.setDataSource(ref.getDataSource());
    if (dnType != null) pwElt.setDataNodeType(dnType);
    if (!(graphId.equals(""))) {
      pwElt.setGraphId(graphId);
    } else {
      System.out.println("No GraphId for datanode!!");
      throw new EmptyStackException();
    }
    if (color != null) {
      pwElt.setColor(color);
    }
    if (fontSize != null) pwElt.setMFontSize(fontSize);
    if (zOrder != -1) pwElt.setZOrder(zOrder);
    // System.out.println(groupRef);
    // if (!(groupRef.equals(""))) pwElt.setGraphRef(groupRef);

    if (vAlign.toLowerCase() == "middle") {
      pwElt.setValign(ValignType.MIDDLE);
    } else if (vAlign.toLowerCase() == "bottom") {
      pwElt.setValign(ValignType.BOTTOM);
    } else if (vAlign.toLowerCase() == "top") {
      pwElt.setValign(ValignType.TOP);
    } else {
      pwElt.setValign(ValignType.MIDDLE);
    }

    if (bioPaxRefs.size() > 0) {
      for (int i = 0; i < bioPaxRefs.size(); i++) {
        pwElt.addBiopaxRef(bioPaxRefs.get(i));
      }
    }

    if (commentList.size() > 0) {
      for (int i = 0; i < commentList.size(); i += 2) {
        pwElt.addComment(commentList.get(i), commentList.get(i + 1));
      }
    }
    return pwElt;
  }