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 java.util.Set;
020    import java.util.HashSet;
021    import java.util.Iterator;
022    import java.util.Map;
023    import java.util.HashMap;
024    import javax.enterprise.deploy.model.DDBean;
025    import org.apache.geronimo.deployment.plugin.XmlBeanSupport;
026    import org.apache.geronimo.xbeans.geronimo.GerConnectionDefinitionType;
027    import org.apache.geronimo.xbeans.geronimo.GerConnectiondefinitionInstanceType;
028    import org.apache.xmlbeans.SchemaTypeLoader;
029    
030    /**
031     * Represents /connector/resourceadapter/outbound-resourceadapter/connection-definition
032     * in the Geronimo Connector deployment plan.  A Geronimo connection definition
033     * corresponds to a ra.xml connection definition (though there may be several
034     * Geronimo CDs for each ra.xml CD so this cannot be a DConfigBean [which would
035     * require a 1:1 mapping]).  Each Geronimo connection definition may have one
036     * or more instances with different config property settings, etc.
037     *
038     * @version $Rev: 476049 $ $Date: 2006-11-16 23:35:17 -0500 (Thu, 16 Nov 2006) $
039     */
040    public class ConnectionDefinition extends XmlBeanSupport {
041        private DDBean resourceAdapter;
042        private ConnectionDefinitionInstance[] instances = new ConnectionDefinitionInstance[0];
043    
044        public ConnectionDefinition() {
045            super(null);
046        }
047    
048        public ConnectionDefinition(DDBean resourceAdapter, GerConnectionDefinitionType definition) {
049            super(null);
050            configure(resourceAdapter, definition);
051        }
052    
053        protected GerConnectionDefinitionType getConnectionDefinition() {
054            return (GerConnectionDefinitionType) getXmlObject();
055        }
056    
057        void configure(DDBean resourceAdapter, GerConnectionDefinitionType definition) {
058            this.resourceAdapter = resourceAdapter;
059            setXmlObject(definition);
060            //todo: handle unmatched interfaces below
061            instances = new ConnectionDefinitionInstance[definition.getConnectiondefinitionInstanceArray().length];
062            DDBean[] beans = resourceAdapter.getChildBean("outbound-resourceadapter/connection-definition");
063            DDBean match = null;
064            for (int i = 0; i < beans.length; i++) {
065                DDBean bean = beans[i];
066                if(bean.getText("connectionfactory-interface")[0].equals(definition.getConnectionfactoryInterface())) {
067                    match = bean;
068                    break;
069                }
070            }
071            for (int i = 0; i < instances.length; i++) {
072                GerConnectiondefinitionInstanceType gerInstance = definition.getConnectiondefinitionInstanceArray()[i];
073                instances[i] = new ConnectionDefinitionInstance(match, gerInstance);
074            }
075        }
076    
077        // ----------------------- JavaBean Properties for connection-definition ----------------------
078    
079        //todo: instead of String, make this an Enum type aware of the interfaces available in the J2EE DD
080        public String getConnectionFactoryInterface() {
081            return getConnectionDefinition().getConnectionfactoryInterface();
082        }
083    
084        public void setConnectionFactoryInterface(String iface) {
085            String old = getConnectionFactoryInterface();
086            getConnectionDefinition().setConnectionfactoryInterface(iface);
087            DDBean match = getConnectionDefinitionDDBean();
088            for (int i = 0; i < instances.length; i++) {
089                ConnectionDefinitionInstance instance = instances[i];
090                if(instance.getDDBean() != match) {
091                    instance.configure(match, instance.getConnectionInstance());
092                }
093            }
094            pcs.firePropertyChange("connectionFactoryInterface", old, iface);
095        }
096    
097        public ConnectionDefinitionInstance[] getConnectionInstances() {
098            return instances;
099        }
100    
101        public void setConnectionInstance(ConnectionDefinitionInstance[] instances) {
102            ConnectionDefinitionInstance[] old = this.instances;
103            Set before = new HashSet();
104            for (int i = 0; i < old.length; i++) {
105                before.add(old[i]);
106            }
107            this.instances = instances;
108            // Handle current or new resource adapters
109            for (int i = 0; i < instances.length; i++) {
110                ConnectionDefinitionInstance instance = instances[i];
111                if(instance.getConnectionInstance() == null) {
112                    instance.configure(getConnectionDefinitionDDBean(), getConnectionDefinition().addNewConnectiondefinitionInstance());
113                } else {
114                    before.remove(instance);
115                }
116            }
117            // Handle removed resource adapters
118            for (Iterator it = before.iterator(); it.hasNext();) {
119                ConnectionDefinitionInstance instance = (ConnectionDefinitionInstance) it.next();
120                GerConnectiondefinitionInstanceType all[] = getConnectionDefinition().getConnectiondefinitionInstanceArray();
121                for (int i = 0; i < all.length; i++) {
122                    if(all[i] == instance) {
123                        getConnectionDefinition().removeConnectiondefinitionInstance(i);
124                        break;
125                    }
126                }
127            }
128            pcs.firePropertyChange("connectionInstance", old, instances);
129    
130        }
131    
132    
133        // ----------------------- End of JavaBean Properties ----------------------
134    
135        /**
136         * Look up the J2EE connection definition corresponding to this one (based on connectionfactory-interface)
137         */
138        private DDBean getConnectionDefinitionDDBean() {
139            String iface = getConnectionFactoryInterface();
140            if(iface == null || iface.equals("")) {
141                return null;
142            }
143            DDBean list[] = resourceAdapter.getChildBean("outbound-resourceadapter/connection-definition");
144            for (int i = 0; i < list.length; i++) {
145                DDBean bean = list[i];
146                String[] test = bean.getText("connectionfactory-interface");
147                if(test.length > 0) {
148                    String myface = test[0];
149                    if(myface.equals(iface)) {
150                        return bean;
151                    }
152                }
153            }
154            return null;
155        }
156    
157        protected SchemaTypeLoader getSchemaTypeLoader() {
158            return Connector15DCBRoot.SCHEMA_TYPE_LOADER;
159        }
160    }