public static void main(String args[]) {

    // create the document

    SBMLDocument document = new SBMLDocument(2, 1);

    // ensure the layout api is enabled
    document.enablePackage(LayoutExtension.getXmlnsL2(), "layout", true);

    // create the Model

    Model model = document.createModel("TestModel");

    // create the Compartment

    Compartment compartment = model.createCompartment();
    compartment.setId("Compartment_1");

    // create the Species

    Species species1 = model.createSpecies();
    species1.setId("Species_1");
    species1.setCompartment(compartment.getId());

    Species species2 = model.createSpecies();
    species2.setId("Species_2");
    species2.setCompartment(compartment.getId());

    // create the Reactions

    Reaction reaction1 = model.createReaction();
    reaction1.setId("Reaction_1");

    SpeciesReference reference1 = reaction1.createReactant();
    reference1.setSpecies(species1.getId());
    reference1.setId("SpeciesReference_1");

    reaction1.setReversible(false);

    SpeciesReference reference2 = reaction1.createProduct();
    reference2.setSpecies(species2.getId());
    reference2.setId("SpeciesReference_2");

    Reaction reaction2 = model.createReaction();
    reaction2.setId("Reaction_2");
    reaction2.setReversible(false);

    SpeciesReference reference3 = reaction2.createReactant();
    reference3.setSpecies(species2.getId());
    reference3.setId("SpeciesReference_3");

    SpeciesReference reference4 = reaction2.createProduct();
    reference4.setSpecies(species1.getId());
    reference4.setId("SpeciesReference_4");

    // create the Layout

    LayoutModelPlugin mplugin = (LayoutModelPlugin) (model.getPlugin("layout"));
    Layout layout = mplugin.createLayout();

    layout.setId("Layout_1");
    layout.setDimensions(createDimensions(400, 220));

    // create the CompartmentGlyph

    CompartmentGlyph compartmentGlyph = layout.createCompartmentGlyph();
    compartmentGlyph.setId("CompartmentGlyph_1");
    compartmentGlyph.setCompartmentId(compartment.getId());
    compartmentGlyph.setBoundingBox(createBoundingBox("bb1", 5, 5, 390, 210));

    // create the SpeciesGlyphs

    SpeciesGlyph speciesGlyph1 = layout.createSpeciesGlyph();
    speciesGlyph1.setId("SpeciesGlyph_1");
    speciesGlyph1.setSpeciesId(species1.getId());
    speciesGlyph1.setBoundingBox(createBoundingBox("bb2", 80, 26, 240, 24));

    TextGlyph textGlyph1 = layout.createTextGlyph();
    textGlyph1.setId("TextGlyph_01");
    textGlyph1.setBoundingBox(createBoundingBox("bbA", 92, 26, 228, 24));
    textGlyph1.setOriginOfTextId(speciesGlyph1.getId());
    textGlyph1.setGraphicalObjectId(speciesGlyph1.getId());

    SpeciesGlyph speciesGlyph2 = layout.createSpeciesGlyph();
    speciesGlyph2.setId("SpeciesGlyph_2");
    speciesGlyph2.setSpeciesId(species2.getId());
    speciesGlyph2.setBoundingBox(createBoundingBox("bb3", 80, 170, 240, 24));

    TextGlyph textGlyph2 = layout.createTextGlyph();
    textGlyph2.setId("TextGlyph_02");
    textGlyph2.setBoundingBox(createBoundingBox("bbB", 92, 170, 228, 24));
    textGlyph2.setOriginOfTextId(speciesGlyph2.getId());
    textGlyph2.setGraphicalObjectId(speciesGlyph2.getId());

    // create the ReactionGlyphs

    ReactionGlyph reactionGlyph1 = layout.createReactionGlyph();
    reactionGlyph1.setId("ReactionGlyph_1");
    reactionGlyph1.setReactionId(reaction1.getId());

    Curve reactionCurve1 = reactionGlyph1.getCurve();
    LineSegment ls = reactionCurve1.createLineSegment();
    ls.setStart(createPoint(165, 105));
    ls.setEnd(createPoint(165, 115));

    ReactionGlyph reactionGlyph2 = layout.createReactionGlyph();
    reactionGlyph2.setId("ReactionGlyph_1");
    reactionGlyph2.setReactionId(reaction2.getId());

    Curve reactionCurve2 = reactionGlyph2.getCurve();
    ls = reactionCurve2.createLineSegment();
    ls.setStart(createPoint(235, 105));
    ls.setEnd(createPoint(235, 115));

    // add the SpeciesReferenceGlyphs

    SpeciesReferenceGlyph speciesReferenceGlyph1 = reactionGlyph1.createSpeciesReferenceGlyph();
    speciesReferenceGlyph1.setId("SpeciesReferenceGlyph_1");
    speciesReferenceGlyph1.setSpeciesGlyphId(speciesGlyph1.getId());
    speciesReferenceGlyph1.setSpeciesReferenceId(reference1.getId());
    speciesReferenceGlyph1.setRole(libsbmlConstants.SPECIES_ROLE_SUBSTRATE);

    Curve speciesReferenceCurve1 = speciesReferenceGlyph1.getCurve();
    CubicBezier cb = speciesReferenceCurve1.createCubicBezier();
    cb.setStart(createPoint(165.0, 105.0));
    cb.setBasePoint1(createPoint(165.0, 90.0));
    cb.setBasePoint2(createPoint(165.0, 90.0));
    cb.setEnd(createPoint(195.0, 60.0));

    SpeciesReferenceGlyph speciesReferenceGlyph2 = reactionGlyph1.createSpeciesReferenceGlyph();
    speciesReferenceGlyph2.setId("SpeciesReferenceGlyph_2");
    speciesReferenceGlyph2.setSpeciesGlyphId(speciesGlyph2.getId());
    speciesReferenceGlyph2.setSpeciesReferenceId(reference2.getId());
    speciesReferenceGlyph2.setRole(libsbmlConstants.SPECIES_ROLE_PRODUCT);

    Curve speciesReferenceCurve2 = speciesReferenceGlyph2.getCurve();
    cb = speciesReferenceCurve2.createCubicBezier();
    cb.setStart(createPoint(165.0, 115.0));
    cb.setBasePoint1(createPoint(165.0, 130.0));
    cb.setBasePoint2(createPoint(165.0, 130.0));
    cb.setEnd(createPoint(195.0, 160.0));

    SpeciesReferenceGlyph speciesReferenceGlyph3 = reactionGlyph2.createSpeciesReferenceGlyph();
    speciesReferenceGlyph3.setId("SpeciesReferenceGlyph_3");
    speciesReferenceGlyph3.setSpeciesGlyphId(speciesGlyph2.getId());
    speciesReferenceGlyph3.setSpeciesReferenceId(reference3.getId());
    speciesReferenceGlyph3.setRole(libsbmlConstants.SPECIES_ROLE_SUBSTRATE);

    Curve speciesReferenceCurve3 = speciesReferenceGlyph3.getCurve();
    cb = speciesReferenceCurve3.createCubicBezier();
    cb.setStart(createPoint(235.0, 115.0));
    cb.setBasePoint1(createPoint(235.0, 130.0));
    cb.setBasePoint2(createPoint(235.0, 130.0));
    cb.setEnd(createPoint(205.0, 160.0));

    SpeciesReferenceGlyph speciesReferenceGlyph4 = reactionGlyph2.createSpeciesReferenceGlyph();
    speciesReferenceGlyph4.setId("SpeciesReferenceGlyph_4");
    speciesReferenceGlyph4.setSpeciesGlyphId(speciesGlyph1.getId());
    speciesReferenceGlyph4.setSpeciesReferenceId(reference4.getId());
    speciesReferenceGlyph4.setRole(libsbmlConstants.SPECIES_ROLE_PRODUCT);

    Curve speciesReferenceCurve4 = speciesReferenceGlyph4.getCurve();
    cb = speciesReferenceCurve4.createCubicBezier();
    cb.setStart(createPoint(235.0, 105.0));
    cb.setBasePoint1(createPoint(235.0, 90.0));
    cb.setBasePoint2(createPoint(235.0, 90.0));
    cb.setEnd(createPoint(205.0, 60.0));

    libsbml.writeSBML(document, "TestModel1-java.xml");

    System.gc();
  }
  public static void main(String[] args) {
    System.loadLibrary("sbmlj");

    if (args.length != 2) {
      System.out.println("  usage: addingEvidenceCodes_2 <input-filename> <output-filename>");
      System.out.println("  Adds controlled vocabulary term to a species");
      System.out.println();
      System.exit(2);
    }

    SBMLDocument d = libsbml.readSBML(args[0]);
    long errors = d.getNumErrors();

    if (errors > 0) {
      System.out.println("Read Error(s):");
      d.printErrors();

      System.out.println("Correct the above and re-run.");
    } else {
      long n = d.getModel().getNumSpecies();

      if (n <= 0) {
        System.out.println("Model has no species.\n Cannot add CV terms\n");
      } else {
        Species s = d.getModel().getSpecies(0);

        /*
         * check that the species has a metaid no CVTerms will be added
         * if there is no metaid to reference
         */
        if (!s.isSetMetaId()) s.setMetaId("metaid_0000052");

        CVTerm cv1 = new CVTerm(libsbml.BIOLOGICAL_QUALIFIER);
        cv1.setBiologicalQualifierType(libsbml.BQB_OCCURS_IN);
        cv1.addResource("urn:miriam:obo.go:GO%3A0005764");

        s.addCVTerm(cv1);

        // now create the additional annotation

        // <rdf:Statement>
        // <rdf:subject rdf:resource="#metaid_0000052"/>
        // <rdf:predicate
        // rdf:resource="http://biomodels.net/biology-qualifiers/occursIn"/>
        // <rdf:object rdf:resource="urn:miriam:obo.go:GO%3A0005764"/>
        // <bqbiol:isDescribedBy>
        // <rdf:Bag>
        // <rdf:li rdf:resource="urn:miriam:obo.eco:ECO%3A0000004"/>
        // <rdf:li rdf:resource="urn:miriam:pubmed:7017716"/>
        // </rdf:Bag>
        // </bqbiol:isDescribedBy>
        // </rdf:Statement>

        /* attributes */
        XMLAttributes blank_att = new XMLAttributes();

        XMLAttributes resource_att = new XMLAttributes();

        /* create the outer statement node */
        XMLTriple statement_triple =
            new XMLTriple("Statement", "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf");

        XMLToken statement_token = new XMLToken(statement_triple, blank_att);

        XMLNode statement = new XMLNode(statement_token);

        /* create the subject node */
        XMLTriple subject_triple =
            new XMLTriple("subject", "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf");

        resource_att.clear();
        resource_att.add("rdf:resource", "#" + s.getMetaId());

        XMLToken subject_token = new XMLToken(subject_triple, resource_att);

        XMLNode subject = new XMLNode(subject_token);

        /* create the predicate node */
        XMLTriple predicate_triple =
            new XMLTriple("predicate", "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf");

        resource_att.clear();
        resource_att.add("rdf:resource", "http://biomodels.net/biology-qualifiers/occursIn");

        XMLToken predicate_token = new XMLToken(predicate_triple, resource_att);

        XMLNode predicate = new XMLNode(predicate_token);

        /* create the object node */
        XMLTriple object_triple =
            new XMLTriple("object", "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf");

        resource_att.clear();
        resource_att.add("rdf:resource", "urn:miriam:obo.go:GO%3A0005764");

        XMLToken object_token = new XMLToken(object_triple, resource_att);

        XMLNode object_ = new XMLNode(object_token);

        /* create the bqbiol node */
        XMLTriple bqbiol_triple =
            new XMLTriple("isDescribedBy", "http://biomodels.net/biology-qualifiers/", "bqbiol");

        XMLToken bqbiol_token = new XMLToken(bqbiol_triple, blank_att);

        XMLNode bqbiol = new XMLNode(bqbiol_token);

        /* create the bag node */
        XMLTriple bag_triple =
            new XMLTriple("Bag", "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf");

        XMLToken bag_token = new XMLToken(bag_triple, blank_att);

        XMLNode bag = new XMLNode(bag_token);

        /* create each li node and add to the bag */
        XMLTriple li_triple =
            new XMLTriple("li", "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf");

        resource_att.clear();
        resource_att.add("rdf:resource", "urn:miriam:obo.eco:ECO%3A0000004");

        XMLToken li_token = new XMLToken(li_triple, resource_att);
        li_token.setEnd();

        XMLNode li = new XMLNode(li_token);

        bag.addChild(li);

        resource_att.clear();
        resource_att.add("rdf:resource", "urn:miriam:pubmed:7017716");
        li_token = new XMLToken(li_triple, resource_att);
        li_token.setEnd();
        li = new XMLNode(li_token);

        bag.addChild(li);

        /* add the bag to bqbiol */
        bqbiol.addChild(bag);

        /* add subject, predicate, object and bqbiol to statement */
        statement.addChild(subject);
        statement.addChild(predicate);
        statement.addChild(object_);
        statement.addChild(bqbiol);

        /*
         * create a top-level RDF element this will ensure correct
         * merging
         */

        XMLNamespaces xmlns = new XMLNamespaces();
        xmlns.add("http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf");
        xmlns.add("http://purl.org/dc/elements/1.1/", "dc");
        xmlns.add("http://purl.org/dc/terms/", "dcterms");
        xmlns.add("http://www.w3.org/2001/vcard-rdf/3.0#", "vCard");
        xmlns.add("http://biomodels.net/biology-qualifiers/", "bqbiol");
        xmlns.add("http://biomodels.net/model-qualifiers/", "bqmodel");

        XMLTriple RDF_triple =
            new XMLTriple("RDF", "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf");

        XMLToken RDF_token = new XMLToken(RDF_triple, blank_att, xmlns);

        XMLNode annotation = new XMLNode(RDF_token);

        /* add the staement node to the RDF node */
        annotation.addChild(statement);

        s.appendAnnotation(annotation);

        libsbml.writeSBML(d, args[1]);
      }
    }

    System.exit((int) errors);
  }