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