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.kernel.repository;
018
019 import java.util.ArrayList;
020 import java.util.Collection;
021 import java.util.HashMap;
022 import java.util.Iterator;
023 import java.util.List;
024 import java.util.Map;
025 import java.util.Set;
026 import java.util.SortedSet;
027 import java.util.TreeSet;
028
029 import org.apache.geronimo.gbean.GBeanInfo;
030 import org.apache.geronimo.gbean.GBeanInfoBuilder;
031
032 /**
033 * @version $Rev: 476049 $ $Date: 2006-11-16 23:35:17 -0500 (Thu, 16 Nov 2006) $
034 */
035 public class DefaultArtifactManager implements ArtifactManager {
036 private final Map artifactsByLoader = new HashMap();
037 private final Map artifactsByArtifact = new HashMap();
038
039 public void loadArtifacts(Artifact loader, Set artifacts) {
040 if (!loader.isResolved()) throw new IllegalArgumentException("loader is not a resolved artifact: " + loader);
041 for (Iterator iterator = artifacts.iterator(); iterator.hasNext();) {
042 Artifact artifact = (Artifact) iterator.next();
043 if (!artifact.isResolved()) {
044 throw new IllegalArgumentException("artifact is not a resolved artifact: " + artifact);
045 }
046 }
047
048 synchronized (this) {
049 if (artifactsByLoader.containsKey(loader)) throw new IllegalArgumentException("loader has already declared artifacts: "+ loader);
050 artifactsByLoader.put(loader, artifacts);
051 processArtifact(loader);
052
053 for (Iterator iterator = artifacts.iterator(); iterator.hasNext();) {
054 Artifact artifact = (Artifact) iterator.next();
055 processArtifact(artifact);
056 }
057 }
058 }
059
060 private void processArtifact(Artifact artifact) {
061 List values = (List) artifactsByArtifact.get(artifact.getArtifactId());
062 if (values == null) {
063 values = new ArrayList();
064 artifactsByArtifact.put(artifact.getArtifactId(), values);
065 }
066 values.add(artifact);
067 }
068
069 public synchronized void unloadAllArtifacts(Artifact loader) {
070 removeArtifact(loader);
071
072 Collection artifacts = (Collection) artifactsByLoader.remove(loader);
073 if (artifacts == null) {
074 return;
075 }
076
077 for (Iterator iterator = artifacts.iterator(); iterator.hasNext();) {
078 Artifact artifact = (Artifact) iterator.next();
079 removeArtifact(artifact);
080 }
081 }
082
083 private void removeArtifact(Artifact artifact) {
084 List values = (List) artifactsByArtifact.get(artifact.getArtifactId());
085 if (values != null) {
086 values.remove(artifact);
087 if (values.isEmpty()) {
088 artifactsByArtifact.remove(artifact.getArtifactId());
089 }
090 }
091 }
092
093 public SortedSet getLoadedArtifacts(Artifact query) {
094 List values = (List) artifactsByArtifact.get(query.getArtifactId());
095 SortedSet results = new TreeSet();
096 if (values != null) {
097 for (int i = 0; i < values.size(); i++) {
098 Artifact test = (Artifact) values.get(i);
099 if(query.matches(test)) {
100 results.add(test);
101 }
102 }
103 }
104 return results;
105 }
106
107 public static final GBeanInfo GBEAN_INFO;
108
109 static {
110 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(DefaultArtifactManager.class, "ArtifactManager");
111 infoFactory.addInterface(ArtifactManager.class);
112 GBEAN_INFO = infoFactory.getBeanInfo();
113 }
114
115 public static GBeanInfo getGBeanInfo() {
116 return GBEAN_INFO;
117 }
118 }