All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jvnet.jax_ws_commons.json.MetadataPublisherImpl Maven / Gradle / Ivy

package org.jvnet.jax_ws_commons.json;

import com.sun.istack.NotNull;
import com.sun.xml.ws.transport.http.HttpAdapter;
import com.sun.xml.ws.transport.http.HttpMetadataPublisher;
import com.sun.xml.ws.transport.http.WSHTTPConnection;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * Responds to "http://foobar/service?res" and sends the JavaScript proxy.
 *
 * @author Kohsuke Kawaguchi
 */
final class MetadataPublisherImpl extends HttpMetadataPublisher {
    private final SchemaInfo model;

    public MetadataPublisherImpl(final SchemaInfo model) {
        this.model = model;
    }

    @Override
    public boolean handleMetadataRequest(@NotNull final HttpAdapter adapter, @NotNull final WSHTTPConnection con) throws IOException {
        final QueryStringParser qsp = new QueryStringParser(con);
        if (qsp.containsKey("js")) {
            // JavaScript proxy code
            con.setStatus(HttpURLConnection.HTTP_OK);
            con.setContentTypeResponseHeader("application/javascript;charset=utf-8");

            final ClientGenerator gen = new ClientGenerator(model, con, adapter);
            final String varName = qsp.get("var");
            if (varName != null) {
                gen.setVariableName(varName);
            }

            gen.generate(new PrintWriter(
                    new OutputStreamWriter(con.getOutput(), "UTF-8")));
            return true;
        }

        if (con.getQueryString() == null || qsp.containsKey("help")) {
            // index page
            con.setStatus(HttpURLConnection.HTTP_OK);
            con.setContentTypeResponseHeader("text/html;charset=UTF-8");

            generateHelpHtml(con, adapter, new OutputStreamWriter(con.getOutput(), "UTF-8"));
            return true;
        }

        final URL res = getClass().getResource("template/" + con.getQueryString());
        if (res != null) {
            // static resource accesss
            con.setStatus(HttpURLConnection.HTTP_OK);
            if (res.getPath().endsWith(".gif")) {
                con.setContentTypeResponseHeader("image/gif");
            }
            if (res.getPath().endsWith(".css")) {
                con.setContentTypeResponseHeader("text/css");
            }

            final InputStream is = res.openStream();
            final OutputStream os = con.getOutput();
            final byte[] buf = new byte[1024];
            int len;
            while ((len = is.read(buf)) >= 0) {
                os.write(buf, 0, len);
            }
            is.close();
            os.close();
            return true;
        }

        return false;
    }

    /*package for testing*/ void generateHelpHtml(final WSHTTPConnection con, final HttpAdapter adapter, final OutputStreamWriter writer) throws IOException {
        final VelocityContext context = new VelocityContext();
        context.put("model", model);
        context.put("requestURL", con.getBaseAddress() + adapter.urlPattern);

        new VelocityEngine().evaluate(context, writer, "velocity",
                new InputStreamReader(getClass().getResourceAsStream("template/index.html"), "UTF-8")
        );
        writer.close();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy