blob: 94505d28f7bc919a39ec548e3b94cff84bbde312 [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.qpid.management.wsdm.capabilities;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import javax.management.MBeanInfo;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.apache.muse.core.Environment;
import org.apache.muse.core.Resource;
import org.apache.qpid.management.Messages;
import org.apache.qpid.management.Names;
import org.apache.qpid.transport.util.Logger;
/**
* Manager for all WS-* related artifacts.
* Basically it is a factory ehnanced with a _cache mechanism so each created resource
* (WSDL, capability class, descriptor) is created and its reference is returned when requested
* again.
*
* @author Andrea Gazzarini
*/
class WsArtifactsFactory
{
private final static Logger LOGGER = Logger.get(WsArtifactsFactory.class);
private final MBeanServer _mxServer;
private final Environment _environment;
private Map<ObjectName, WsArtifacts> _cache;
/**
* Builds a new factory with the given environment and mbean server.
*
* @param environment the builder environment.
* @param mxServer the management server.
*/
public WsArtifactsFactory(Environment environment, MBeanServer mxServer)
{
this._environment = environment;
this._mxServer = mxServer;
this._cache = new HashMap<ObjectName, WsArtifacts>();
}
/**
* Returns the WS artifacts corresponding with the given resource.
*
* @param resource the WS resource.
* @param objectName the resource identifier (name).
* @return the WS artifacts corresponding with the given resource.
* @throws ArtifactsNotAvailableException when some problem occurs during artifacts generation.
*/
@SuppressWarnings("unchecked")
WsArtifacts getArtifactsFor(Resource resource, ObjectName objectName) throws ArtifactsNotAvailableException
{
WsArtifacts result = null;
try
{
Hashtable<String, String> keyProperties = objectName.getKeyPropertyList();
keyProperties.remove(Names.NAME_ATTRIBUTE);
keyProperties.remove(Names.OBJECT_ID);
ObjectName searchKey = ObjectName.getInstance(objectName.getDomain(),keyProperties);
LOGGER.debug(
Messages.QMAN_200041_INCOMING_OBJECT_NAME_AND_DERIVED_KEY,
objectName,
searchKey);
result = _cache.get(searchKey);
if (result == null)
{
MBeanInfo metadata = _mxServer.getMBeanInfo(objectName);
WSDMArtifactsDirector director = new WSDMArtifactsDirector(objectName,metadata);
director.setEnvironment(_environment);
director.setResource(resource);
director.direct();
result = new WsArtifacts(
director.getCapabilityClass(),
director.getResourceMetadataDescriptor(),
director.getWsdl());
_cache.put(searchKey, result);
LOGGER.debug(
Messages.QMAN_200040_WS_ARTIFACTS_CACHED,
searchKey);
}
return result;
} catch(Exception exception)
{
throw new ArtifactsNotAvailableException(
result,
exception,
objectName);
}
}
/**
* Utility method for create concrete instance of the given capability class.
*
* @param capabilityClass the capability class.
* @param objectName the object name that will act as the target for this capability invocations.
* @return an initialized instance of the given capability class.
* @throws InstantiationException when the class cannot be instantiated.
* @throws IllegalAccessException when this method does not have access to
* the definition of the capability class.
*/
MBeanCapability createCapability(Class<MBeanCapability> capabilityClass, ObjectName objectName)
throws InstantiationException, IllegalAccessException
{
MBeanCapability capability = capabilityClass.newInstance();
capability.setResourceObjectName(objectName);
return capability;
}
}