public static void main(String[] args) {
    if (args.length != 2) {
      println("Usage: java echoSBML input-filename output-filename");
      System.exit(2);
    }

    SBMLReader reader = new SBMLReader();
    SBMLWriter writer = new SBMLWriter();

    SBMLDocument doc = reader.readSBML(args[0]);
    if (doc.getNumErrors() > 0) {
      doc.printErrors();
    } else {
      writer.writeSBML(doc, args[1]);
    }
  }
  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);
  }