001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with 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,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019
020 package org.apache.geronimo.mavenplugins.car;
021
022 import java.io.File;
023 import java.io.IOException;
024 import java.util.Set;
025 import java.util.SortedSet;
026 import java.util.TreeSet;
027
028 import javax.security.auth.login.FailedLoginException;
029
030 import org.apache.geronimo.gbean.GBeanInfo;
031 import org.apache.geronimo.gbean.GBeanInfoBuilder;
032 import org.apache.geronimo.kernel.repository.Artifact;
033 import org.apache.geronimo.kernel.repository.FileWriteMonitor;
034 import org.apache.geronimo.kernel.repository.Version;
035 import org.apache.geronimo.system.plugin.LocalOpenResult;
036 import org.apache.geronimo.system.plugin.OpenResult;
037 import org.apache.geronimo.system.plugin.SourceRepository;
038 import org.apache.geronimo.system.plugin.model.PluginListType;
039 import org.apache.geronimo.system.repository.Maven2Repository;
040
041 /**
042 * Helps adapt Geronimo repositories to Maven repositories for packaging building.
043 *
044 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
045 */
046 public class Maven2RepositoryAdapter extends Maven2Repository implements SourceRepository {
047 private ArtifactLookup lookup;
048
049 private Set<org.apache.maven.artifact.Artifact> dependencyTree;
050
051 public Maven2RepositoryAdapter(Set<org.apache.maven.artifact.Artifact> dependencyTree, final ArtifactLookup lookup) {
052 super(lookup.getBasedir());
053 this.dependencyTree = dependencyTree;
054 this.lookup = lookup;
055 }
056
057 public File getLocation(final Artifact artifact) {
058 assert artifact != null;
059
060 return lookup.getLocation(artifact);
061 }
062
063 public SortedSet list() {
064 TreeSet<Artifact> list = new TreeSet<Artifact>();
065 listInternal(list, null, null, null, null);
066 return list;
067 }
068
069 public SortedSet list(Artifact query) {
070 TreeSet<Artifact> list = new TreeSet<Artifact>();
071 listInternal(list, query.getGroupId(), query.getArtifactId(), query.getVersion(), query.getType());
072 return list;
073 }
074
075 private void listInternal(TreeSet<Artifact> list, String groupId, String artifactId, Version version, String type) {
076 for (org.apache.maven.artifact.Artifact artifact: dependencyTree) {
077 if (matches(artifact, groupId, artifactId, version, type)) {
078 list.add(mavenToGeronimoArtifact(artifact));
079 }
080 }
081 }
082
083 private boolean matches(org.apache.maven.artifact.Artifact artifact, String groupId, String artifactId, Version version, String type) {
084 return (groupId == null || artifact.getGroupId().equals(groupId))
085 && (artifactId == null || artifact.getArtifactId().equals(artifactId))
086 && (version == null || artifact.getVersion().equals(version.toString()))
087 && (type == null || artifact.getType().equals(type));
088 }
089
090 protected org.apache.geronimo.kernel.repository.Artifact mavenToGeronimoArtifact(final org.apache.maven.artifact.Artifact artifact) {
091 assert artifact != null;
092
093 return new org.apache.geronimo.kernel.repository.Artifact(artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), artifact.getType());
094 }
095
096 public PluginListType getPluginList() {
097 throw new RuntimeException("Not implemented");
098 }
099
100 public OpenResult open(Artifact artifact, FileWriteMonitor fileWriteMonitor) throws IOException, FailedLoginException {
101 if (!artifact.isResolved()) {
102 SortedSet<Artifact> list = list(artifact);
103 if (list.isEmpty()) {
104 throw new IOException("Could not resolve artifact " + artifact + " in repo " + rootFile);
105 }
106 artifact = list.first();
107 }
108 File location = getLocation(artifact);
109 return new LocalOpenResult(artifact, location);
110
111 }
112
113 //
114 // ArtifactLookup
115 //
116
117 public static interface ArtifactLookup {
118 File getLocation(Artifact artifact);
119
120 File getBasedir();
121 }
122
123 //
124 // GBean
125 //
126
127 public static final GBeanInfo GBEAN_INFO;
128
129 static {
130 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(Maven2RepositoryAdapter.class, "Repository");
131 infoFactory.addAttribute("lookup", ArtifactLookup.class, true);
132 infoFactory.addAttribute("dependencies", Set.class, true);
133 infoFactory.setConstructor(new String[]{"dependencies", "lookup"});
134 GBEAN_INFO = infoFactory.getBeanInfo();
135 }
136
137 public static GBeanInfo getGBeanInfo() {
138 return GBEAN_INFO;
139 }
140 }