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.kernel.Kernel;
028    import org.apache.geronimo.management.geronimo.JCAAdminObject;
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: 550546 $ $Date: 2007-06-25 12:52:11 -0400 (Mon, 25 Jun 2007) $
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    }