/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 1997-2010 Oracle and/or its affiliates. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development * and Distribution License("CDDL") (collectively, the "License"). You * may not use this file except in compliance with the License. You can * obtain a copy of the License at * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html * or packager/legal/LICENSE.txt. See the License for the specific * language governing permissions and limitations under the License. * * When distributing the software, include this License Header Notice in each * file and include the License file at packager/legal/LICENSE.txt. * * GPL Classpath Exception: * Oracle designates this particular file as subject to the "Classpath" * exception as provided by Oracle in the GPL Version 2 section of the License * file that accompanied this code. * * Modifications: * If applicable, add the following below the License Header, with the fields * enclosed by brackets [] replaced by your own identifying information: * "Portions Copyright [year] [name of copyright owner]" * * Contributor(s): * If you wish your version of this file to be governed by only the CDDL or * only the GPL Version 2, indicate your decision by adding "[Contributor] * elects to include this software in this distribution under the [CDDL or GPL * Version 2] license." If you don't indicate a single choice of license, a * recipient has the option to distribute your version of this file under * either the CDDL, the GPL Version 2 or to extend the choice of license to * its licensees as provided above. However, if you add GPL Version 2 code * and therefore, elected the GPL Version 2 license, then the option applies * only if the new code is made subject to such option by the copyright * holder. */ package com.sun.enterprise.jbi.serviceengine.bridge; import com.sun.enterprise.deployment.WebServiceEndpoint; import com.sun.enterprise.jbi.serviceengine.core.ServiceEngineEndpoint; import com.sun.enterprise.jbi.serviceengine.core.EndpointRegistry; import com.sun.enterprise.jbi.serviceengine.core.JavaEEServiceEngineContext; import com.sun.enterprise.jbi.serviceengine.core.DescriptorEndpointInfo; import com.sun.enterprise.jbi.serviceengine.util.JBIConstants; import org.glassfish.webservices.monitoring.WebServiceEngine; import org.glassfish.webservices.monitoring.Endpoint; import org.glassfish.webservices.monitoring.EndpointLifecycleListener; import org.glassfish.webservices.monitoring.WebServiceEngineImpl; import com.sun.enterprise.config.serverbeans.*; import com.sun.enterprise.jbi.serviceengine.core.ServiceEngineRuntimeHelper; import com.sun.logging.LogDomains; import javax.jbi.component.ComponentContext; import java.util.Map; import java.util.HashMap; import java.util.logging.Level; import java.util.Iterator; import java.util.logging.Logger; import javax.jbi.servicedesc.ServiceEndpoint; import javax.jbi.JBIException; import javax.xml.namespace.QName; import java.util.List; /** * A utillity class which keeps track of JBI enabled end points * @author Manisha Umbarje */ public class EndpointHelper { /** A web service engine */ private WebServiceEngine engine ; private ComponentContext context ; private EndpointRegistry registry; private Map uriToDetailsMap ; private static EndpointHelper helper = new EndpointHelper(); private EndpointLifecycleListener epLifecycleListener; private static final String auto_enabled = System.getProperty(JBIConstants.AUTO_ENDPOINT_ENABLING); /** * Internal handle to the logger instance */ protected static final Logger logger = LogDomains.getLogger(EndpointHelper.class, LogDomains.SERVER_LOGGER); /** Creates a new instance of EndpointHelper */ private EndpointHelper() { engine = WebServiceEngineImpl.getInstance(); epLifecycleListener = new EndpointLifecycleListenerImpl(); engine.addLifecycleListener(epLifecycleListener); context = JavaEEServiceEngineContext.getInstance().getJBIContext(); registry = EndpointRegistry.getInstance(); uriToDetailsMap = new HashMap(); } public static EndpointHelper getInstance() { return helper; } public void initialize() { Iterator<Endpoint> endpoints = engine.getEndpoints(); while(endpoints.hasNext()) { registerEndpoint(endpoints.next()); } } public void enableEndpoint(QName service, String endpointName) { if(endpointName != null) { ServiceEngineEndpoint endpoint = registry.get(service, endpointName); if(endpoint != null && (!endpoint.isEnabled())) { try { ServiceEndpoint jbiEndpoint = activateEndpoint( endpoint.getServiceName(), endpoint.getEndpointName()); endpoint.setServiceEndpoint(jbiEndpoint); endpoint.setEnabled(true); debug(Level.INFO,"serviceengine.enable_endpoint", new Object[]{service.getLocalPart(), endpointName}); } catch(Exception e) { debug(Level.SEVERE,"serviceengine.error_enable", new Object[]{service.getLocalPart(), endpointName}); } } } } /** * Activates the end point in JBI * @param endpoint endPoint to be activated in JBI */ public void registerEndpoint(Endpoint endpoint) { registerEndpoint(endpoint.getDescriptor()); } public void registerEndpoint(WebServiceEndpoint webServiceDesc) { if(webServiceDesc != null) { // activate the end point in JBI String endpointName = webServiceDesc.hasWsdlPort() ? webServiceDesc.getWsdlPort().getLocalPart() : webServiceDesc.getEndpointName(); debug(Level.FINE,"serviceengine.start_registration", new Object[]{webServiceDesc.getServiceName(), endpointName}); try { boolean ejbType = webServiceDesc.implementedByEjbComponent() ; String relativeURI = webServiceDesc.getEndpointAddressUri(); String implClass = (ejbType)?webServiceDesc.getTieClassName(): webServiceDesc.getServletImplClass(); String contextRoot = null; com.sun.enterprise.web.WebModule webModule = null; if(!ejbType) { contextRoot = webServiceDesc.getWebComponentImpl(). getWebBundleDescriptor().getContextRoot(); relativeURI = contextRoot + relativeURI; EndpointInfoCollector epInfoCollector = ServiceEngineRuntimeHelper.getRuntime().getEndpointInfoCollector(); webModule = epInfoCollector.getWebModule(webServiceDesc); } ServiceEngineEndpoint seEndpoint = new ServiceEngineEndpoint(webServiceDesc, webModule, webServiceDesc.getServiceName(), endpointName, implClass, contextRoot, true); if(isJBIEnabled(webServiceDesc) || registry.hasProviderEP(seEndpoint)) { ServiceEndpoint endpoint = activateEndpoint( webServiceDesc.getServiceName(), endpointName); seEndpoint.setServiceEndpoint(endpoint); debug(Level.FINE,"serviceengine.success_registration", new Object[]{webServiceDesc.getServiceName(), endpointName}); } else { seEndpoint.setEnabled(false); } // even if jbi-enabled flag is off, internal registries keep track // of deployed web services in SJSAS registry.put(webServiceDesc.getServiceName(), endpointName, seEndpoint); uriToDetailsMap.put(relativeURI, new Object[]{webServiceDesc.getServiceName(), endpointName}); } catch (Exception e) { debug(Level.SEVERE,"serviceengine.error_registration", new Object[]{webServiceDesc.getServiceName(), endpointName}); } } } /** * Deactivates the end point in JBI */ public void disableEndpoint(QName service, String endpointName) { // deactivates the end point in JBI ServiceEngineEndpoint endpoint = registry.get(service, endpointName); if (endpoint != null) { try { ServiceEndpoint endpt = endpoint.getServiceEndpoint(); // It's assumed that ServiceEndpoint is priorly activated in JBI if(endpt != null ) { context.deactivateEndpoint(endpt); endpoint.setEnabled(false); debug(Level.INFO,"serviceengine.disable_endpoint", new Object[]{service.getLocalPart(), endpointName}); } } catch(Exception e) { debug(Level.SEVERE,"serviceengine.error_disable", new Object[]{service.getLocalPart(), endpointName}); } } } public void unregisterEndpoint(QName service, String endpointName) { if(endpointName != null) { ServiceEngineEndpoint endpoint = registry.get(service, endpointName); if(endpoint != null) { String endpointURI = endpoint.getURI(); disableEndpoint(service, endpointName); registry.delete(service, endpointName); uriToDetailsMap.remove(endpointURI); debug(Level.INFO,"serviceengine.success_removal", new Object[]{service.getLocalPart(), endpointName}); } } } public void toggleEndpointStatus(String uri, boolean flag) { Object[] endpointInfo = (Object[])uriToDetailsMap.get(uri); if(endpointInfo != null) { if(flag) enableEndpoint((QName)endpointInfo[0], (String)endpointInfo[1]); else disableEndpoint((QName)endpointInfo[0], (String)endpointInfo[1]); } } public void destroy() { engine.removeLifecycleListener(epLifecycleListener); } private ServiceEndpoint activateEndpoint(QName serviceName, String endpointName) throws JBIException { String key = DescriptorEndpointInfo.getDEIKey(serviceName, endpointName); DescriptorEndpointInfo dei = registry.getJBIEndpts().get(key); if(dei != null) { serviceName = dei.getServiceName(); endpointName = dei.getEndpointName(); } return context.activateEndpoint(serviceName, endpointName); } private void debug(Level logLevel, String msgID, Object[] params) { logger.log(logLevel, msgID, params); } private boolean isJBIEnabled(WebServiceEndpoint endpoint) { try { String applicationName = endpoint.getWebService().getBundleDescriptor().getApplication().getRegistrationName(); String endpointName = endpoint.getEndpointName(); List webServiceEndpoints = null; ServiceEngineRuntimeHelper runtimeHelper = ServiceEngineRuntimeHelper.getRuntime(); Applications apps = runtimeHelper.getApplications(); //Another way for getting the application reference. //String serverInstance = serverContext.getInstanceName(); //Application app = configBeansUtility.getSystemApplicationReferencedFrom(serverInstance, applicationName); J2eeApplication app = apps.getModule(J2eeApplication.class, applicationName); if(app != null) webServiceEndpoints = app.getWebServiceEndpoint(); EjbModule ejbApp = apps.getModule(EjbModule.class, applicationName); if(ejbApp != null) webServiceEndpoints = ejbApp.getWebServiceEndpoint(); WebModule webApp = apps.getModule(WebModule.class, applicationName); if(webApp != null) webServiceEndpoints = webApp.getWebServiceEndpoint(); if(webServiceEndpoints != null){ Iterator<com.sun.enterprise.config.serverbeans.WebServiceEndpoint> endpoints = webServiceEndpoints.iterator(); com.sun.enterprise.config.serverbeans.WebServiceEndpoint endpointBean = null; while(endpoints.hasNext()){ endpointBean = endpoints.next(); if((endpointBean.getName()).equals(endpointName)){ return Boolean.parseBoolean(endpointBean.getJbiEnabled()); } } } } catch(Throwable ce) { debug(Level.SEVERE,"serviceengine.config_not_found", new Object[]{endpoint.getServiceName(), endpoint.getEndpointName()}); } // By default endpoints are disabled return "true".equalsIgnoreCase(auto_enabled); } }