Ejemplo n.º 1
0
  /**
   * Parses the XPointer framework expression and delegates scheme specific parsing.
   *
   * @see
   *     com.sun.org.apache.xerces.internal.xpointer.XPointerProcessor#parseXPointer(java.lang.String)
   */
  public void parseXPointer(String xpointer) throws XNIException {

    // Initialize
    init();

    // tokens
    final Tokens tokens = new Tokens(fSymbolTable);

    // scanner
    Scanner scanner =
        new Scanner(fSymbolTable) {
          protected void addToken(Tokens tokens, int token) throws XNIException {
            if (token == Tokens.XPTRTOKEN_OPEN_PAREN
                || token == Tokens.XPTRTOKEN_CLOSE_PAREN
                || token == Tokens.XPTRTOKEN_SCHEMENAME
                || token == Tokens.XPTRTOKEN_SCHEMEDATA
                || token == Tokens.XPTRTOKEN_SHORTHAND) {
              super.addToken(tokens, token);
              return;
            }
            reportError("InvalidXPointerToken", new Object[] {tokens.getTokenString(token)});
          }
        };

    // scan the XPointer expression
    int length = xpointer.length();
    boolean success = scanner.scanExpr(fSymbolTable, tokens, xpointer, 0, length);

    if (!success) reportError("InvalidXPointerExpression", new Object[] {xpointer});

    while (tokens.hasMore()) {
      int token = tokens.nextToken();

      switch (token) {
        case Tokens.XPTRTOKEN_SHORTHAND:
          {

            // The shortHand name
            token = tokens.nextToken();
            String shortHandPointerName = tokens.getTokenString(token);

            if (shortHandPointerName == null) {
              reportError("InvalidXPointerExpression", new Object[] {xpointer});
            }

            XPointerPart shortHandPointer = new ShortHandPointer(fSymbolTable);
            shortHandPointer.setSchemeName(shortHandPointerName);
            fXPointerParts.add(shortHandPointer);
            break;
          }
        case Tokens.XPTRTOKEN_SCHEMENAME:
          {

            // Retreive the local name and prefix to form the scheme name
            token = tokens.nextToken();
            String prefix = tokens.getTokenString(token);
            token = tokens.nextToken();
            String localName = tokens.getTokenString(token);

            String schemeName = prefix + localName;

            // The next character should be an open parenthesis
            int openParenCount = 0;
            int closeParenCount = 0;

            token = tokens.nextToken();
            String openParen = tokens.getTokenString(token);
            if (openParen != "XPTRTOKEN_OPEN_PAREN") {

              // can not have more than one ShortHand Pointer
              if (token == Tokens.XPTRTOKEN_SHORTHAND) {
                reportError("MultipleShortHandPointers", new Object[] {xpointer});
              } else {
                reportError("InvalidXPointerExpression", new Object[] {xpointer});
              }
            }
            openParenCount++;

            // followed by zero or more ( and  the schemeData
            String schemeData = null;
            while (tokens.hasMore()) {
              token = tokens.nextToken();
              schemeData = tokens.getTokenString(token);
              if (schemeData != "XPTRTOKEN_OPEN_PAREN") {
                break;
              }
              openParenCount++;
            }
            token = tokens.nextToken();
            schemeData = tokens.getTokenString(token);

            // followed by the same number of )
            token = tokens.nextToken();
            String closeParen = tokens.getTokenString(token);
            if (closeParen != "XPTRTOKEN_CLOSE_PAREN") {
              reportError("SchemeDataNotFollowedByCloseParenthesis", new Object[] {xpointer});
            }
            closeParenCount++;

            while (tokens.hasMore()) {
              if (tokens.getTokenString(tokens.peekToken()) != "XPTRTOKEN_OPEN_PAREN") {
                break;
              }
              closeParenCount++;
            }

            // check if the number of open parenthesis are equal to the number of close parenthesis
            if (openParenCount != closeParenCount) {
              reportError(
                  "UnbalancedParenthesisInXPointerExpression",
                  new Object[] {
                    xpointer, new Integer(openParenCount), new Integer(closeParenCount)
                  });
            }

            // Perform scheme specific parsing of the pointer part
            if (schemeName.equals(ELEMENT_SCHEME_NAME)) {
              XPointerPart elementSchemePointer =
                  new ElementSchemePointer(fSymbolTable, fErrorReporter);
              elementSchemePointer.setSchemeName(schemeName);
              elementSchemePointer.setSchemeData(schemeData);

              // If an exception occurs while parsing the element() scheme expression
              // ignore it and move on to the next pointer part
              try {
                elementSchemePointer.parseXPointer(schemeData);
                fXPointerParts.add(elementSchemePointer);
              } catch (XNIException e) {
                // Re-throw the XPointer element() scheme syntax error.
                throw new XNIException(e);
              }

            } else {
              // ????
              reportWarning("SchemeUnsupported", new Object[] {schemeName});
            }

            break;
          }
        default:
          reportError("InvalidXPointerExpression", new Object[] {xpointer});
      }
    }
  }