/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.ode.bpel.elang;

import java.io.InputStream;
import java.io.StringReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;

import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;
import javax.xml.transform.stream.StreamSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.ode.bpel.elang.xpath10.obj.OXPath10Expression;
import org.apache.ode.bpel.obj.OXslSheet;
import org.apache.ode.utils.StreamUtils;
import org.apache.ode.utils.fs.FileUtils;

/**
 * Used to give the Xsl processor a way to access included XSL sheets
 * by using the maps of sheets pre-processed at compilation time and
 * stored in the OXPath10Expression.
 */
public class XslRuntimeUriResolver implements URIResolver {

    private static final Logger __log = LoggerFactory.getLogger(XslRuntimeUriResolver.class);

    private OXPath10Expression _expr;
    private final URI _baseResourceURI;

    public XslRuntimeUriResolver(OXPath10Expression expr, URI baseResourceURI) {
        _expr = expr;
        _baseResourceURI= baseResourceURI;
    }

    public Source resolve(String href, String base) throws TransformerException {
        URI uri;
        try {
            uri = new URI(FileUtils.encodePath(href));
        } catch (URISyntaxException e) {
            return null;
        }

        OXslSheet sheet = _expr.getXslSheet(uri);
        if( sheet != null) {
            String result = sheet.getSheetBody();
            if (result != null) {
                return new StreamSource(new StringReader(result));
            } else {
                return null;
            }
        } 
        
        InputStream result = getResourceAsStream(uri);
        if( result != null ) {
            return new StreamSource(result);
        } else {
            return null;
        }
    }

    /**
     * Given a URI this function will attempt to retrieve the resource declared at that URI location
     * as a stream. This URI can be defined as being relative to the executing process instance's 
     * physical file location or can point to an HTTP(S) resource.
     *
     * @param docUri - the URI to resolve
     * @return stream - the resource contents, or null if none found.
     */
    private InputStream getResourceAsStream(URI docUri) {
        URI resolvedURI = _baseResourceURI.resolve(docUri);
        InputStream is = null;
        
        try {
            // treat URI as URL and try to load it.
            URL url = resolvedURI.toURL();
            is = url.openStream();

            // and read it to a buffer.
            return is;
        } catch (Exception e) {
            __log.warn("Couldn't load XSL resource " + docUri, e);
        }
        return null;
    }

}
