Example #1
0
    /**
     * Creates a <tt>CarbonPacketExtension</tt> by parsing an XML document.
     *
     * @param parser the parser to use.
     * @return the created <tt>CarbonPacketExtension</tt>.
     * @throws Exception
     */
    @Override
    public PacketExtension parseExtension(XmlPullParser parser) throws Exception {
      CarbonPacketExtension packetExtension = new CarbonPacketExtension(elementName);

      // now parse the sub elements
      boolean done = false;
      String elementName;
      ForwardedPacketExtension extension = null;
      while (!done) {
        switch (parser.next()) {
          case XmlPullParser.START_TAG:
            {
              elementName = parser.getName();
              if (ForwardedPacketExtension.ELEMENT_NAME.equals(elementName)) {
                extension = (ForwardedPacketExtension) super.parseExtension(parser);
                if (extension != null) {
                  packetExtension.addChildExtension(extension);
                }
              }
              break;
            }
          case XmlPullParser.END_TAG:
            {
              elementName = parser.getName();
              if (this.elementName.equals(elementName)) {
                done = true;
              }
              break;
            }
        }
      }
      return packetExtension;
    }
Example #2
0
  /**
   * Parse a repository document.
   *
   * @param url
   * @throws IOException
   * @throws XmlPullParserException
   * @throws Exception
   */
  void parseDocument(URL url) throws IOException, XmlPullParserException, Exception {
    if (!visited.contains(url)) {
      visited.add(url);
      try {
        System.out.println("Visiting: " + url);
        InputStream in = null;

        if (url.getPath().endsWith(".zip")) {
          ZipInputStream zin = new ZipInputStream(url.openStream());
          ZipEntry entry = zin.getNextEntry();
          while (entry != null) {
            if (entry.getName().equals("repository.xml")) {
              in = zin;
              break;
            }
            entry = zin.getNextEntry();
          }
        } else {
          in = url.openStream();
        }
        Reader reader = new InputStreamReader(in);
        XmlPullParser parser = new KXmlParser();
        parser.setInput(reader);
        parseRepository(parser);
      } catch (MalformedURLException e) {
        System.out.println("Cannot create connection to url");
      }
    }
  }
Example #3
0
  /**
   * Parses a ConferenceMedium extension sub-packet and creates a {@link
   * ConferenceMediumPacketExtension} instance. At the beginning of the method call, the xml parser
   * will be positioned on the opening element of the packet extension. As required by the smack
   * API, at the end of the method call, the parser will be positioned on the closing element of the
   * packet extension.
   *
   * @param parser an XML parser positioned at the opening <tt>ConferenceMedium</tt> element.
   * @return a new {@link ConferenceMediumPacketExtension} instance.
   * @throws java.lang.Exception if an error occurs parsing the XML.
   */
  public PacketExtension parseExtension(XmlPullParser parser) throws Exception {
    boolean done = false;
    int eventType;
    String elementName = null;
    String label = parser.getAttributeValue("", ConferenceMediumPacketExtension.LABEL_ATTR_NAME);

    if (label == null) {
      throw new Exception("Coin medium element must contain entity attribute");
    }

    ConferenceMediumPacketExtension ext = new ConferenceMediumPacketExtension("entry", label);

    while (!done) {
      eventType = parser.next();
      elementName = parser.getName();

      if (eventType == XmlPullParser.START_TAG) {
        if (elementName.equals(MediaPacketExtension.ELEMENT_DISPLAY_TEXT)) {
          ext.setDisplayText(CoinIQProvider.parseText(parser));
        } else if (elementName.equals(MediaPacketExtension.ELEMENT_STATUS)) {
          ext.setStatus(CoinIQProvider.parseText(parser));
        } else if (elementName.equals(MediaPacketExtension.ELEMENT_TYPE)) {
          ext.setType(CoinIQProvider.parseText(parser));
        }
      } else if (eventType == XmlPullParser.END_TAG) {
        if (parser.getName().equals(ConferenceMediumPacketExtension.ELEMENT_NAME)) {
          done = true;
        }
      }
    }

    return ext;
  }
  public XmlPullParserException(String msg, XmlPullParser parser, Throwable chain) {
    super(
        (msg == null ? "" : msg + " ")
            + (parser == null ? "" : "(position:" + parser.getPositionDescription() + ") ")
            + (chain == null ? "" : "caused by: " + chain));

    if (parser != null) {
      this.row = parser.getLineNumber();
      this.column = parser.getColumnNumber();
    }
    this.detail = chain;
  }
  private Tweets parse(XmlPullParser aParser) throws Exception {
    tweets = new Tweets();

    int _e = aParser.next();
    while (_e != XmlPullParser.END_DOCUMENT) {
      if (_e == XmlPullParser.START_TAG) {
        startTag(aParser.getPrefix(), aParser.getName(), aParser);
      }
      _e = aParser.next();
    }

    return tweets;
  }
