/* * 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.resteasy; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.jboss.as.server.ServerEnvironment; import org.jboss.as.web.host.ServletBuilder; import org.jboss.as.web.host.WebDeploymentBuilder; import org.jboss.as.web.host.WebDeploymentController; import org.jboss.as.web.host.WebHost; import org.jboss.logging.Logger; import org.switchyard.ServiceDomain; import org.switchyard.as7.extension.ExtensionMessages; import org.switchyard.as7.extension.WebResource; import org.switchyard.as7.extension.deployment.SwitchYardDeployment; import org.switchyard.as7.extension.util.ServerUtil; import org.switchyard.component.common.Endpoint; import org.switchyard.component.resteasy.resource.ResourcePublisher; /** * Creates a RESTEasy resource on WildFly. * * @author Magesh Kumar B <mageshbk@jboss.com> (C) 2012 Red Hat Inc. */ public class RESTEasyResourcePublisher implements ResourcePublisher { 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 = "RestEasy"; /** * {@inheritDoc} */ public synchronized Endpoint publish(ServiceDomain domain, String context, List<Object> instances, Map<String, String> contextParams) throws Exception { WebResource resource = SwitchYardDeployment.getResource(domain, context); if (resource == null) { WebHost host = ServerUtil.getDefaultHost(); WebDeploymentBuilder deployment = new WebDeploymentBuilder(); WebDeploymentController handle = null; ServletBuilder servletBuilder = new ServletBuilder(); try { deployment.setContextRoot(context); File docBase = new File(SERVER_TEMP_DIR, context); if (!docBase.exists()) { if (!docBase.mkdirs()) { throw ExtensionMessages.MESSAGES.unableToCreateTempDirectory(docBase.getPath()); } } deployment.setDocumentRoot(docBase); deployment.setClassLoader(Thread.currentThread().getContextClassLoader()); List<String> urlPatterns = new ArrayList<String>(); urlPatterns.add("/*"); servletBuilder.addUrlMappings(urlPatterns); RESTEasyServlet servlet = new RESTEasyServlet(); servletBuilder.setServletName(SERVLET_NAME); servletBuilder.setServletClass(RESTEasyServlet.class); servletBuilder.setForceInit(true); servletBuilder.addInitParam("resteasy.servlet.context.deployment", "true"); if (contextParams != null) { for (Map.Entry<String, String> cp : contextParams.entrySet()) { servletBuilder.addInitParam(cp.getKey(), cp.getValue()); } } servletBuilder.setServlet(servlet); deployment.addServlet(servletBuilder); handle = host.addWebDeployment(deployment); } catch (Exception e) { throw ExtensionMessages.MESSAGES.unableToStartContext(context, e); } resource = new WebResource(); resource.setHandle(handle); resource.setDeployment(deployment); SwitchYardDeployment.addResource(domain, resource); } else if ((resource.getDeployment() != null) && !(resource.getDeployment().getServlets().get(0).getServlet() instanceof RESTEasyServlet)) { throw ExtensionMessages.MESSAGES.contextAlreadyExists(context); } RESTEasyResource endpoint = new RESTEasyResource(); endpoint.setInstances(instances); endpoint.setWebResource(resource); return endpoint; } }