public static void main(String[] args) {
    if (args.length != 1) {
      println("Usage: java printAnnotation filename");
      System.exit(1);
    }

    String filename = args[0];
    SBMLDocument document;
    SBMLReader reader = new SBMLReader();

    document = reader.readSBML(filename);
    long errors = document.getNumErrors();
    println("\nfilename: " + filename + "\n");
    if (errors > 0) {
      document.printErrors();
      System.exit((int) errors);
    }

    /* Model */
    Model m = document.getModel();
    printAnnotation(m);

    for (int i = 0; i < m.getNumReactions(); i++) {
      Reaction re = m.getReaction(i);
      printAnnotation(re);

      /* SpeciesReference (Reactant) */
      for (int j = 0; j < re.getNumReactants(); j++) {
        SpeciesReference rt = re.getReactant(j);
        if (rt.isSetAnnotation()) print("   ");
        printAnnotation(rt, (rt.isSetSpecies() ? rt.getSpecies() : ""));
      }

      /* SpeciesReference (Product) */
      for (int j = 0; j < re.getNumProducts(); j++) {
        SpeciesReference rt = re.getProduct(j);
        if (rt.isSetAnnotation()) print("   ");
        printAnnotation(rt, (rt.isSetSpecies() ? rt.getSpecies() : ""));
      }

      /* ModifierSpeciesReference (Modifier) */
      for (int j = 0; j < re.getNumModifiers(); j++) {
        ModifierSpeciesReference md = re.getModifier(j);
        if (md.isSetAnnotation()) print("   ");
        printAnnotation(md, (md.isSetSpecies() ? md.getSpecies() : ""));
      }

      /* KineticLaw */
      if (re.isSetKineticLaw()) {
        KineticLaw kl = re.getKineticLaw();
        if (kl.isSetAnnotation()) print("   ");
        printAnnotation(kl);

        /* Parameter */
        for (int j = 0; j < kl.getNumParameters(); j++) {
          Parameter pa = kl.getParameter(j);
          if (pa.isSetAnnotation()) print("      ");
          printAnnotation(pa);
        }
      }
    }

    /* Species */
    for (int i = 0; i < m.getNumSpecies(); i++) {
      Species sp = m.getSpecies(i);
      printAnnotation(sp);
    }

    /* Compartment */
    for (int i = 0; i < m.getNumCompartments(); i++) {
      Compartment sp = m.getCompartment(i);
      printAnnotation(sp);
    }

    /* FunctionDefinition */
    for (int i = 0; i < m.getNumFunctionDefinitions(); i++) {
      FunctionDefinition sp = m.getFunctionDefinition(i);
      printAnnotation(sp);
    }

    /* UnitDefinition */
    for (int i = 0; i < m.getNumUnitDefinitions(); i++) {
      UnitDefinition sp = m.getUnitDefinition(i);
      printAnnotation(sp);
    }

    /* Parameter */
    for (int i = 0; i < m.getNumParameters(); i++) {
      Parameter sp = m.getParameter(i);
      printAnnotation(sp);
    }

    /* Rule */
    for (int i = 0; i < m.getNumRules(); i++) {
      Rule sp = m.getRule(i);
      printAnnotation(sp);
    }

    /* InitialAssignment */
    for (int i = 0; i < m.getNumInitialAssignments(); i++) {
      InitialAssignment sp = m.getInitialAssignment(i);
      printAnnotation(sp);
    }

    /* Event */
    for (int i = 0; i < m.getNumEvents(); i++) {
      Event sp = m.getEvent(i);
      printAnnotation(sp);

      /* Trigger */
      if (sp.isSetTrigger()) {
        Trigger tg = sp.getTrigger();
        if (tg.isSetAnnotation()) print("   ");
        printAnnotation(tg);
      }

      /* Delay */
      if (sp.isSetDelay()) {
        Delay dl = sp.getDelay();
        if (dl.isSetAnnotation()) print("   ");
        printAnnotation(dl);
      }

      /* EventAssignment */
      for (int j = 0; j < sp.getNumEventAssignments(); j++) {
        EventAssignment ea = sp.getEventAssignment(j);
        if (ea.isSetAnnotation()) print("   ");
        printAnnotation(ea);
      }
    }

    /* SpeciesType */
    for (int i = 0; i < m.getNumSpeciesTypes(); i++) {
      SpeciesType sp = m.getSpeciesType(i);
      printAnnotation(sp);
    }

    /* Constraint */
    for (int i = 0; i < m.getNumConstraints(); i++) {
      Constraint sp = m.getConstraint(i);
      printAnnotation(sp);
    }

    System.exit((int) errors);
  }
  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();
  }