blob: 811dc0c27a01b500da4a0a3806d48a2621c25c09 [file] [log] [blame]
/**
*
* Copyright 2005 the original author or authors.
*
* 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.gbean.geronimo;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.management.ObjectName;
import org.gbean.kernel.Kernel;
import org.gbean.kernel.NoSuchAttributeException;
import org.gbean.kernel.NoSuchOperationException;
import org.gbean.kernel.ServiceAlreadyExistsException;
import org.gbean.kernel.ServiceNotFoundException;
import org.gbean.kernel.runtime.ServiceState;
import org.gbean.kernel.simple.SimpleKernel;
import org.gbean.metadata.MetadataManager;
import org.gbean.proxy.ProxyManager;
import org.gbean.reflect.PropertyInvoker;
import org.gbean.reflect.ServiceInvoker;
import org.gbean.reflect.ServiceInvokerManager;
import org.gbean.service.ConfigurableServiceFactory;
import org.gbean.service.ServiceFactory;
/**
* @version $Rev: 154947 $ $Date: 2005-02-22 20:10:45 -0800 (Tue, 22 Feb 2005) $
*/
public class KernelBridge implements org.apache.geronimo.kernel.Kernel {
/**
* Helper objects for invoke and getAttribute
*/
private static final Object[] NO_ARGS = new Object[0];
private static final String[] NO_TYPES = new String[0];
private final SimpleKernel kernel;
private final DependencyManagerBridge dependencyManagerBridge;
private final MetadataManager metadataManager;
private final ServiceInvokerManager serviceInvokerManager;
private final ProxyManager proxyManager;
private final ProxyManagerBridge proxyManagerBridge;
private final LifecycleMonitorBridge lifecycleMonitorBridge;
public KernelBridge(SimpleKernel kernel, MetadataManager metadataManager, ServiceInvokerManager serviceInvokerManager, ProxyManager proxyManager) {
this.kernel = kernel;
this.dependencyManagerBridge = new DependencyManagerBridge(kernel.getDependencyManager());
this.metadataManager = metadataManager;
this.serviceInvokerManager = serviceInvokerManager;
this.proxyManager = proxyManager;
this.lifecycleMonitorBridge = new LifecycleMonitorBridge(kernel);
this.proxyManagerBridge = new ProxyManagerBridge(proxyManager);
System.setProperty("geronimo.base.dir", System.getProperty("gbean.base.dir"));
}
public Kernel getKernel() {
return kernel;
}
public String getKernelName() {
return kernel.getKernelName();
}
public org.apache.geronimo.kernel.DependencyManager getDependencyManager() {
return dependencyManagerBridge;
}
public org.apache.geronimo.kernel.lifecycle.LifecycleMonitor getLifecycleMonitor() {
return lifecycleMonitorBridge;
}
public org.apache.geronimo.kernel.proxy.ProxyManager getProxyManager() {
return proxyManagerBridge;
}
public Object getAttribute(ObjectName objectName, String attributeName)
throws org.apache.geronimo.kernel.GBeanNotFoundException,
org.apache.geronimo.kernel.NoSuchAttributeException,
Exception {
boolean running = isRunning(objectName);
if (running) {
ServiceInvoker serviceInvoker = getServiceInvoker(objectName);
try {
Object value = serviceInvoker.getAttribute(attributeName);
return value;
} catch (NoSuchAttributeException e) {
throw new org.apache.geronimo.kernel.NoSuchAttributeException(e);
}
} else {
ServiceFactory serviceFactory = getServiceFactory(objectName);
if (!(serviceFactory instanceof ConfigurableServiceFactory)) {
throw new NoSuchAttributeException("Service is stopped and the service factory not configurable: objectName=" + objectName + ", propertyName=" + attributeName);
}
ConfigurableServiceFactory configurableServiceFactory = (ConfigurableServiceFactory) serviceFactory;
return configurableServiceFactory.getProperty(attributeName);
}
}
public void setAttribute(ObjectName objectName, String attributeName, Object attributeValue)
throws org.apache.geronimo.kernel.GBeanNotFoundException,
org.apache.geronimo.kernel.NoSuchAttributeException,
Exception {
boolean running = isRunning(objectName);
if (running) {
ServiceInvoker serviceInvoker = getServiceInvoker(objectName);
try {
serviceInvoker.setAttribute(attributeName, attributeValue);
} catch (NoSuchAttributeException e) {
throw new org.apache.geronimo.kernel.NoSuchAttributeException(e);
}
} else {
ServiceFactory serviceFactory = getServiceFactory(objectName);
if (!(serviceFactory instanceof ConfigurableServiceFactory)) {
throw new NoSuchAttributeException("Service is stopped and the service factory not configurable: objectName=" + objectName + ", propertyName=" + attributeName);
}
ConfigurableServiceFactory configurableServiceFactory = (ConfigurableServiceFactory) serviceFactory;
configurableServiceFactory.setProperty(attributeName, attributeValue);
}
}
public Object invoke(ObjectName objectName, String methodName)
throws org.apache.geronimo.kernel.GBeanNotFoundException,
org.apache.geronimo.kernel.NoSuchOperationException,
Exception {
boolean running = isRunning(objectName);
if (!running) {
throw new IllegalStateException("Service is not running: name=" + objectName);
}
ServiceInvoker serviceInvoker = getServiceInvoker(objectName);
try {
Object value = serviceInvoker.invoke(methodName, NO_ARGS, NO_TYPES);
return value;
} catch (NoSuchOperationException e) {
throw new org.apache.geronimo.kernel.NoSuchOperationException(e);
}
}
public Object invoke(ObjectName objectName, String methodName, Object[] args, String[] types) throws org.apache.geronimo.kernel.GBeanNotFoundException,
org.apache.geronimo.kernel.NoSuchOperationException,
Exception {
ServiceInvoker serviceInvoker = getServiceInvoker(objectName);
try {
Object value = serviceInvoker.invoke(methodName, args, types);
return value;
} catch (NoSuchOperationException e) {
throw new org.apache.geronimo.kernel.NoSuchOperationException(e);
}
}
public boolean isLoaded(ObjectName name) {
return kernel.isLoaded(name);
}
public org.apache.geronimo.gbean.GBeanInfo getGBeanInfo(ObjectName name) throws org.apache.geronimo.kernel.GBeanNotFoundException {
ServiceFactory serviceFactory = getServiceFactory(name);
if (serviceFactory instanceof GeronimoServiceFactory) {
GeronimoServiceFactory geronimoServiceFactory = (GeronimoServiceFactory) serviceFactory;
return GeronimoUtil.createGBeanInfo(geronimoServiceFactory);
}
return createGBeanInfo(name);
}
public org.apache.geronimo.gbean.GBeanData getGBeanData(ObjectName objectName) throws org.apache.geronimo.kernel.GBeanNotFoundException{
ServiceFactory serviceFactory = getServiceFactory(objectName);
if (serviceFactory instanceof GeronimoServiceFactory) {
GeronimoServiceFactory geronimoServiceFactory = null;
geronimoServiceFactory = (GeronimoServiceFactory) serviceFactory;
return GeronimoUtil.createGBeanData(objectName, geronimoServiceFactory);
}
return createGBeanData(objectName);
}
public void loadGBean(org.apache.geronimo.gbean.GBeanData gbeanData, ClassLoader classLoader) throws org.apache.geronimo.kernel.GBeanAlreadyExistsException {
ObjectName objectName = gbeanData.getName();
GeronimoServiceFactory geronimoServiceFactory = null;
try {
geronimoServiceFactory =GeronimoUtil.createGeronimoServiceFactory(gbeanData, classLoader, metadataManager, proxyManager);
} catch (Exception e) {
throw new org.apache.geronimo.kernel.InternalKernelException(e);
}
try {
kernel.loadService(objectName, geronimoServiceFactory, classLoader);
} catch (ServiceAlreadyExistsException e) {
throw new org.apache.geronimo.kernel.GBeanAlreadyExistsException(e);
}
}
public void startGBean(ObjectName name) throws org.apache.geronimo.kernel.GBeanNotFoundException, IllegalStateException {
try {
kernel.startService(name);
} catch (ServiceNotFoundException e) {
throw new org.apache.geronimo.kernel.GBeanNotFoundException(e);
}
}
public void startRecursiveGBean(ObjectName name) throws org.apache.geronimo.kernel.GBeanNotFoundException, IllegalStateException {
try {
kernel.startRecursiveService(name);
} catch (ServiceNotFoundException e) {
throw new org.apache.geronimo.kernel.GBeanNotFoundException(e);
}
}
public void stopGBean(ObjectName name) throws org.apache.geronimo.kernel.GBeanNotFoundException, IllegalStateException {
try {
kernel.stopService(name);
} catch (ServiceNotFoundException e) {
throw new org.apache.geronimo.kernel.GBeanNotFoundException(e);
}
}
public void unloadGBean(ObjectName name) throws org.apache.geronimo.kernel.GBeanNotFoundException, IllegalStateException {
try {
kernel.unloadService(name);
} catch (ServiceNotFoundException e) {
throw new org.apache.geronimo.kernel.GBeanNotFoundException(e);
}
}
public int getGBeanState(ObjectName name) throws org.apache.geronimo.kernel.GBeanNotFoundException {
try {
return kernel.getServiceState(name);
} catch (ServiceNotFoundException e) {
throw new org.apache.geronimo.kernel.GBeanNotFoundException(e);
}
}
public long getGBeanStartTime(ObjectName name) throws org.apache.geronimo.kernel.GBeanNotFoundException {
try {
return kernel.getServiceStartTime(name);
} catch (ServiceNotFoundException e) {
throw new org.apache.geronimo.kernel.GBeanNotFoundException(e);
}
}
public boolean isGBeanEnabled(ObjectName name) throws org.apache.geronimo.kernel.GBeanNotFoundException {
try {
return kernel.isServiceEnabled(name);
} catch (ServiceNotFoundException e) {
throw new org.apache.geronimo.kernel.GBeanNotFoundException(e);
}
}
public void setGBeanEnabled(ObjectName name, boolean enabled) throws org.apache.geronimo.kernel.GBeanNotFoundException {
try {
kernel.setServiceEnabled(name, enabled);
} catch (ServiceNotFoundException e) {
throw new org.apache.geronimo.kernel.GBeanNotFoundException(e);
}
}
public Set listGBeans(ObjectName pattern) {
return kernel.listServiceNames(pattern);
}
public Set listGBeans(Set patterns) {
return kernel.listServiceNames(patterns);
}
public void boot() throws Exception {
org.apache.geronimo.kernel.KernelRegistry.registerKernel(this);
kernel.registerShutdownHook(new Runnable() {
public void run() {
synchronized (KernelBridge.this) {
KernelBridge.this.notify();
}
org.apache.geronimo.kernel.KernelRegistry.unregisterKernel(KernelBridge.this);
}
});
}
public Date getBootTime() {
return kernel.getBootTime();
}
public void registerShutdownHook(Runnable hook) {
kernel.registerShutdownHook(hook);
}
public void unregisterShutdownHook(Runnable hook) {
kernel.unregisterShutdownHook(hook);
}
public void shutdown() {
kernel.shutdown();
}
public boolean isRunning() {
return kernel.isRunning();
}
public ClassLoader getClassLoaderFor(ObjectName name) throws org.apache.geronimo.kernel.GBeanNotFoundException {
try {
return kernel.getClassLoaderFor(name);
} catch (ServiceNotFoundException e) {
throw new org.apache.geronimo.kernel.GBeanNotFoundException(e);
}
}
private ServiceInvoker getServiceInvoker(ObjectName objectName) throws org.apache.geronimo.kernel.GBeanNotFoundException {
try {
return serviceInvokerManager.getServiceInvoker(objectName);
} catch (ServiceNotFoundException e) {
throw new org.apache.geronimo.kernel.GBeanNotFoundException(e);
}
}
private ServiceFactory getServiceFactory(ObjectName objectName) throws org.apache.geronimo.kernel.GBeanNotFoundException {
try {
return kernel.getServiceFactory(objectName);
} catch (ServiceNotFoundException e) {
throw new org.apache.geronimo.kernel.GBeanNotFoundException(e);
}
}
private boolean isRunning(ObjectName objectName) {
try {
int serviceState = kernel.getServiceState(objectName);
boolean running = serviceState == ServiceState.RUNNING_INDEX || serviceState == ServiceState.STOPPING_INDEX;
return running;
} catch (ServiceNotFoundException e) {
return false;
}
}
private org.apache.geronimo.gbean.GBeanInfo createGBeanInfo(ObjectName objectName) throws org.apache.geronimo.kernel.GBeanNotFoundException {
boolean running = isRunning(objectName);
if (running) {
ServiceInvoker serviceInvoker = getServiceInvoker(objectName);
return createGBeanInfo(serviceInvoker);
} else {
ServiceFactory serviceFactory = getServiceFactory(objectName);
return createGBeanInfo(serviceFactory);
}
}
private org.apache.geronimo.gbean.GBeanInfo createGBeanInfo(ServiceInvoker serviceInvoker) {
Set attributeInfos = new HashSet();
List propertyIndex = serviceInvoker.getPropertyIndex();
for (Iterator iterator = propertyIndex.iterator(); iterator.hasNext();) {
PropertyInvoker propertyInvoker = (PropertyInvoker) iterator.next();
String getterName = null;
if (propertyInvoker.isReadable()) {
getterName = propertyInvoker.getGetterSignature().getName();
}
String setterName = null;
if (propertyInvoker.isWritable()) {
setterName = propertyInvoker.getSetterSignature().getName();
}
attributeInfos.add(new org.apache.geronimo.gbean.GAttributeInfo(propertyInvoker.getPropertyName(),
propertyInvoker.getType().getName(),
false,
getterName,
setterName));
}
return new org.apache.geronimo.gbean.GBeanInfo(serviceInvoker.getServiceType().getName(),
"GBean",
attributeInfos,
new org.apache.geronimo.gbean.GConstructorInfo(new String[] {}),
Collections.EMPTY_SET,
Collections.EMPTY_SET);
}
private org.apache.geronimo.gbean.GBeanInfo createGBeanInfo(ServiceFactory serviceFactory) {
String serviceType;
Set attributeInfos = new HashSet();
serviceType = Object.class.getName();
if (serviceFactory instanceof ConfigurableServiceFactory) {
ConfigurableServiceFactory configurableServiceFactory = (ConfigurableServiceFactory) serviceFactory;
Set propertyNames = configurableServiceFactory.getPropertyNames();
for (Iterator iterator = propertyNames.iterator(); iterator.hasNext();) {
String propertyName = (String) iterator.next();
String ucase = Character.toUpperCase(propertyName.charAt(0)) + propertyName.substring(1);
String getterName = "get" + ucase;
String setterName = "set" + ucase;
attributeInfos.add(new org.apache.geronimo.gbean.GAttributeInfo(propertyName,
Object.class.getName(),
false,
getterName,
setterName));
}
}
return new org.apache.geronimo.gbean.GBeanInfo(serviceType,
"GBean",
attributeInfos,
new org.apache.geronimo.gbean.GConstructorInfo(new String[] {}),
Collections.EMPTY_SET,
Collections.EMPTY_SET);
}
private org.apache.geronimo.gbean.GBeanData createGBeanData(ObjectName objectName) throws org.apache.geronimo.kernel.GBeanNotFoundException {
boolean running = isRunning(objectName);
if (running) {
ServiceInvoker serviceInvoker = getServiceInvoker(objectName);
return createGBeanData(serviceInvoker);
} else {
ServiceFactory serviceFactory = getServiceFactory(objectName);
return createGBeanData(objectName, serviceFactory);
}
}
private org.apache.geronimo.gbean.GBeanData createGBeanData(ServiceInvoker serviceInvoker) {
org.apache.geronimo.gbean.GBeanInfo gbeanInfo = createGBeanInfo(serviceInvoker);
org.apache.geronimo.gbean.GBeanData gbeanData = new org.apache.geronimo.gbean.GBeanData(serviceInvoker.getServiceName(), gbeanInfo);
for (Iterator iterator = gbeanInfo.getAttributes().iterator(); iterator.hasNext();) {
org.apache.geronimo.gbean.GAttributeInfo attribute = (org.apache.geronimo.gbean.GAttributeInfo) iterator.next();
if (attribute.isReadable()) {
try {
String attributeName = attribute.getName();
Object attributeValue = serviceInvoker.getAttribute(attributeName);
gbeanData.setAttribute(attributeName, attributeValue);
} catch (Exception e) {
// ignore
}
}
}
return gbeanData;
}
private org.apache.geronimo.gbean.GBeanData createGBeanData(ObjectName objectName, ServiceFactory serviceFactory) {
org.apache.geronimo.gbean.GBeanInfo gbeanInfo = createGBeanInfo(serviceFactory);
org.apache.geronimo.gbean.GBeanData gbeanData = new org.apache.geronimo.gbean.GBeanData(objectName, gbeanInfo);
if (serviceFactory instanceof ConfigurableServiceFactory) {
ConfigurableServiceFactory configurableServiceFactory = (ConfigurableServiceFactory) serviceFactory;
for (Iterator iterator = gbeanInfo.getAttributes().iterator(); iterator.hasNext();) {
org.apache.geronimo.gbean.GAttributeInfo attribute = (org.apache.geronimo.gbean.GAttributeInfo) iterator.next();
if (attribute.isReadable()) {
try {
String attributeName = attribute.getName();
Object attributeValue = configurableServiceFactory.getProperty(attributeName);
gbeanData.setAttribute(attributeName, attributeValue);
} catch (Exception e) {
// ignore
}
}
}
}
return gbeanData;
}
}