001 /**
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements. See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019 package org.apache.geronimo.j2ee.deployment;
020
021 import java.util.Collection;
022 import java.util.Iterator;
023 import java.util.Collections;
024 import java.util.Map;
025
026 import javax.xml.namespace.QName;
027
028 import org.apache.geronimo.common.DeploymentException;
029 import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil;
030 import org.apache.geronimo.gbean.ReferenceCollection;
031 import org.apache.geronimo.gbean.ReferenceCollectionEvent;
032 import org.apache.geronimo.gbean.ReferenceCollectionListener;
033 import org.apache.geronimo.kernel.config.Configuration;
034 import org.apache.geronimo.kernel.repository.Environment;
035 import org.apache.xmlbeans.QNameSet;
036 import org.apache.xmlbeans.XmlObject;
037
038 /**
039 * @version $Rev: 470597 $ $Date: 2006-11-02 15:30:55 -0800 (Thu, 02 Nov 2006) $
040 */
041 public class NamingBuilderCollection implements NamingBuilder {
042
043 private final Collection builders;
044 private final QName basePlanElementName;
045 private QNameSet specQNames = QNameSet.EMPTY;
046 private QNameSet planQNames = QNameSet.EMPTY;
047
048 public NamingBuilderCollection(Collection builders, final QName basePlanElementName) {
049 this.builders = builders == null ? Collections.EMPTY_SET : builders;
050 this.basePlanElementName = basePlanElementName;
051 if (builders instanceof ReferenceCollection) {
052 ((ReferenceCollection) builders).addReferenceCollectionListener(new ReferenceCollectionListener() {
053
054 public void memberAdded(ReferenceCollectionEvent event) {
055 addBuilder(event.getMember());
056 }
057
058 public void memberRemoved(ReferenceCollectionEvent event) {
059 Object builder = event.getMember();
060 QNameSet builderSpecQNames = ((NamingBuilder) builder).getSpecQNameSet();
061 specQNames = specQNames.intersect(builderSpecQNames.inverse());
062 QNameSet builderPlanQNames = ((NamingBuilder) builder).getPlanQNameSet();
063 planQNames = planQNames.intersect(builderPlanQNames.inverse());
064 XmlBeansUtil.unregisterSubstitutionGroupElements(basePlanElementName, builderPlanQNames);
065 }
066 });
067 }
068 for (Iterator iterator = this.builders.iterator(); iterator.hasNext();) {
069 Object builder = iterator.next();
070 addBuilder(builder);
071 }
072 }
073
074 private void addBuilder(Object builder) {
075 QNameSet builderSpecQNames = ((NamingBuilder) builder).getSpecQNameSet();
076 QNameSet builderPlanQNames = ((NamingBuilder) builder).getPlanQNameSet();
077 if (builderSpecQNames == null) {
078 throw new IllegalStateException("Builder " + builder + " is missing spec qnames");
079 }
080 if (builderPlanQNames == null) {
081 throw new IllegalStateException("Builder " + builder + " is missing plan qnames");
082 }
083 if (!specQNames.isDisjoint(builderSpecQNames) && !planQNames.isDisjoint(builderPlanQNames)) {
084 throw new IllegalArgumentException("Duplicate builderSpecQNames in builder set: " + builderSpecQNames + " and duplicate builderPlanQNames in builder set: " + builderPlanQNames);
085 }
086 try {
087 specQNames = specQNames.union(builderSpecQNames);
088 planQNames = planQNames.union(builderPlanQNames);
089 } catch (NullPointerException e) {
090 throw (IllegalArgumentException) new IllegalArgumentException("could not merge qnamesets for builder " + builder).initCause(e);
091
092 }
093 //really?
094 XmlBeansUtil.registerSubstitutionGroupElements(basePlanElementName, builderPlanQNames);
095 }
096
097 public void buildEnvironment(XmlObject specDD, XmlObject plan, Environment environment) throws DeploymentException {
098 for (Iterator iterator = builders.iterator(); iterator.hasNext();) {
099 NamingBuilder namingBuilder = (NamingBuilder) iterator.next();
100 namingBuilder.buildEnvironment(specDD, plan, environment);
101 }
102 }
103
104 public void initContext(XmlObject specDD, XmlObject plan, Configuration localConfiguration, Configuration remoteConfiguration, Module module) throws DeploymentException {
105 for (Iterator iterator = builders.iterator(); iterator.hasNext();) {
106 NamingBuilder namingBuilder = (NamingBuilder) iterator.next();
107 namingBuilder.initContext(specDD, plan, localConfiguration, remoteConfiguration, module);
108 }
109 }
110
111 public void buildNaming(XmlObject specDD, XmlObject plan, Configuration localContext, Configuration remoteContext, Module module, Map componentContext) throws DeploymentException {
112 for (Iterator iterator = builders.iterator(); iterator.hasNext();) {
113 NamingBuilder namingBuilder = (NamingBuilder) iterator.next();
114 namingBuilder.buildNaming(specDD, plan, localContext, remoteContext, module, componentContext);
115 }
116 }
117
118 public QNameSet getSpecQNameSet() {
119 return specQNames;
120 }
121
122 public QNameSet getPlanQNameSet() {
123 return null;
124 }
125 }