OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

docbook-apps message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]


Subject: Re: [docbook-apps] DocBook to text


Hai all,

I have a problem with resolving the relative path of a entity file within a xsl file.

I am using docbook for in my web application

In the Docbook the file named docbook.xsl which includes other xsl files

Among two such included xsl file(autoidx.xsl and glossary.xsl) in the a .ent file in its header as follows

<!DOCTYPE xsl:stylesheet [
<!ENTITY % common.entities SYSTEM "../common/entities.ent">
%common.entities;
]>

Here comes the relative path problem.
I am getting the error

java.lang.Exception: Transformation error:
yanelrepo:/docbook-xsl-1.73.2/html/autoidx.xsl:Line=4;Column=18: exception:Had IO Exception with stylesheet file: autoidx.xsl
root-cause:null
line: logSourceLine unavailable due to: unknown protocol: yanelrepo


All xsl includes are resolved by two java class file written by me
named BasicXMLResource.java and SourceResolver.java

The BasicXMLResource is called from servlet.The getXMLView() is processing the xsl files and call the resolve() method in SourceResolver to resolve the relative path.

////////////////////////////getXSLView//////////////////////////////////////////////////////////////////////////////////////////
public View getXMLView(String viewId, InputStream xmlInputStream) throws Exception {
        View view = new View();
        if (viewId == null) {
            viewId = DEFAULT_VIEW_ID;
        }
        ConfigurableViewDescriptor viewDescriptor = (ConfigurableViewDescriptor)getViewDescriptor(viewId);
        String mimeType = getMimeType(viewId);
        view.setMimeType(mimeType);

        StringWriter errorWriter = new StringWriter();
        try {
            if (viewId != null && viewId.equals(SOURCE_VIEW_ID)) {
                view.setInputStream(xmlInputStream);
                return view;
            }

            // create reader:
            XMLReader xmlReader = XMLReaderFactory.createXMLReader();
            CatalogResolver catalogResolver = new CatalogResolver();
            //SourceEntityResolver sourceEntityResolver = new SourceEntityResolver();
            xmlReader.setEntityResolver(catalogResolver);
            xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);

            SourceResolver uriResolver = new SourceResolver(this);
            ListingErrorHandler errorListener = new ListingErrorHandler(new PrintWriter(errorWriter));

            // create xslt transformer:
            SAXTransformerFactory tf = (SAXTransformerFactory)TransformerFactory.newInstance();
            tf.setURIResolver(uriResolver);
            tf.setErrorListener(errorListener);

            String[] xsltPaths = viewDescriptor.getXSLTPaths();
            if (xsltPaths == null || xsltPaths.length == 0) {
                xsltPaths = getXSLTPath(getPath());
            }
           
            Repository repo = getRealm().getRepository();
            TransformerHandler[] xsltHandlers = new TransformerHandler[xsltPaths.length];
            for (int i = 0; i < xsltPaths.length; i++) {
                // TODO: Use resolver
                if (xsltPaths[i].startsWith("file:")) {
                    log.warn("Scheme: file (" + xsltPaths[i] + ")");
                    xsltHandlers[i] = tf.newTransformerHandler(new StreamSource(new java.io.FileInputStream(xsltPaths[i].substring(5))));
                } else if(xsltPaths[i].startsWith("rthtdocs:")) {
                    log.warn("Scheme: rthtdocs (" + xsltPaths[i] + ")");
                    xsltHandlers[i] = tf.newTransformerHandler(new org.wyona.yanel.core.source.RTHtdocsResolver(this).resolve(xsltPaths[i], null));
                } else {
                    if (xsltPaths[i].indexOf(":/") > 0) {
                        log.error("No such protocol implemented: " + xsltPaths[i].substring(0, xsltPaths[i].indexOf(":/")));
                    } else {
                        if (log.isDebugEnabled()) {
                            log.debug("Default Content repository will be used!");
                        }
                    }
                    xsltHandlers[i] = tf.newTransformerHandler(new StreamSource(repo.getNode(xsltPaths[i]).getInputStream(), "yanelrepo:" + xsltPaths[i]));
                }
                xsltHandlers[i].getTransformer().setURIResolver(uriResolver);
                xsltHandlers[i].getTransformer().setErrorListener(errorListener);
                passTransformerParameters(xsltHandlers[i].getTransformer());
            }

            // create i18n transformer:
            I18nTransformer3 i18nTransformer = new I18nTransformer3(getI18NCatalogueNames(), getRequestedLanguage(), getRealm().getDefaultLanguage(), uriResolver);
            i18nTransformer.setEntityResolver(catalogResolver);

            // create xinclude transformer:
            XIncludeTransformer xIncludeTransformer = new XIncludeTransformer();
            xIncludeTransformer.setResolver(uriResolver);

            // create serializer:
            Serializer serializer = createSerializer(viewDescriptor);

            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            // chain everything together (create a pipeline):
            if (xsltHandlers.length > 0) {
                xmlReader.setContentHandler(xsltHandlers[0]);
                for (int i=0; i<xsltHandlers.length-1; i++) {
                    xsltHandlers[i].setResult(new SAXResult(xsltHandlers[i+1]));
                }
                xsltHandlers[xsltHandlers.length-1].setResult(new SAXResult(xIncludeTransformer));
            } else {
                xmlReader.setContentHandler(new SAXResult(xIncludeTransformer).getHandler());
            }
            xIncludeTransformer.setResult(new SAXResult(i18nTransformer));
            i18nTransformer.setResult(new SAXResult(serializer.asContentHandler()));
            serializer.setOutputStream(baos);
            System.out.println("No error before parse");
            // execute pipeline:
            xmlReader.parse(new InputSource(xmlInputStream));
            System.out.println("No error after parse");

            // write result into view:
            view.setInputStream(new ByteArrayInputStream(baos.toByteArray()));
            return view;
        } catch(Exception e) {
            log.error(e + " (" + getPath() + ", " + getRealm() + ")", e);
            String errorMsg;
            String transformationError = errorWriter.toString();
            if (transformationError != null) {
                errorMsg = "Transformation error:\n" + transformationError;
                log.error(errorMsg);
            } else {
                errorMsg = e.getMessage();
            }
            throw new Exception(errorMsg);
        }

    }
