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    package org.apache.geronimo.connector.deployment.jsr88;
018    
019    import org.apache.geronimo.deployment.plugin.DConfigBeanSupport;
020    import org.apache.geronimo.xbeans.geronimo.GerAdminobjectType;
021    import org.apache.geronimo.xbeans.geronimo.GerAdminobjectInstanceType;
022    import org.apache.xmlbeans.SchemaTypeLoader;
023    
024    import javax.enterprise.deploy.model.DDBean;
025    
026    /**
027     * Represents /connector/adminobject in a Geronimo Connector deployment plan.
028     * Corresponds to /connector/resourceadapter/adminobject in the J2EE deployment plan.
029     * Note that in an arbitrary Geronimo connector plan, there can be multiple
030     * adminobject entries per adminobject from the J2EE plan.  When we load such
031     * a plan, we combine all the adminobject-instances from those adminobjects
032     * into a single Geronimo adminobject per J2EE adminobject, so if we write it
033     * out again it'll be a little different, but that way this can be a DConfigBean
034     * instead of a POJO (the loading code is in ConnectorDCB).
035     *
036     * @version $Rev: 476049 $ $Date: 2006-11-16 23:35:17 -0500 (Thu, 16 Nov 2006) $
037     */
038    public class AdminObjectDCB extends DConfigBeanSupport {
039        private AdminObjectInstance[] adminObjectInstance = new AdminObjectInstance[0];
040    
041        public AdminObjectDCB(DDBean adminobjectDDBean, final GerAdminobjectType adminobject) {
042            super(adminobjectDDBean, adminobject);
043            //todo: listen for property changes on the admin object
044            configure(adminobjectDDBean, adminobject);
045        }
046    
047        private void configure(DDBean adminDDBean, GerAdminobjectType adminXml) {
048            adminXml.setAdminobjectClass(adminDDBean.getText("adminobject-class")[0]);
049            adminXml.setAdminobjectInterface(adminDDBean.getText("adminobject-interface")[0]);
050            GerAdminobjectInstanceType[] xmls = adminXml.getAdminobjectInstanceArray();
051            adminObjectInstance = new AdminObjectInstance[xmls.length];
052            for (int i = 0; i < xmls.length; i++) {
053                adminObjectInstance[i] = new AdminObjectInstance(adminDDBean, xmls[i]);
054            }
055        }
056    
057        GerAdminobjectType getAdminObject() {
058            return (GerAdminobjectType) getXmlObject();
059        }
060    
061        void addAdminObjectInstance(GerAdminobjectInstanceType xml) {
062            AdminObjectInstance instance = new AdminObjectInstance(getDDBean(), xml);
063            AdminObjectInstance[] result = new AdminObjectInstance[adminObjectInstance.length+1];
064            System.arraycopy(adminObjectInstance, 0, result, 0, adminObjectInstance.length);
065            result[adminObjectInstance.length] = instance;
066            setAdminObjectInstance(result);
067        }
068    
069        // ----------------------- JavaBean Properties for /adminobject ----------------------
070    
071        public String getAdminObjectInterface() {
072            return getAdminObject().getAdminobjectInterface();
073        }
074    
075        public String getAdminObjectClass() {
076            return getAdminObject().getAdminobjectClass();
077        }
078    
079        public AdminObjectInstance[] getAdminObjectInstance() {
080            return adminObjectInstance;
081        }
082    
083        public void setAdminObjectInstance(AdminObjectInstance[] adminObjectInstance) {
084            AdminObjectInstance[] old = getAdminObjectInstance();
085            //todo: whack all the old ones
086            for (int i = 0; i < adminObjectInstance.length; i++) {
087                AdminObjectInstance instance = adminObjectInstance[i];
088                if(instance.getAdminInstance() == null) {
089                    instance.configure(getDDBean(), getAdminObject().addNewAdminobjectInstance());
090                }
091            }
092            this.adminObjectInstance = adminObjectInstance;
093            pcs.firePropertyChange("adminObjectInstance", old, adminObjectInstance);
094        }
095    
096        public AdminObjectInstance getAdminObjectInstance(int index) {
097            return adminObjectInstance[index];
098        }
099    
100        public void setAdminObjectInstance(int index, AdminObjectInstance adminObjectInstance) {
101            AdminObjectInstance[] old = getAdminObjectInstance();
102            //todo: whack the old one
103            if(adminObjectInstance.getAdminInstance() == null) {
104                adminObjectInstance.configure(getDDBean(), getAdminObject().addNewAdminobjectInstance());
105            }
106            this.adminObjectInstance[index] = adminObjectInstance;
107            //todo: deep copy of array for "old"
108            pcs.firePropertyChange("adminObjectInstance", old, adminObjectInstance);
109        }
110    
111        // ----------------------- End of JavaBean Properties ----------------------
112    
113        protected SchemaTypeLoader getSchemaTypeLoader() {
114            return Connector15DCBRoot.SCHEMA_TYPE_LOADER;
115        }
116    }