Example #6
0
 /**
  * We have a referral to another repository. Just create another parser and read it inline.
  *
  * @param parser
  */
 void referral(XmlPullParser parser) {
   // TODO handle depth!
   try {
     parser.require(XmlPullParser.START_TAG, null, "referral");
     // String depth = parser.getAttributeValue(null, "depth");
     String path = parser.getAttributeValue(null, "url");
     URL url = new URL(this.url, path);
     parseDocument(url);
     parser.next();
     parser.require(XmlPullParser.END_TAG, null, "referral");
   } catch (Exception e) {
     e.printStackTrace();
   }
 }
  /**
   * Parse start of element from document. Ignores character data to next start or end tag, but
   * throws exception if an end tag is seen before a start tag, or if the start tag seen does not
   * match the expected name.
   *
   * @param tag element name expected
   * @throws IOException if error reading document
   * @throws XmlPullParserException if expected element not found, or if other parse error
   */
  protected void parseStartTag(String tag) throws IOException, XmlPullParserException {
    while (true) {
      switch (m_parser.next()) {
        case XmlPullParser.START_TAG:
          m_parser.readStartTag(m_startTag);
          if (m_startTag.getLocalName().equals(tag)) {
            return;
          }
          // fall through for error handling

        case XmlPullParser.END_TAG:
        case XmlPullParser.END_DOCUMENT:
          throw new XmlPullParserException("Missing expected start tag " + tag);
      }
    }
  }
Example #8
0
  public static Iq parse(XmlPullParser parser) throws XmlPullParserException, java.io.IOException {
    Iq iq = new Iq();
    iq.parseStanza(parser);

    while (parser.next() == XmlPullParser.START_TAG) {
      final String xmlns = parser.getNamespace();
      if (xmlns != null) {
        ChildElement child = Stanza.parseChild(xmlns, parser);
        if (child != null) {
          iq.addChild(child);
        } else {
          XmlUtils.skip(parser);
        }
      } else {
        XmlUtils.skip(parser);
      }
    }
    return iq;
  }
  /**
   * Parse end of element from document. Collects character data to the end tag and returns it with
   * whitespace stripped. Throws an exception if a start tag is seen before an end tag, or if the
   * end tag seen does not match the expected name.
   *
   * @param tag element name expected
   * @return content text with whitespace stripped
   * @throws IOException if error reading document
   * @throws XmlPullParserException if expected element not found, or if other parse error
   */
  protected String parseEndTag(String tag) throws IOException, XmlPullParserException {
    m_buffer.setLength(0);
    while (true) {
      switch (m_parser.next()) {
        case XmlPullParser.CONTENT:
          m_buffer.append(m_parser.readContent());
          break;

        case XmlPullParser.END_TAG:
          m_parser.readEndTag(m_endTag);
          if (m_endTag.getLocalName().equals(tag)) {
            return m_buffer.toString().trim();
          }
          // fall through for error handling

        case XmlPullParser.START_TAG:
        case XmlPullParser.END_DOCUMENT:
          throw new XmlPullParserException("Missing expected end tag " + tag);
      }
    }
  }