////////////////////////////////////////////////////Inside SourceResolver class///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public InputSource resolveEntity(String href, String base) {
        System.out.println("Entered");
        InputSource result;
        result = super.resolveEntity(href, base);
        result.setSystemId(base);
        return result;
    }   
    /**
     *
     */
    public Source resolve(String uri, String base) throws SourceException {
        if (log.isDebugEnabled()) {
            log.debug("URI to be resolved: " + uri);
            log.debug("Base: "+ base);
        }       
        // NOTE: One cannot use ":/" in order to find the protocol/scheme, because one can also specifiy the realm id and repository id, for example: yanelrepo:REALM_ID:REPO_ID:/foo/bar.gif
        int colonIndex = uri.indexOf(":");
        //int colonIndex = uri.indexOf(":/");
        String uriScheme = "";
        if (colonIndex <= 0) {//Check for scheme in URI, if true, then URI has no scheme
            //log.error("DEBUG: URI has no scheme: " + uri);
            if (base != null) {
                int colBaseIndex = base.indexOf(":");
                //int colBaseIndex = base.indexOf(":/");
                if(colBaseIndex <=0 ){//Check for scheme in Base
                    throw new SourceException("invalid url syntax (missing scheme): " + uri);//no scheme found in uri and base
                }else{//base contains scheme. Use base scheme for uri scheme
                    uriScheme = base.substring(0, colBaseIndex);
                    uri = PathUtil.concat(base,uri);               
                    //log.error("DEBUG: Use scheme of base: " + uriScheme + ", " + uri);
                }
            } else {
                log.error("Neither scheme for URI nor base specified for URI: " + uri);
                throw new SourceException("invalid url syntax (missing scheme): " + uri);//no scheme found in uri and base
            }
        } else {//uri contains scheme
            uriScheme = uri.substring(0, colonIndex);
            //log.error("DEBUG: URI has scheme: " + uriScheme + ", " + uri);
        }

        URIResolver resolver = getResolver(uriScheme);
        if (resolver != null) {
            try {
                // TODO: What shall be used as base?!
                Source s = resolver.resolve(uri, base);
                s.setSystemId(uri);
                return s;
            } catch (TransformerException e) {
                throw new SourceException(e.getMessage(), e);
            }
        } else {
            throw new SourceException("No resolver could be loaded for scheme: " + uriScheme);
        }
    }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 please help me



Best Regards
Navas


[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]