001 /** 002 * 003 * Copyright 2003-2005 The Apache Software Foundation 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.geronimo.connector; 019 020 import org.apache.geronimo.gbean.DynamicGBean; 021 import org.apache.geronimo.gbean.DynamicGBeanDelegate; 022 import org.apache.geronimo.gbean.AbstractName; 023 import org.apache.geronimo.kernel.Kernel; 024 import org.apache.geronimo.management.geronimo.JCAAdminObject; 025 026 import java.util.Map; 027 import java.util.HashMap; 028 import java.lang.reflect.Constructor; 029 030 /** 031 * Wrapper around AdminObject that exposes its config-properties as GBeanAttributes and 032 * supplies a disconnectable proxy to bind in jndi. 033 * 034 * @version $Rev: 396206 $ $Date: 2006-04-22 19:55:45 -0700 (Sat, 22 Apr 2006) $ 035 */ 036 public class AdminObjectWrapper implements DynamicGBean, JCAAdminObject, AdminObjectSource { 037 038 private final String adminObjectInterface; 039 private final String adminObjectClass; 040 041 private final DynamicGBeanDelegate delegate; 042 private final Object adminObject; 043 044 045 private final Kernel kernel; 046 private final AbstractName abstractName; 047 private final String objectName; 048 049 /** 050 * Default constructor required when a class is used as a GBean Endpoint. 051 */ 052 public AdminObjectWrapper() { 053 adminObjectInterface = null; 054 adminObjectClass = null; 055 adminObject = null; 056 delegate = null; 057 kernel = null; 058 abstractName = null; 059 objectName = null; 060 } 061 062 /** 063 * Normal managed constructor. 064 * 065 * @param adminObjectInterface Interface the proxy will implement. 066 * @param adminObjectClass Class of admin object to be wrapped. 067 * @throws IllegalAccessException 068 * @throws InstantiationException 069 */ 070 public AdminObjectWrapper(final String adminObjectInterface, 071 final String adminObjectClass, 072 final Kernel kernel, 073 final AbstractName abstractName, 074 final String objectName, 075 final ClassLoader cl) throws IllegalAccessException, InstantiationException, ClassNotFoundException { 076 this.adminObjectInterface = adminObjectInterface; 077 this.adminObjectClass = adminObjectClass; 078 this.kernel = kernel; 079 this.abstractName = abstractName; 080 this.objectName = objectName; 081 Class clazz = cl.loadClass(adminObjectClass); 082 adminObject = clazz.newInstance(); 083 delegate = new DynamicGBeanDelegate(); 084 delegate.addAll(adminObject); 085 } 086 087 public String getAdminObjectInterface() { 088 return adminObjectInterface; 089 } 090 091 /** 092 * Returns class of wrapped AdminObject. 093 * @return class of wrapped AdminObject 094 */ 095 public String getAdminObjectClass() { 096 return adminObjectClass; 097 } 098 099 /** 100 * Returns disconnectable proxy for binding in jndi. 101 * @return proxy implementing adminObjectInterface. 102 */ 103 public Object $getResource() { 104 return adminObject; 105 } 106 107 108 //DynamicGBean implementation 109 110 /** 111 * Delegating DynamicGBean getAttribute method. 112 * @param name of attribute. 113 * @return attribute value. 114 * @throws Exception 115 */ 116 public Object getAttribute(final String name) throws Exception { 117 return delegate.getAttribute(name); 118 } 119 120 /** 121 * Delegating DynamicGBean setAttribute method. 122 * @param name of attribute. 123 * @param value of attribute to be set. 124 * @throws Exception 125 */ 126 public void setAttribute(final String name, final Object value) throws Exception { 127 delegate.setAttribute(name, value); 128 } 129 130 /** 131 * no-op DynamicGBean method 132 * @param name 133 * @param arguments 134 * @param types 135 * @return nothing, there are no operations. 136 * @throws Exception 137 */ 138 public Object invoke(final String name, final Object[] arguments, final String[] types) throws Exception { 139 //we have no dynamic operations. 140 return null; 141 } 142 143 /** 144 * Gets the config properties in the form of a map where the key is the 145 * property name and the value is property type (as a String not a Class). 146 */ 147 public Map getConfigProperties() { 148 String[] props = delegate.getProperties(); 149 Map map = new HashMap(); 150 for (int i = 0; i < props.length; i++) { 151 String prop = props[i]; 152 if(prop.equals("logWriter")) { 153 continue; 154 } 155 map.put(prop, delegate.getPropertyType(prop)); 156 } 157 return map; 158 } 159 160 public void setConfigProperty(String property, Object value) throws Exception { 161 Class cls = delegate.getPropertyType(property); 162 if(value != null && value instanceof String && !cls.getName().equals("java.lang.String")) { 163 if(cls.isPrimitive()) { 164 if(cls.equals(int.class)) { 165 cls = Integer.class; 166 } else if(cls.equals(boolean.class)) { 167 cls = Boolean.class; 168 } else if(cls.equals(float.class)) { 169 cls = Float.class; 170 } else if(cls.equals(double.class)) { 171 cls = Double.class; 172 } else if(cls.equals(long.class)) { 173 cls = Long.class; 174 } else if(cls.equals(short.class)) { 175 cls = Short.class; 176 } else if(cls.equals(byte.class)) { 177 cls = Byte.class; 178 } else if(cls.equals(char.class)) { 179 cls = Character.class; 180 } 181 } 182 Constructor con = cls.getConstructor(new Class[]{String.class}); 183 value = con.newInstance(new Object[]{value}); 184 } 185 kernel.setAttribute(abstractName, property, value); 186 } 187 188 public Object getConfigProperty(String property) throws Exception { 189 return delegate.getAttribute(property); 190 } 191 192 public String getObjectName() { 193 return objectName; 194 } 195 196 public boolean isStateManageable() { 197 return false; 198 } 199 200 public boolean isStatisticsProvider() { 201 return false; 202 } 203 204 public boolean isEventProvider() { 205 return false; 206 } 207 }