Exemplo n.º 1
0
 public Source resolve(String href, String base) throws TransformerException {
   if (href == null || href.trim().length() == 0) {
     throw new TransformerException("href is null");
   }
   try {
     String aname = defaultXslStylesheetBase + href;
     if (aname.indexOf("..") != -1) {
       aname = new File(aname).getCanonicalPath().toString();
     }
     if (m_bundleContect.getBundle().getEntry(aname) == null) {
       aname = defaultXslStylesheetBase2 + href;
     }
     if (m_bundleContect.getBundle().getEntry(aname) == null) {
       aname = defaultXslStylesheetBase3 + href;
     }
     SAXSource ss =
         new SAXSource(new InputSource(m_bundleContect.getBundle().getEntry(aname).openStream()));
     XMLReader reader = m_saxParserFactory.newSAXParser().getXMLReader();
     ReaderConfig rc = ((WstxSAXParser) reader).getStaxConfig();
     rc.setXMLResolver(new XslURIResolver(m_bundleContect, m_saxParserFactory));
     ss.setXMLReader(reader);
     return ss;
   } catch (Exception e) {
     throw new RuntimeException("XslURIResolver.resolve", e);
   }
 }
Exemplo n.º 2
0
  public Reader bootstrapInput(ReaderConfig cfg, boolean mainDoc, int xmlVersion)
      throws IOException, XMLStreamException {
    String normEnc = null;

    // First, let's get the buffers...
    int bufSize = cfg.getInputBufferLength();
    if (bufSize < MIN_BUF_SIZE) {
      bufSize = MIN_BUF_SIZE;
    }
    if (mByteBuffer == null) { // non-null if we were passed a buffer
      mByteBuffer = cfg.allocFullBBuffer(bufSize);
    }

    resolveStreamEncoding();

    if (hasXmlDecl()) {
      // note: readXmlDecl will set mXml11Handling too
      readXmlDecl(mainDoc, xmlVersion);
      if (mFoundEncoding != null) {
        normEnc = verifyXmlEncoding(mFoundEncoding);
      }
    } else {
      /* We'll actually then just inherit whatever main doc had...
       * (or in case there was no parent, just copy the 'unknown')
       */
      mXml11Handling = (XmlConsts.XML_V_11 == xmlVersion);
    }

    // Now, have we figured out the encoding?

    if (normEnc == null) { // not via xml declaration
      /* 21-Sep-2007, TSa: As with any non-UTF-8 encoding, declaration
       * isn't optional any more. Besides, we need that information
       * anyway to know which variant it is.
       */
      if (mEBCDIC) {
        if (mFoundEncoding == null || mFoundEncoding.length() == 0) {
          reportXmlProblem(
              "Missing encoding declaration: underlying encoding looks like an EBCDIC variant, but no xml encoding declaration found");
        }
        // Hmmh. What should be the canonical name? Let's just use found encoding?
        normEnc = mFoundEncoding;
      } else if (mBytesPerChar == 2) { // UTF-16, BE/LE
        normEnc = mBigEndian ? CharsetNames.CS_UTF16BE : CharsetNames.CS_UTF16LE;
      } else if (mBytesPerChar == 4) { // UCS-4... ?
        /* 22-Mar-2005, TSa: JDK apparently has no way of dealing
         *   with these encodings... not sure if and how it should
         *   be dealt with, really. Name could be UCS-4xx... or
         *   perhaps UTF-32xx
         */
        normEnc = mBigEndian ? CharsetNames.CS_UTF32BE : CharsetNames.CS_UTF32LE;
      } else {
        // Ok, default has to be UTF-8, as per XML specs
        normEnc = CharsetNames.CS_UTF8;
      }
    }

    mInputEncoding = normEnc;

    /* And then the reader. Let's figure out if we can use our own fast
     * implementations first:
     */
    BaseReader r;

    // Normalized, can thus use straight equality checks now
    if (normEnc == CharsetNames.CS_UTF8) {
      r = new UTF8Reader(cfg, mIn, mByteBuffer, mInputPtr, mInputEnd, mRecycleBuffer);
    } else if (normEnc == CharsetNames.CS_ISO_LATIN1) {
      r = new ISOLatinReader(cfg, mIn, mByteBuffer, mInputPtr, mInputEnd, mRecycleBuffer);
    } else if (normEnc == CharsetNames.CS_US_ASCII) {
      r = new AsciiReader(cfg, mIn, mByteBuffer, mInputPtr, mInputEnd, mRecycleBuffer);
    } else if (normEnc.startsWith(CharsetNames.CS_UTF32)) {
      // let's augment with actual endianness info
      if (normEnc == CharsetNames.CS_UTF32) {
        mInputEncoding = mBigEndian ? CharsetNames.CS_UTF32BE : CharsetNames.CS_UTF32LE;
      }
      r = new UTF32Reader(cfg, mIn, mByteBuffer, mInputPtr, mInputEnd, mRecycleBuffer, mBigEndian);
    } else {
      // Nah, JDK needs to try it
      // Ok; first, do we need to merge stuff back?
      InputStream in = mIn;
      if (mInputPtr < mInputEnd) {
        in = new MergedStream(cfg, in, mByteBuffer, mInputPtr, mInputEnd);
      }
      /* 20-Jan-2006, TSa: Ok; although it is possible to declare
       *   stream as 'UTF-16', JDK may need help in figuring out
       *   the right order, so let's be explicit:
       */
      if (normEnc == CharsetNames.CS_UTF16) {
        mInputEncoding = normEnc = mBigEndian ? CharsetNames.CS_UTF16BE : CharsetNames.CS_UTF16LE;
      }
      try {
        return new InputStreamReader(in, normEnc);
      } catch (UnsupportedEncodingException usex) {
        throw new WstxIOException("Unsupported encoding: " + usex.getMessage());
      }
    }

    if (mXml11Handling) {
      r.setXmlCompliancy(XmlConsts.XML_V_11);
    }

    return r;
  }