private void addNamespaceDeclarations() {
    String prefix = null;
    String localpart = null;
    String rawname = null;
    String nsPrefix = null;
    String nsURI = null;

    final Iterator iter = fDeclaredPrefixes.iterator();
    while (iter.hasNext()) {
      nsPrefix = (String) iter.next();
      nsURI = fNamespaceContext.getURI(nsPrefix);
      if (nsPrefix.length() > 0) {
        prefix = XMLSymbols.PREFIX_XMLNS;
        localpart = nsPrefix;
        fStringBuffer.clear();
        fStringBuffer.append(prefix);
        fStringBuffer.append(':');
        fStringBuffer.append(localpart);
        rawname =
            fSymbolTable.addSymbol(fStringBuffer.ch, fStringBuffer.offset, fStringBuffer.length);
      } else {
        prefix = XMLSymbols.EMPTY_STRING;
        localpart = XMLSymbols.PREFIX_XMLNS;
        rawname = XMLSymbols.PREFIX_XMLNS;
      }
      fAttributeQName.setValues(prefix, localpart, rawname, NamespaceContext.XMLNS_URI);
      fAttributes.addAttribute(
          fAttributeQName,
          XMLSymbols.fCDATASymbol,
          (nsURI != null) ? nsURI : XMLSymbols.EMPTY_STRING);
    }
  }
 /** Fills in a QName object. */
 final void fillQName(QName toFill, String uri, String localpart, String prefix) {
   uri = (uri != null && uri.length() > 0) ? fSymbolTable.addSymbol(uri) : null;
   localpart = (localpart != null) ? fSymbolTable.addSymbol(localpart) : XMLSymbols.EMPTY_STRING;
   prefix =
       (prefix != null && prefix.length() > 0)
           ? fSymbolTable.addSymbol(prefix)
           : XMLSymbols.EMPTY_STRING;
   String raw = localpart;
   if (prefix != XMLSymbols.EMPTY_STRING) {
     fStringBuffer.clear();
     fStringBuffer.append(prefix);
     fStringBuffer.append(':');
     fStringBuffer.append(localpart);
     raw = fSymbolTable.addSymbol(fStringBuffer.ch, fStringBuffer.offset, fStringBuffer.length);
   }
   toFill.setValues(prefix, localpart, raw, uri);
 }
 public String getURI(String prefix) {
   if (fNamespaceContext != null) {
     String uri = fNamespaceContext.getNamespaceURI(prefix);
     if (uri != null && !XMLConstants.NULL_NS_URI.equals(uri)) {
       return (fSymbolTable != null) ? fSymbolTable.addSymbol(uri) : uri.intern();
     }
   }
   return null;
 }
 public void startPrefixMapping(String prefix, String uri) throws SAXException {
   String prefixSymbol;
   String uriSymbol;
   if (!fStringsInternalized) {
     prefixSymbol = (prefix != null) ? fSymbolTable.addSymbol(prefix) : XMLSymbols.EMPTY_STRING;
     uriSymbol = (uri != null && uri.length() > 0) ? fSymbolTable.addSymbol(uri) : null;
   } else {
     prefixSymbol = (prefix != null) ? prefix : XMLSymbols.EMPTY_STRING;
     uriSymbol = (uri != null && uri.length() > 0) ? uri : null;
   }
   if (fNeedPushNSContext) {
     fNeedPushNSContext = false;
     fNamespaceContext.pushContext();
   }
   fNamespaceContext.declarePrefix(prefixSymbol, uriSymbol);
   if (fContentHandler != null) {
     fContentHandler.startPrefixMapping(prefix, uri);
   }
 }
 public String getPrefix(String uri) {
   if (fNamespaceContext != null) {
     if (uri == null) {
       uri = XMLConstants.NULL_NS_URI;
     }
     String prefix = fNamespaceContext.getPrefix(uri);
     if (prefix == null) {
       prefix = XMLConstants.DEFAULT_NS_PREFIX;
     }
     return (fSymbolTable != null) ? fSymbolTable.addSymbol(prefix) : prefix.intern();
   }
   return null;
 }
 /** Fills in a QName object. */
 private void fillQName(QName toFill, String uri, String localpart, String raw) {
   if (!fStringsInternalized) {
     uri = (uri != null && uri.length() > 0) ? fSymbolTable.addSymbol(uri) : null;
     localpart = (localpart != null) ? fSymbolTable.addSymbol(localpart) : XMLSymbols.EMPTY_STRING;
     raw = (raw != null) ? fSymbolTable.addSymbol(raw) : XMLSymbols.EMPTY_STRING;
   } else {
     if (uri != null && uri.length() == 0) {
       uri = null;
     }
     if (localpart == null) {
       localpart = XMLSymbols.EMPTY_STRING;
     }
     if (raw == null) {
       raw = XMLSymbols.EMPTY_STRING;
     }
   }
   String prefix = XMLSymbols.EMPTY_STRING;
   int prefixIdx = raw.indexOf(':');
   if (prefixIdx != -1) {
     prefix = fSymbolTable.addSymbol(raw.substring(0, prefixIdx));
   }
   toFill.setValues(prefix, localpart, raw, uri);
 }