Example #10
0
  /**
   * Parses a User extension sub-packet and creates a {@link UserPacketExtension} instance. At the
   * beginning of the method call, the xml parser will be positioned on the opening element of the
   * packet extension. As required by the smack API, at the end of the method call, the parser will
   * be positioned on the closing element of the packet extension.
   *
   * @param parser an XML parser positioned at the opening <tt>User</tt> element.
   * @return a new {@link UserPacketExtension} instance.
   * @throws java.lang.Exception if an error occurs parsing the XML.
   */
  public UserPacketExtension parseExtension(XmlPullParser parser) throws Exception {
    boolean done = false;
    int eventType;
    String elementName = null;
    String entity = parser.getAttributeValue("", UserPacketExtension.ENTITY_ATTR_NAME);
    StateType state = StateType.full;
    String stateStr = parser.getAttributeValue("", UserPacketExtension.STATE_ATTR_NAME);

    if (stateStr != null) {
      state = StateType.parseString(stateStr);
    }

    if (entity == null) {
      throw new Exception("Coin user element must contain entity attribute");
    }

    UserPacketExtension ext = new UserPacketExtension(entity);
    ext.setAttribute(UserPacketExtension.STATE_ATTR_NAME, state);

    while (!done) {
      eventType = parser.next();
      elementName = parser.getName();

      if (eventType == XmlPullParser.START_TAG) {
        if (elementName.equals(UserPacketExtension.ELEMENT_DISPLAY_TEXT)) {
          ext.setDisplayText(CoinIQProvider.parseText(parser));
        } else if (elementName.equals(EndpointPacketExtension.ELEMENT_NAME)) {
          PacketExtensionProvider provider = new EndpointProvider();
          PacketExtension childExtension = provider.parseExtension(parser);
          ext.addChildExtension(childExtension);
        }
      } else if (eventType == XmlPullParser.END_TAG) {
        if (parser.getName().equals(UserPacketExtension.ELEMENT_NAME)) {
          done = true;
        }
      }
    }

    return ext;
  }
  /**
   * Parse and process trade history information stream.
   *
   * @param in XML document reader
   * @throws IOException if error reading document
   * @throws XmlPullParserException on document parse error
   */
  public void parse(Reader in) throws IOException, XmlPullParserException {

    // set document source for parse
    m_parser.reset();
    m_parser.setInput(in);

    // main pull parsing loop
    byte type;
    while ((type = m_parser.next()) != XmlPullParser.END_DOCUMENT) {

      // ignore everything other than a start tag
      if (type == XmlPullParser.START_TAG) {

        // process the start tags we're interested in
        m_parser.readStartTag(m_startTag);
        String lname = m_startTag.getLocalName();
        if (lname.equals(STOCK_ELEMENT_NAME)) {
          parseStockTrade();
        } else if (lname.equals(OPTION_ELEMENT_NAME)) {
          parseOptionTrade();
        }
      }
    }
  }
  public static void main(String[] args) {
    try {
      MysqlBggRepository rep = new MysqlBggRepository();
      try {
        for (BggGame game : rep.getCorrelatedGamesList()) {
          URL url =
              new URL(
                  "http://www.boardgamegeek.com/xmlapi/boardgame/" + game.getBggId() + "?stats=1");
          InputStream is = url.openStream();

          XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
          parser.setInput(is, "UTF8");

          int result = parser.getEventType();

          boolean ratingFound = false;
          while (result != XmlPullParser.END_DOCUMENT) {
            if (result == XmlPullParser.START_TAG) {
              if ("average".equals(parser.getName())) {
                Float rating = Float.parseFloat(parser.nextText());
                game.setAvgBggRating(rating);
                rep.setAvgBggRating(game, rating);
                if (ratingFound) {
                  throw new RuntimeException("Already found one rating");
                } else {
                  System.out.println(
                      "Set (" + game.getBggId() + ") " + game.getName() + " to: " + rating);
                  ratingFound = true;
                }
              }
            }
            result = parser.next();
          }
        }
      } finally {
        try {
          rep.close();
        } catch (Exception e) {
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
Example #13
0
  /**
   * Retrieve DiscoverInfo for a specific node.
   *
   * @param caps the <tt>Caps</tt> i.e. the node, the hash and the ver
   * @return The corresponding DiscoverInfo or null if none is known.
   */
  public static DiscoverInfo getDiscoverInfoByCaps(Caps caps) {
    synchronized (caps2discoverInfo) {
      DiscoverInfo discoverInfo = caps2discoverInfo.get(caps);

      /*
       * If we don't have the discoverInfo in the runtime cache yet, we
       * may have it remembered in a previous application instance.
       */
      if (discoverInfo == null) {
        ConfigurationService configurationService = getConfigService();
        String capsPropertyName = getCapsPropertyName(caps);
        String xml = configurationService.getString(capsPropertyName);

        if ((xml != null) && (xml.length() != 0)) {
          IQProvider discoverInfoProvider =
              (IQProvider)
                  ProviderManager.getInstance()
                      .getIQProvider("query", "http://jabber.org/protocol/disco#info");

          if (discoverInfoProvider != null) {
            XmlPullParser parser = new MXParser();

            try {
              parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
              parser.setInput(new StringReader(xml));
              // Start the parser.
              parser.next();
            } catch (XmlPullParserException xppex) {
              parser = null;
            } catch (IOException ioex) {
              parser = null;
            }

            if (parser != null) {
              try {
                discoverInfo = (DiscoverInfo) discoverInfoProvider.parseIQ(parser);
              } catch (Exception ex) {
              }

              if (discoverInfo != null) {
                if (caps.isValid(discoverInfo)) caps2discoverInfo.put(caps, discoverInfo);
                else {
                  logger.error(
                      "Invalid DiscoverInfo for " + caps.getNodeVer() + ": " + discoverInfo);
                  /*
                   * The discoverInfo doesn't seem valid
                   * according to the caps which means that we
                   * must have stored invalid information.
                   * Delete the invalid information in order
                   * to not try to validate it again.
                   */
                  configurationService.removeProperty(capsPropertyName);
                }
              }
            }
          }
        }
      }
      return discoverInfo;
    }
  }
 private void startTag(String aPrefix, String aName, XmlPullParser aParser) throws Exception {
   if ("entry".equals(aName)) {
     tweets.addTweet(currentTweet = new Tweet());
   } else if ("published".equals(aName)) {
     aParser.next();
     currentTweet.setPublished(dateFormat.parse(aParser.getText()));
   } else if (("title".equals(aName)) && (currentTweet != null)) {
     aParser.next();
     currentTweet.setTitle(aParser.getText());
   } else if ("content".equals(aName)) {
     Content _c = new Content();
     _c.setType(aParser.getAttributeValue(null, "type"));
     aParser.next();
     _c.setValue(aParser.getText());
     currentTweet.setContent(_c);
   } else if ("lang".equals(aName)) {
     aParser.next();
     currentTweet.setLanguage(aParser.getText());
   } else if ("author".equals(aName)) {
     currentTweet.setAuthor(currentAuthor = new Author());
   } else if ("name".equals(aName)) {
     aParser.next();
     currentAuthor.setName(aParser.getText());
   } else if ("uri".equals(aName)) {
     aParser.next();
     currentAuthor.setUri(aParser.getText());
   }
 }
 @Override
 public Tweets read(InputStream anInputStream) throws Exception {
   XmlPullParser _p = f.newPullParser();
   _p.setInput(anInputStream, "utf-8");
   return parse(_p);
 }
Example #16
0
 public Object readInstance(
     XmlPullParser parser, String namespace, String name, PropertyInfo expected)
     throws IOException, XmlPullParserException {
   return IsoDate.stringToDate(parser.nextText(), IsoDate.DATE_TIME);
 }
Example #17
0
  /**
   * Parse the repository.
   *
   * @param parser
   * @throws Exception
   */
  private void parseRepository(XmlPullParser parser) throws Exception {
    try {
      parser.require(XmlPullParser.START_DOCUMENT, null, null);
      parser.nextTag();
      if (parser.getName().equals("bundles")) parseOscar(parser);
      else {
        parser.require(XmlPullParser.START_TAG, null, "repository");
        date = parser.getAttributeValue(null, "lastmodified");
        name = parser.getAttributeValue(null, "name");
        if (name == null) name = "Untitled";

        while (parser.nextTag() == XmlPullParser.START_TAG) {
          if (parser.getName().equals("resource")) {
            ResourceImpl resource = new ResourceImpl(this, parser);
            resources.add(resource);
          } else if (parser.getName().equals("referral")) referral(parser);
          else
            throw new IllegalArgumentException(
                "Invalid tag in repository: " + url + " " + parser.getName());
        }
        parser.require(XmlPullParser.END_TAG, null, "repository");
      }
    } catch (XmlPullParserException e) {
      e.printStackTrace();
      throw new IllegalArgumentException(
          "XML unregognized around: " + e.getLineNumber() + " " + e.getMessage());
    }
  }
Example #18
0
  /**
   * Parses the given <tt>parser</tt> in order to create a <tt>FileElement</tt> from it.
   *
   * @param parser the parser to parse
   * @see IQProvider#parseIQ(XmlPullParser)
   */
  public IQ parseIQ(final XmlPullParser parser) throws Exception {
    boolean done = false;

    // si
    String id = parser.getAttributeValue("", "id");
    String mimeType = parser.getAttributeValue("", "mime-type");
    StreamInitiation initiation = new StreamInitiation();

    // file
    String name = null;
    String size = null;
    String hash = null;
    String date = null;
    String desc = null;
    ThumbnailElement thumbnail = null;
    boolean isRanged = false;

    // feature
    DataForm form = null;
    DataFormProvider dataFormProvider = new DataFormProvider();

    int eventType;
    String elementName;
    String namespace;

    while (!done) {
      eventType = parser.next();
      elementName = parser.getName();
      namespace = parser.getNamespace();

      if (eventType == XmlPullParser.START_TAG) {
        if (elementName.equals("file")) {
          name = parser.getAttributeValue("", "name");
          size = parser.getAttributeValue("", "size");
          hash = parser.getAttributeValue("", "hash");
          date = parser.getAttributeValue("", "date");
        } else if (elementName.equals("desc")) {
          desc = parser.nextText();
        } else if (elementName.equals("range")) {
          isRanged = true;
        } else if (elementName.equals("x") && namespace.equals("jabber:x:data")) {
          form = (DataForm) dataFormProvider.parseExtension(parser);
        } else if (elementName.equals("thumbnail")) {
          thumbnail = new ThumbnailElement(parser.getText());
        }
      } else if (eventType == XmlPullParser.END_TAG) {
        if (elementName.equals("si")) {
          done = true;
        }
        // The name-attribute is required per XEP-0096, so ignore the
        // IQ if the name is not set to avoid exceptions. Particularly,
        // the SI response of Empathy contains an invalid, empty
        // file-tag.
        else if (elementName.equals("file") && name != null) {
          long fileSize = 0;

          if (size != null && size.trim().length() != 0) {
            try {
              fileSize = Long.parseLong(size);
            } catch (NumberFormatException e) {
              logger.warn(
                  "Received an invalid file size," + " continuing with fileSize set to 0", e);
            }
          }

          FileElement file = new FileElement(name, fileSize);
          file.setHash(hash);

          if (date != null) {
            // try all known date formats
            boolean found = false;
            if (date.matches(".*?T\\d+:\\d+:\\d+(\\.\\d+)?(\\+|-)\\d+:\\d+")) {
              int timeZoneColon = date.lastIndexOf(":");
              date =
                  date.substring(0, timeZoneColon)
                      + date.substring(timeZoneColon + 1, date.length());
            }
            for (DateFormat fmt : DATE_FORMATS) {
              try {
                file.setDate(fmt.parse(date));
                found = true;
                break;
              } catch (ParseException ex) {
              }
            }

            if (!found) {
              logger.warn("Unknown dateformat on incoming file transfer: " + date);
            }
          }

          if (thumbnail != null) file.setThumbnailElement(thumbnail);

          file.setDesc(desc);
          file.setRanged(isRanged);
          initiation.setFile(file);
        }
      }
    }

    initiation.setSesssionID(id);
    initiation.setMimeType(mimeType);
    initiation.setFeatureNegotiationForm(form);

    return initiation;
  }
Example #19
0
  /**
   * Parse an old style OBR repository.
   *
   * <p><dtd-version>1.0</dtd-version> <repository> <name>Oscar Bundle Repository</name>
   * <url>http://oscar-osgi.sourceforge.net/</url> <date>Fri May 07 16:45:07 CEST 2004</date>
   * <extern-repositories>
   * <!--
   * Stefano Lenzi ([email protected]) -->
   * <url>http://domoware.isti.cnr.it/osgi-obr/niche-osgi-obr.xml</url>
   * <!--Manuel Palencia ([email protected]) -->
   * <!--
   * <url>http://jmood.forge.os4os.org/repository.xml</url> -->
   * <!-- Enrique
   * Rodriguez ([email protected]) -->
   * <url>http://update.cainenable.org/repository.xml</url> </extern-repositories> </repository>
   * <bundle> <bundle-name>Bundle Repository</bundle-name> <bundle-description> A bundle repository
   * service for Oscar. </bundle-description> <bundle-updatelocation>
   * http://oscar-osgi.sf.net/repo/bundlerepository/bundlerepository.jar </bundle-updatelocation>
   * <bundle-sourceurl> http://oscar-osgi.sf.net/repo/bundlerepository/bundlerepository-src.jar
   * </bundle-sourceurl> <bundle-version>1.1.3</bundle-version> <bundle-docurl>
   * http://oscar-osgi.sf.net/repo/bundlerepository/ </bundle-docurl>
   * <bundle-category>General</bundle-category> <import-package package="org.osgi.framework"/>
   * <export-package package="org.ungoverned.osgi.service.bundlerepository"
   * specification-version="1.1.0"/> </bundle> *
   */
  private void parseOscar(XmlPullParser parser) throws Exception {
    parser.require(XmlPullParser.START_TAG, null, "bundles");
    while (true) {
      int event = parser.next();

      // Error ..
      if (event == XmlPullParser.TEXT) event = parser.next();

      if (event != XmlPullParser.START_TAG) break;

      ResourceImpl resource = new ResourceImpl(this);

      if (parser.getName().equals("bundle")) {
        while (parser.nextTag() == XmlPullParser.START_TAG) {
          String key = parser.getName();
          if (key.equals("import-package")) {
            RequirementImpl requirement = new RequirementImpl("package");

            requirement.setOptional(false);
            requirement.setMultiple(false);

            String p = parser.getAttributeValue(null, "package");
            StringBuffer sb = new StringBuffer();
            sb.append("(&(package=");
            sb.append(p);
            sb.append(")");
            String version = parser.getAttributeValue(null, "specification-version");
            VersionRange v = new VersionRange("0");
            if (version != null) {
              sb.append("(version=");
              sb.append(v = new VersionRange(version));
              sb.append(")");
            }
            sb.append(")");
            requirement.setFilter(sb.toString());
            requirement.setComment("Import-Package: " + p + ";" + v);
            resource.addRequirement(requirement);

            parser.nextTag();
          } else if (key.equals("export-package")) {
            CapabilityImpl capability = new CapabilityImpl("package");
            capability.addProperty("package", parser.getAttributeValue(null, "package"));
            String version = parser.getAttributeValue(null, "specification-version");
            if (version != null) {
              capability.addProperty("version", new VersionRange(version));
            }
            resource.addCapability(capability);
            parser.nextTag();
          } else {
            String value = parser.nextText().trim();
            if (key.equals("bundle-sourceurl")) resource.setSource(new URL(value));
            else if (key.equals("bundle-docurl")) resource.setDocumentation(new URL(value));
            else if (key.equals("bundle-updatelocation")) resource.setURL(new URL(value));
            else if (key.equals("bundle-description")) resource.setDescription(value);
            else if (key.equals("bundle-category")) resource.addCategory(value);
            else if (key.equals("bundle-name")) {
              resource.setName(value);
              resource.setPresentationName(value);
            } else if (key.equals("bundle-version")) resource.setVersion(new VersionRange(value));
            else {
              resource.put(key, value);
            }
          }
        }
        resources.add(resource);
        parser.require(XmlPullParser.END_TAG, null, "bundle");
      } else if (parser.getName().equals("repository")) {
        parser.require(XmlPullParser.START_TAG, null, "repository");
        while (parser.nextTag() == XmlPullParser.START_TAG) {
          String tag = parser.getName();
          if (tag.equals("name")) {
            String name = parser.nextText();
            if (this.name == null) this.name = name.trim();
          } else if (tag.equals("url")) parser.nextText().trim();
          else if (tag.equals("date")) parser.nextText().trim();
          else if (tag.equals("extern-repositories")) {
            parser.require(XmlPullParser.START_TAG, null, "extern-repositories");
            while (parser.nextTag() == XmlPullParser.START_TAG) {
              if (parser.getName().equals("url")) parseDocument(new URL(parser.nextText().trim()));
              else
                throw new IllegalArgumentException(
                    "Invalid tag in repository while parsing extern repositories: "
                        + url
                        + " "
                        + parser.getName());
            }
            parser.require(XmlPullParser.END_TAG, null, "extern-repositories");
          } else
            throw new IllegalArgumentException(
                "Invalid tag in repository: " + url + " " + parser.getName());
        }
        parser.require(XmlPullParser.END_TAG, null, "repository");
      } else if (parser.getName().equals("dtd-version")) {
        parser.nextText();
      } else
        throw new IllegalArgumentException(
            "Invalid tag in repository: " + url + " " + parser.getName());
    }
    parser.require(XmlPullParser.END_TAG, null, "bundles");
  }