blob: c5597a5e1b2fec758d246f2ec4a3860139fe5d17 [file] [log] [blame]
/*
* 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.servicemix.jbi.framework;
import java.util.MissingResourceException;
import javax.jbi.JBIException;
import javax.jbi.component.Component;
import javax.jbi.component.ComponentContext;
import javax.jbi.management.MBeanNames;
import javax.jbi.messaging.DeliveryChannel;
import javax.jbi.servicedesc.ServiceEndpoint;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.naming.InitialContext;
import javax.xml.namespace.QName;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.apache.servicemix.jbi.container.ActivationSpec;
import org.apache.servicemix.jbi.container.ComponentEnvironment;
import org.apache.servicemix.jbi.container.JBIContainer;
import org.apache.servicemix.jbi.container.SubscriptionSpec;
import org.apache.servicemix.jbi.servicedesc.InternalEndpoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This context provides access to data needed by all JBI components running in the JBI environment.
*
* @version $Revision$
*/
public class ComponentContextImpl implements ComponentContext, MBeanNames {
private static final transient Logger LOGGER = LoggerFactory.getLogger(ComponentContextImpl.class);
private ComponentNameSpace componentName;
private ComponentEnvironment environment;
private JBIContainer container;
private Component component;
private DeliveryChannel deliveryChannel;
private ActivationSpec activationSpec;
private boolean activated;
/**
* Constructor
*
* @param container
* @param componentName
*/
public ComponentContextImpl(JBIContainer container, ComponentNameSpace componentName) {
this.componentName = componentName;
this.container = container;
}
/**
* Activate the ComponentContext
*
* @param comp
* @param env
* @param spec
*/
public void activate(Component comp,
ComponentEnvironment env,
ActivationSpec spec) {
this.component = comp;
this.environment = env;
this.activationSpec = spec;
activated = true;
//activate and subscriptions
container.getRegistry().registerSubscriptions(this, spec);
}
/**
* get the id of the ComponentConnector
*
* @return the id
*/
public ComponentNameSpace getComponentNameSpace() {
return componentName;
}
/**
* @return the unique component name
*/
public String getComponentName() {
return componentName.getName();
}
/**
* @return this component instance
*/
public Component getComponent() {
return component;
}
/**
* @param serviceName
* @param endpointName
* @return EndPointReference
* @throws JBIException
*/
public ServiceEndpoint activateEndpoint(QName serviceName, String endpointName) throws JBIException {
checkActivated();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Component: " + componentName.getName() + " activated endpoint: " + serviceName + " : " + endpointName);
}
return container.getRegistry().activateEndpoint(this, serviceName, endpointName);
}
/**
* @param serviceName
* @return endpoints registered against the service
* @throws JBIException
*/
public ServiceEndpoint[] availableEndpoints(QName serviceName) throws JBIException {
checkActivated();
return container.getRegistry().getEndpointsForService(serviceName);
}
/**
* Deregister the endpoint with the NMR
*
* @param endpoint
* @throws JBIException
*/
public void deactivateEndpoint(ServiceEndpoint endpoint) throws JBIException {
checkActivated();
container.getRegistry().deactivateEndpoint(this, (InternalEndpoint) endpoint);
}
/**
* Register All subscriptions
* @param context
* @param as
*/
public void registerSubscriptions(ComponentContextImpl context, ActivationSpec as) {
checkActivated();
container.getRegistry().registerSubscriptions(context, as);
}
/**
* Deregister All subscriptions
* @param context
* @param as
*/
public void deregisterSubscriptions(ComponentContextImpl context, ActivationSpec as) {
checkActivated();
container.getRegistry().deregisterSubscriptions(context, as);
}
/**
* @param context
* @param subscription
* @param endpoint
*/
public void registerSubscription(ComponentContextImpl context, SubscriptionSpec subscription, ServiceEndpoint endpoint) {
checkActivated();
container.getRegistry().registerSubscription(context, subscription, endpoint);
}
/**
* @param context
* @param subscription
* @return the ServiceEndpoint
*/
public InternalEndpoint deregisterSubscription(ComponentContextImpl context, SubscriptionSpec subscription) {
checkActivated();
return container.getRegistry().deregisterSubscription(context, subscription);
}
/**
* @return the Delivery Channel
*/
public DeliveryChannel getDeliveryChannel() {
return deliveryChannel;
}
/**
* Retrieve the default JMX Domain Name for MBeans registered in this instance of the JBI implementation.
*
* @return the JMX domain name for this instance of the JBI implementation.
*/
public String getJmxDomainName() {
return container.getManagementContext().getJmxDomainName();
}
/**
* Formulate and return the MBean ObjectName of a custom control MBean for a JBI component.
*
* @param customName the name of the custom control.
* @return the JMX ObjectName of the MBean, or <code>null</code> if <code>customName</code> is invalid.
*/
public ObjectName createCustomComponentMBeanName(String customName) {
return container.getManagementContext().createCustomComponentMBeanName(customName, componentName.getName());
}
/**
* @return the MBeanNames service
*/
public MBeanNames getMBeanNames() {
return this;
}
/**
* @return theMBean server assocated with the JBI
*/
public MBeanServer getMBeanServer() {
return container.getMBeanServer();
}
/**
* @return the naming context
*/
public InitialContext getNamingContext() {
return container.getNamingContext();
}
/**
* Get the TransactionManager for this implementation. The instance returned is an implementation of the standard
* JTA interface. If none is available, this method returns <code>null</code>.
* <p>
* The object returned by this method is untyped, to allow this interface to be compiled in environments that do not
* support JTA. If not null, the object returned must be of type <code>javax.transaction.TransactionManager</code>.
* <p>
* This downcast is necessary because JBI is used in environments that do not support JTA (i.e., J2SE). Explicit use
* of JTA types would cause compilation failures in such environments.
*
* @return A TransactionManager instance, or <code>null</code> if none is available in the execution environment.
*/
public Object getTransactionManager() {
return container.getTransactionManager();
}
/**
* @return the root directory path
*/
public String getWorkspaceRoot() {
if (environment.getWorkspaceRoot() != null) {
return environment.getWorkspaceRoot().getAbsolutePath();
}
return null;
}
/**
* @return Returns the container.
*/
public JBIContainer getContainer() {
return container;
}
/**
* @return Returns the ComponentEnvironment
*/
public ComponentEnvironment getEnvironment() {
return environment;
}
/**
* Set the ComponentEnvironment
* @param ce
*/
public void setEnvironment(ComponentEnvironment ce) {
this.environment = ce;
}
/**
* @param container The container to set.
*/
public void setContainer(JBIContainer container) {
this.container = container;
}
/**
* @param deliveryChannel The deliveryChannel to set.
*/
public void setDeliveryChannel(DeliveryChannel deliveryChannel) {
this.deliveryChannel = deliveryChannel;
}
/**
* Registers the given external endpoint with the NMR. This indicates to the NMR that the given endpoint is used as
* a proxy for external service consumers to access an internal service of the same service name (but a different
* endpoint name).
*
* @param externalEndpoint the external endpoint to be registered, must be non-null.
* @exception JBIException if an external endpoint with the same name is already registered, by this or another
* component.
*/
public void registerExternalEndpoint(ServiceEndpoint externalEndpoint) throws JBIException {
checkActivated();
if (externalEndpoint == null) {
throw new IllegalArgumentException("externalEndpoint should be non null");
}
container.getRegistry().registerExternalEndpoint(getComponentNameSpace(), externalEndpoint);
}
/**
* Deregisters the given external endpoint with the NMR. This indicates to the NMR that the given external endpoint
* can no longer be used as a proxy for external service consumers to access an internal service of the same service
* name.
*
* @param externalEndpoint the external endpoint to be deregistered; must be non-null.
* @exception JBIException if the given external endpoint was not previously registered.
*/
public void deregisterExternalEndpoint(ServiceEndpoint externalEndpoint) throws JBIException {
checkActivated();
container.getRegistry().deregisterExternalEndpoint(getComponentNameSpace(), externalEndpoint);
}
/**
* Resolve the given endpoint reference into a service endpoint. This is called by the component when it has an EPR
* that it wants to resolve into a service endpoint.
* <p>
* Note that the service endpoint returned refers to a dynamic endpoint; the endpoint will exist only as long as
* this component retains a strong reference to the object returned by this method. The endpoint may not be included
* in the list of "activated" endpoints.
*
* @param epr endpoint reference as an XML fragment; must be non-null.
* @return the service endpoint corresponding to the given endpoint reference; <code>null</code> if the reference
* cannot be resolved.
*/
public ServiceEndpoint resolveEndpointReference(DocumentFragment epr) {
checkActivated();
return container.getRegistry().resolveEndpointReference(epr);
}
/**
* Get the service endpoint for the named activated endpoint, if any.
*
* @param service qualified-name of the endpoint's service; must be non-null.
* @param name name of the endpoint; must be non-null.
* @return the named endpoint, or <code>null</code> if the named endpoint is not activated.
*/
public ServiceEndpoint getEndpoint(QName service, String name) {
checkActivated();
return container.getRegistry().getEndpoint(service, name);
}
/**
* Retrieve the service description metadata for the specified endpoint.
* <p>
* Note that the result can use either the WSDL 1.1 or WSDL 2.0 description language.
*
* @param endpoint endpoint reference; must be non-null.
* @return metadata describing endpoint, or <code>null</code> if metadata is unavailable.
* @exception JBIException invalid endpoint reference.
*/
public Document getEndpointDescriptor(ServiceEndpoint endpoint) throws JBIException {
checkActivated();
return container.getRegistry().getEndpointDescriptor(endpoint);
}
/**
* Queries the NMR for active endpoints that implement the given interface. This will return the endpoints for all
* services and endpoints that implement the named interface (portType in WSDL 1.1). This method does NOT include
* external endpoints (those registered using {@link #registerExternalEndpoint(ServiceEndpoint)}.
*
* @param interfaceName qualified name of interface/portType that is implemented by the endpoint; if
* <code>null</code> then all activated endpoints in the JBI environment must be returned.
* @return an array of available endpoints for the specified interface name; must be non-null; may be empty.
*/
public ServiceEndpoint[] getEndpoints(QName interfaceName) {
checkActivated();
return container.getRegistry().getEndpointsForInterface(interfaceName);
}
/**
* Queries the NMR for active endpoints belonging to the given service. This method does NOT include external
* endpoints (those registered using {@link #registerExternalEndpoint(ServiceEndpoint)}.
*
* @param serviceName qualified name of the service that the endpoints are part of; must be non-null.
* @return an array of available endpoints for the specified service name; must be non-null; may be empty.
*/
public ServiceEndpoint[] getEndpointsForService(QName serviceName) {
checkActivated();
return container.getRegistry().getEndpointsForService(serviceName);
}
/**
* Queries the NMR for external endpoints that implement the given interface name. This methods returns only
* registered external endpoints (see {@link #registerExternalEndpoint(ServiceEndpoint)}.
*
* @param interfaceName qualified name of interface implemented by the endpoints; must be non-null.
* @return an array of available external endpoints for the specified interface name; must be non-null; may be
* empty.
*/
public ServiceEndpoint[] getExternalEndpoints(QName interfaceName) {
checkActivated();
return container.getRegistry().getExternalEndpoints(interfaceName);
}
/**
* Queries the NMR for external endpoints that are part of the given service.
*
* @param serviceName qualified name of service that contains the endpoints; must be non-null.
* @return an array of available external endpoints for the specified service name; must be non-null; may be empty.
*/
public ServiceEndpoint[] getExternalEndpointsForService(QName serviceName) {
checkActivated();
return container.getRegistry().getExternalEndpointsForService(serviceName);
}
/**
* Get the installation root directory path for this component.
* <p>
* This method MUST return the file path formatted for the underlying platform.
*
* @return the installation root directory path, in platform-specific form; must be non-null and non-empty.
*/
public String getInstallRoot() {
if (environment.getInstallRoot() != null) {
return environment.getInstallRoot().getAbsolutePath();
}
return null;
}
/**
* Get a LOGGER instance from JBI. Loggers supplied by JBI are guaranteed to have unique names such that they avoid
* name collisions with loggers from other components created using this method. The suffix parameter allows for the
* creation of subloggers as needed. The JBI specification says nothing about the exact names to be used, only that
* they must be unique across components and the JBI implementation itself.
*
* @param suffix for creating subloggers; use an empty string for the base component LOGGER; must be non-null.
* @param resourceBundleName name of <code>ResourceBundle</code> to be used for localizing messages for the
* LOGGER. May be <code>null</code> if none of the messages require localization. The resource, if non-null, must
* be loadable using the component's class loader as the initiating loader.
* @return a standard LOGGER, named uniquely for this component (plus the given suffix, if applicable); must be
* non-null.
* @exception MissingResourceException if the ResourceBundleName is non-null and no corresponding resource can be
* found.
* @exception JBIException if the resourceBundleName has changed from a previous invocation by this component of
* this method with the same suffix.
*/
public java.util.logging.Logger getLogger(String suffix, String resourceBundleName) throws MissingResourceException, JBIException {
String name = suffix != null ? suffix : "";
name = componentName.getName() + name;
return container.getLogger(name, resourceBundleName);
}
/**
* @return the ActivationSpec
*/
public ActivationSpec getActivationSpec() {
return activationSpec;
}
private void checkActivated() {
if (!activated) {
throw new IllegalStateException("ComponentContext not activated");
}
}
}