/*
* Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors.
*
* Licensed 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.switchyard.as7.extension.http;
import java.lang.reflect.InvocationTargetException;
import java.io.File;
import javax.naming.NamingException;
import org.apache.catalina.Host;
import org.apache.catalina.Loader;
import org.apache.catalina.Wrapper;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.ContextConfig;
import org.apache.tomcat.InstanceManager;
import org.jboss.as.server.ServerEnvironment;
import org.jboss.as.web.deployment.WebCtxLoader;
import org.jboss.logging.Logger;
import org.switchyard.ServiceDomain;
import org.switchyard.as7.extension.ExtensionMessages;
import org.switchyard.as7.extension.util.ServerUtil;
import org.switchyard.component.common.Endpoint;
import org.switchyard.component.http.InboundHandler;
import org.switchyard.component.http.HttpGatewayServlet;
import org.switchyard.component.http.endpoint.EndpointPublisher;
/**
* Publishes standalone HTTP endpoint.
*
* @author Magesh Kumar B <mageshbk@jboss.com> (C) 2012 Red Hat Inc.
*/
public class JBossWebEndpointPublisher implements EndpointPublisher {
private static final Logger LOG = Logger.getLogger("org.switchyard");
private static final String SERVER_TEMP_DIR = System.getProperty(ServerEnvironment.SERVER_TEMP_DIR);
private static final String SERVLET_NAME = "HttpGatewayServlet";
/**
* {@inheritDoc}
*/
public synchronized Endpoint publish(ServiceDomain domain, String context, InboundHandler handler) throws Exception {
Host host = ServerUtil.getDefaultHost().getHost();
StandardContext serverContext = (StandardContext) host.findChild("/" + context);
if (serverContext == null) {
serverContext = new StandardContext();
serverContext.setPath("/" + context);
File docBase = new File(SERVER_TEMP_DIR, context);
if (!docBase.exists()) {
if (!docBase.mkdirs()) {
throw ExtensionMessages.MESSAGES.unableToCreateTempDirectory(docBase.getPath());
}
}
serverContext.setDocBase(docBase.getPath());
serverContext.addLifecycleListener(new ContextConfig());
final Loader loader = new WebCtxLoader(Thread.currentThread().getContextClassLoader());
loader.setContainer(host);
serverContext.setLoader(loader);
serverContext.setInstanceManager(new LocalInstanceManager());
Wrapper wrapper = serverContext.createWrapper();
wrapper.setName(SERVLET_NAME);
wrapper.setServletClass(HttpGatewayServlet.class.getName());
wrapper.setServlet(new HttpGatewayServlet());
wrapper.setLoadOnStartup(1);
serverContext.addChild(wrapper);
serverContext.addServletMapping("/*", SERVLET_NAME);
host.addChild(serverContext);
serverContext.create();
serverContext.start();
HttpGatewayServlet instance = (HttpGatewayServlet) wrapper.getServlet();
instance.setHandler(handler);
LOG.info("Published HTTP context " + serverContext.getPath());
} else {
throw ExtensionMessages.MESSAGES.contextAlreadyExists(context);
}
return new JBossWebEndpoint(serverContext);
}
private static class LocalInstanceManager implements InstanceManager {
LocalInstanceManager() {
}
@Override
public Object newInstance(String className) throws IllegalAccessException, InvocationTargetException, NamingException, InstantiationException, ClassNotFoundException {
return Class.forName(className).newInstance();
}
@Override
public Object newInstance(String fqcn, ClassLoader classLoader) throws IllegalAccessException, InvocationTargetException, NamingException, InstantiationException, ClassNotFoundException {
return Class.forName(fqcn, false, classLoader).newInstance();
}
@Override
public Object newInstance(Class<?> c) throws IllegalAccessException, InvocationTargetException, NamingException, InstantiationException {
return c.newInstance();
}
@Override
public void newInstance(Object o) throws IllegalAccessException, InvocationTargetException, NamingException {
throw new IllegalStateException();
}
@Override
public void destroyInstance(Object o) throws IllegalAccessException, InvocationTargetException {
}
}
}