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.web.deployment;
019    
020    import java.util.HashSet;
021    import java.util.Iterator;
022    import java.util.Set;
023    
024    import javax.enterprise.deploy.model.DDBean;
025    import javax.enterprise.deploy.spi.DConfigBean;
026    import javax.enterprise.deploy.spi.exceptions.BeanNotFoundException;
027    import javax.enterprise.deploy.spi.exceptions.ConfigurationException;
028    
029    import org.apache.geronimo.deployment.plugin.DConfigBeanSupport;
030    import org.apache.geronimo.deployment.service.jsr88.EnvironmentData;
031    import org.apache.geronimo.naming.deployment.ENCHelper;
032    import org.apache.geronimo.naming.deployment.jsr88.EjbLocalRef;
033    import org.apache.geronimo.naming.deployment.jsr88.EjbRef;
034    import org.apache.geronimo.naming.deployment.jsr88.MessageDestination;
035    import org.apache.geronimo.naming.deployment.jsr88.ResourceEnvRef;
036    import org.apache.geronimo.naming.deployment.jsr88.ResourceRef;
037    import org.apache.geronimo.xbeans.geronimo.j2ee.GerAbstractSecurityType;
038    import org.apache.geronimo.xbeans.geronimo.naming.GerEjbLocalRefType;
039    import org.apache.geronimo.xbeans.geronimo.naming.GerEjbRefType;
040    import org.apache.geronimo.xbeans.geronimo.naming.GerMessageDestinationType;
041    import org.apache.geronimo.xbeans.geronimo.naming.GerResourceEnvRefType;
042    import org.apache.geronimo.xbeans.geronimo.naming.GerResourceRefType;
043    import org.apache.geronimo.xbeans.geronimo.naming.GerServiceRefType;
044    import org.apache.geronimo.xbeans.geronimo.web.GerWebAppType;
045    import org.apache.xmlbeans.SchemaTypeLoader;
046    
047    /**
048     * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
049     */
050    public class WebAppDConfigBean extends DConfigBeanSupport {
051        private final ENCHelper encHelper;
052        private EnvironmentData environment;
053        private EjbRef[] ejbRefs = new EjbRef[0];
054        private EjbLocalRef[] ejbLocalRefs = new EjbLocalRef[0];
055        private ResourceRef[] resourceRefs = new ResourceRef[0];
056        private ResourceEnvRef[] resourceEnvRefs = new ResourceEnvRef[0];
057        private MessageDestination[] messageDestinations = new MessageDestination[0];
058    
059        WebAppDConfigBean(DDBean ddBean, GerWebAppType webApp) {
060            super(ddBean, webApp);
061    
062            ENCHelper.XmlEnvRefs envRefs = new ENCHelper.XmlEnvRefs(webApp.getEjbRefArray(), webApp.getEjbLocalRefArray(), webApp.getResourceRefArray(), webApp.getResourceEnvRefArray()); 
063    
064            //which version are we dealing with?
065            String version = ddBean.getRoot().getAttributeValue("version");
066            if ("2.4".equals(version)) {
067                encHelper = new ENCHelper(ddBean, envRefs, getXPathsForJ2ee_1_4(ENCHelper.ENC_XPATHS), getXPathsForJ2ee_1_4(ENCHelper.NAME_XPATHS));
068            } else {
069                encHelper = new ENCHelper(ddBean, envRefs, getXPathsWithPrefix(null, ENCHelper.ENC_XPATHS), getXPathsWithPrefix(null, ENCHelper.NAME_XPATHS));
070            }
071    
072        }
073    
074        GerWebAppType getWebApp() {
075            return (GerWebAppType) getXmlObject();
076        }
077    
078        public String getContextRoot() {
079            return getWebApp().getContextRoot();
080        }
081    
082        public void setContextRoot(String contextRoot) {
083            pcs.firePropertyChange("contextRoot", getContextRoot(), contextRoot);
084            getWebApp().setContextRoot(contextRoot);
085        }
086    
087        public DConfigBean getDConfigBean(DDBean ddBean) throws ConfigurationException {
088            return encHelper.getDConfigBean(ddBean);
089        }
090    
091        public void removeDConfigBean(DConfigBean dcBean) throws BeanNotFoundException {
092            encHelper.removeDConfigBean(dcBean);
093        }
094    
095        public String[] getXpaths() {
096            return getXPathsForJ2ee_1_4(ENCHelper.ENC_XPATHS);
097        }
098    
099        protected SchemaTypeLoader getSchemaTypeLoader() {
100            return WebAppDConfigRoot.SCHEMA_TYPE_LOADER;
101        }
102    
103        // ----------------------- JavaBean Properties for web-app ----------------------
104    
105        public EnvironmentData getEnvironment() {
106            return environment;
107        }
108    
109        public void setEnvironment(EnvironmentData environment) {
110            EnvironmentData old = this.environment;
111            this.environment = environment;
112            if ((old == null && environment == null) || (old != null && old == environment)) {
113                return;
114            }
115            if (old != null) {
116                getWebApp().unsetEnvironment();
117            }
118            if (environment != null) {
119                environment.configure(getWebApp().addNewEnvironment());
120            }
121            pcs.firePropertyChange("environment", old, environment);
122        }
123    
124        public EjbRef[] getEjbRefs() {
125            return ejbRefs;
126        }
127    
128        public void setEjbRefs(EjbRef[] ejbRefs) {
129            EjbRef[] old = this.ejbRefs;
130            Set before = new HashSet();
131            for (int i = 0; i < old.length; i++) {
132                before.add(old[i]);
133            }
134            this.ejbRefs = ejbRefs;
135            // Handle current or new ejbRefs
136            for (int i = 0; i < ejbRefs.length; i++) {
137                EjbRef ejbRef = ejbRefs[i];
138                //if(ejbRef.getEjbRef() == null) {
139                    ejbRef.configure(getWebApp().addNewEjbRef());
140                //} else {
141                //    before.remove(ejbRef);
142                //}
143            }
144            // Handle removed or new ejbRefs
145            for (Iterator it = before.iterator(); it.hasNext();) {
146                EjbRef adapter = (EjbRef) it.next();
147                GerEjbRefType all[] = getWebApp().getEjbRefArray();
148                for (int i = 0; i < all.length; i++) {
149                    if(all[i] == adapter) {
150                        getWebApp().removeEjbRef(i);
151                        break;
152                    }
153                }
154            }
155            pcs.firePropertyChange("ejb-ref", old, ejbRefs);
156        }
157    
158        public EjbLocalRef[] getEjbLocalRefs() {
159            return ejbLocalRefs;
160        }
161    
162        public void setEjbLocalRefs(EjbLocalRef[] ejbLocalRefs) {
163            EjbLocalRef[] old = this.ejbLocalRefs;
164            Set before = new HashSet();
165            for (int i = 0; i < old.length; i++) {
166                before.add(old[i]);
167            }
168            this.ejbLocalRefs = ejbLocalRefs;
169            // Handle current or new ejbLocalRefs
170            for (int i = 0; i < ejbLocalRefs.length; i++) {
171                EjbLocalRef ejbLocalRef = ejbLocalRefs[i];
172                //if(ejbLocalRef.getEjbLocalRef() == null) {
173                    ejbLocalRef.configure(getWebApp().addNewEjbLocalRef());
174                //} else {
175                //    before.remove(ejbLocalRef);
176                //}
177            }
178            // Handle removed or new ejbLocalRefs
179            for (Iterator it = before.iterator(); it.hasNext();) {
180                EjbLocalRef adapter = (EjbLocalRef) it.next();
181                GerEjbLocalRefType all[] = getWebApp().getEjbLocalRefArray();
182                for (int i = 0; i < all.length; i++) {
183                    if(all[i] == adapter) {
184                        getWebApp().removeEjbLocalRef(i);
185                        break;
186                    }
187                }
188            }
189            pcs.firePropertyChange("ejb-local-ref", old, ejbLocalRefs);
190        }
191    
192        public ResourceRef[] getResourceRefs() {
193            return resourceRefs;
194        }
195    
196        public void setResourceRefs(ResourceRef[] resourceRefs) {
197            ResourceRef[] old = this.resourceRefs;
198            Set before = new HashSet();
199            for (int i = 0; i < old.length; i++) {
200                before.add(old[i]);
201            }
202            this.resourceRefs = resourceRefs;
203            // Handle current or new resourceRefs
204            for (int i = 0; i < resourceRefs.length; i++) {
205                ResourceRef resourceRef = resourceRefs[i];
206                //if(resourceRef.getResourceRef() == null) {
207                resourceRef.configure(getWebApp().addNewResourceRef());
208                //} else {
209                //    before.remove(resourceRef);
210                //}
211            }
212            // Handle removed or new resourceRefs
213            for (Iterator it = before.iterator(); it.hasNext();) {
214                ResourceRef adapter = (ResourceRef) it.next();
215                GerResourceRefType all[] = getWebApp().getResourceRefArray();
216                for (int i = 0; i < all.length; i++) {
217                    if(all[i] == adapter) {
218                        getWebApp().removeResourceRef(i);
219                        break;
220                    }
221                }
222            }
223            pcs.firePropertyChange("resource-ref", old, resourceRefs);
224        }
225    
226        public ResourceEnvRef[] getResourceEnvRefs() {
227            return resourceEnvRefs;
228        }
229    
230        public void setResourceEnvRefs(ResourceEnvRef[] resourceEnvRefs) {
231            ResourceEnvRef[] old = this.resourceEnvRefs;
232            Set before = new HashSet();
233            for (int i = 0; i < old.length; i++) {
234                before.add(old[i]);
235            }
236            this.resourceEnvRefs = resourceEnvRefs;
237            // Handle current or new resourceEnvRefs
238            for (int i = 0; i < resourceEnvRefs.length; i++) {
239                ResourceEnvRef resourceEnvRef = resourceEnvRefs[i];
240                //if(resourceEnvRef.getResourceEnvRef() == null) {
241                resourceEnvRef.configure(getWebApp().addNewResourceEnvRef());
242                //} else {
243                //    before.remove(resourceEnvRef);
244                //}
245            }
246            // Handle removed or new resourceEnvRefs
247            for (Iterator it = before.iterator(); it.hasNext();) {
248                ResourceEnvRef adapter = (ResourceEnvRef) it.next();
249                GerResourceEnvRefType all[] = getWebApp().getResourceEnvRefArray();
250                for (int i = 0; i < all.length; i++) {
251                    if(all[i] == adapter) {
252                        getWebApp().removeResourceEnvRef(i);
253                        break;
254                    }
255                }
256            }
257            pcs.firePropertyChange("resource-env-ref", old, resourceEnvRefs);
258        }
259    
260        public MessageDestination[] getMessageDestinations() {
261            return messageDestinations;
262        }
263    
264        public void setMessageDestinations(MessageDestination[] messageDestinations) {
265            MessageDestination[] old = this.messageDestinations;
266            Set before = new HashSet();
267            for (int i = 0; i < old.length; i++) {
268                before.add(old[i]);
269            }
270            this.messageDestinations = messageDestinations;
271            // Handle current or new messageDestinations
272            for (int i = 0; i < messageDestinations.length; i++) {
273                MessageDestination messageDestination = messageDestinations[i];
274                //if(messageDestination.getMessageDestination() == null) {
275                messageDestination.configure(getWebApp().addNewMessageDestination());
276                //} else {
277                //    before.remove(messageDestination);
278                //}
279            }
280            // Handle removed or new messageDestinations
281            for (Iterator it = before.iterator(); it.hasNext();) {
282                MessageDestination adapter = (MessageDestination) it.next();
283                GerMessageDestinationType all[] = getWebApp().getMessageDestinationArray();
284                for (int i = 0; i < all.length; i++) {
285                    if(all[i] == adapter) {
286                        getWebApp().removeMessageDestination(i);
287                        break;
288                    }
289                }
290            }
291            pcs.firePropertyChange("message-destination", old, messageDestinations);
292        }
293    
294        public String getSecurityRealmName() {
295            return getWebApp().getSecurityRealmName();
296        }
297    
298        public void setSecurityRealmName(String securityRealmName) {
299            pcs.firePropertyChange("securityRealmName", getSecurityRealmName(), securityRealmName);
300            getWebApp().setSecurityRealmName(securityRealmName);
301        }
302    
303        //TODO Method to be updated once DConfigBean for "security" is available
304        public GerAbstractSecurityType getSecurity() {
305            return getWebApp().getSecurity();
306        }
307    
308        //TODO Method to be updated once DConfigBean for "security" is available
309        public void setSecurity(GerAbstractSecurityType security) {
310            pcs.firePropertyChange("security", getSecurity(), security);
311            getWebApp().setSecurity(security);
312        }
313    
314        //TODO Method to be updated once DConfigBean for "service-ref" is available
315        public GerServiceRefType[] getServiceRefs() {
316            return getWebApp().getServiceRefArray();
317        }
318    
319        //TODO Method to be updated once DConfigBean for "service-ref" is available
320        public void setServiceRefs(GerServiceRefType[] serviceRefArray){
321            pcs.firePropertyChange("service-ref", getServiceRefs(), serviceRefArray);
322            getWebApp().setServiceRefArray(serviceRefArray);
323        }
324        // ----------------------- End of JavaBean Properties ----------------------
325    }