Exemple #7
0
    /** Scans the XPointer Expression */
    private boolean scanExpr(
        SymbolTable symbolTable, Tokens tokens, String data, int currentOffset, int endOffset)
        throws XNIException {

      int ch;
      int openParen = 0;
      int closeParen = 0;
      int nameOffset, dataOffset;
      boolean isQName = false;
      String name = null;
      String prefix = null;
      String schemeData = null;
      StringBuffer schemeDataBuff = new StringBuffer();

      while (true) {

        if (currentOffset == endOffset) {
          break;
        }
        ch = data.charAt(currentOffset);

        //
        while (ch == ' ' || ch == 0x0A || ch == 0x09 || ch == 0x0D) {
          if (++currentOffset == endOffset) {
            break;
          }
          ch = data.charAt(currentOffset);
        }
        if (currentOffset == endOffset) {
          break;
        }

        //
        // [1]    Pointer      ::=    Shorthand | SchemeBased
        // [2]    Shorthand    ::=    NCName
        // [3]    SchemeBased  ::=    PointerPart (S? PointerPart)*
        // [4]    PointerPart  ::=    SchemeName '(' SchemeData ')'
        // [5]    SchemeName   ::=    QName
        // [6]    SchemeData   ::=    EscapedData*
        // [7]    EscapedData  ::=    NormalChar | '^(' | '^)' | '^^' | '(' SchemeData ')'
        // [8]    NormalChar   ::=    UnicodeChar - [()^]
        // [9]    UnicodeChar  ::=    [#x0-#x10FFFF]
        // [?]    QName        ::=    (NCName ':')? NCName
        // [?]    NCName       ::=    (Letter | '_') (NCNameChar)*
        // [?]    NCNameChar   ::=    Letter | Digit | '.' | '-' | '_'  (ascii subset of
        // 'NCNameChar')
        // [?]    Letter       ::=    [A-Za-z]                              (ascii subset of
        // 'Letter')
        // [?]    Digit        ::=    [0-9]                                  (ascii subset of
        // 'Digit')
        //
        byte chartype = (ch >= 0x80) ? CHARTYPE_NONASCII : fASCIICharMap[ch];

        switch (chartype) {
          case CHARTYPE_OPEN_PAREN: // '('
            addToken(tokens, Tokens.XPTRTOKEN_OPEN_PAREN);
            openParen++;
            ++currentOffset;
            break;

          case CHARTYPE_CLOSE_PAREN: // ')'
            addToken(tokens, Tokens.XPTRTOKEN_CLOSE_PAREN);
            closeParen++;
            ++currentOffset;
            break;

          case CHARTYPE_CARRET:
          case CHARTYPE_COLON:
          case CHARTYPE_DIGIT:
          case CHARTYPE_EQUAL:
          case CHARTYPE_LETTER:
          case CHARTYPE_MINUS:
          case CHARTYPE_NONASCII:
          case CHARTYPE_OTHER:
          case CHARTYPE_PERIOD:
          case CHARTYPE_SLASH:
          case CHARTYPE_UNDERSCORE:
          case CHARTYPE_WHITESPACE:
            // Scanning SchemeName | Shorthand
            if (openParen == 0) {
              nameOffset = currentOffset;
              currentOffset = scanNCName(data, endOffset, currentOffset);

              if (currentOffset == nameOffset) {
                reportError("InvalidShortHandPointer", new Object[] {data});
                return false;
              }

              if (currentOffset < endOffset) {
                ch = data.charAt(currentOffset);
              } else {
                ch = -1;
              }

              name = symbolTable.addSymbol(data.substring(nameOffset, currentOffset));
              prefix = XMLSymbols.EMPTY_STRING;

              // The name is a QName => a SchemeName
              if (ch == ':') {
                if (++currentOffset == endOffset) {
                  return false;
                }

                ch = data.charAt(currentOffset);
                prefix = name;
                nameOffset = currentOffset;
                currentOffset = scanNCName(data, endOffset, currentOffset);

                if (currentOffset == nameOffset) {
                  return false;
                }

                if (currentOffset < endOffset) {
                  ch = data.charAt(currentOffset);
                } else {
                  ch = -1;
                }

                isQName = true;
                name = symbolTable.addSymbol(data.substring(nameOffset, currentOffset));
              }

              // REVISIT:
              if (currentOffset != endOffset) {
                addToken(tokens, Tokens.XPTRTOKEN_SCHEMENAME);
                tokens.addToken(prefix);
                tokens.addToken(name);
                isQName = false;
              } else if (currentOffset == endOffset) {
                // NCName => Shorthand
                addToken(tokens, Tokens.XPTRTOKEN_SHORTHAND);
                tokens.addToken(name);
                isQName = false;
              }

              // reset open/close paren for the next pointer part
              closeParen = 0;

              break;

            } else if (openParen > 0 && closeParen == 0 && name != null) {
              // Scanning SchemeData
              dataOffset = currentOffset;
              currentOffset = scanData(data, schemeDataBuff, endOffset, currentOffset);

              if (currentOffset == dataOffset) {
                reportError("InvalidSchemeDataInXPointer", new Object[] {data});
                return false;
              }

              if (currentOffset < endOffset) {
                ch = data.charAt(currentOffset);
              } else {
                ch = -1;
              }

              schemeData = symbolTable.addSymbol(schemeDataBuff.toString());
              addToken(tokens, Tokens.XPTRTOKEN_SCHEMEDATA);
              tokens.addToken(schemeData);

              // reset open/close paren for the next pointer part
              openParen = 0;
              schemeDataBuff.delete(0, schemeDataBuff.length());

            } else {
              // ex. schemeName()
              // Should we throw an exception with a more suitable message instead??
              return false;
            }
        }
      } // end while
      return true;
    }