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.deployment;
020
021 import java.util.Set;
022 import java.util.HashSet;
023 import java.util.Iterator;
024 import java.util.Collection;
025 import java.util.List;
026 import java.util.Collections;
027
028 import org.apache.geronimo.gbean.ReferenceCollection;
029 import org.apache.geronimo.gbean.ReferenceCollectionListener;
030 import org.apache.geronimo.gbean.ReferenceCollectionEvent;
031 import org.apache.geronimo.common.DeploymentException;
032 import org.apache.geronimo.kernel.repository.Environment;
033 import org.apache.xmlbeans.XmlObject;
034
035 /**
036 * @version $Rev: 470597 $ $Date: 2006-11-02 15:30:55 -0800 (Thu, 02 Nov 2006) $
037 */
038 public class NamespaceDrivenBuilderCollection {
039
040 private final Collection builders;
041 private final Set namespaces = new HashSet();
042
043 public NamespaceDrivenBuilderCollection(Collection builders) {
044 this.builders = builders == null? Collections.EMPTY_SET: builders;
045 if (builders instanceof ReferenceCollection) {
046 ((ReferenceCollection)builders).addReferenceCollectionListener(new ReferenceCollectionListener() {
047
048 public void memberAdded(ReferenceCollectionEvent event) {
049 addBuilder(event.getMember());
050 }
051
052 public void memberRemoved(ReferenceCollectionEvent event) {
053 Object builder = event.getMember();
054 String namespace = ((NamespaceDrivenBuilder)builder).getNamespace();
055 namespaces.remove(namespace);
056 }
057 });
058 }
059 for (Iterator iterator = this.builders.iterator(); iterator.hasNext();) {
060 Object builder = iterator.next();
061 addBuilder(builder);
062 }
063 }
064
065 private void addBuilder(Object builder) {
066 String namespace = ((NamespaceDrivenBuilder)builder).getNamespace();
067 if (namespaces.contains(namespace)) {
068 throw new IllegalArgumentException("Duplicate namespace in builder set: " + namespace);
069 }
070 namespaces.add(namespace);
071 }
072
073 public void buildEnvironment(XmlObject container, Environment environment) throws DeploymentException {
074 for (Iterator iterator = builders.iterator(); iterator.hasNext();) {
075 NamespaceDrivenBuilder builder = (NamespaceDrivenBuilder) iterator.next();
076 builder.buildEnvironment(container, environment);
077 }
078 }
079
080 public void build(XmlObject container, DeploymentContext applicationContext, DeploymentContext moduleContext) throws DeploymentException {
081 for (Iterator iterator = builders.iterator(); iterator.hasNext();) {
082 NamespaceDrivenBuilder builder = (NamespaceDrivenBuilder) iterator.next();
083 builder.build(container, applicationContext, moduleContext);
084 }
085 }
086
087 public void addLoaders(List loaderList) {
088 }
089 }