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.system.resolver; 019 020 import java.io.File; 021 import java.io.FileInputStream; 022 import java.io.IOException; 023 import java.util.Collection; 024 import java.util.HashMap; 025 import java.util.Iterator; 026 import java.util.Map; 027 import java.util.Properties; 028 029 import org.apache.geronimo.gbean.GBeanInfo; 030 import org.apache.geronimo.gbean.GBeanInfoBuilder; 031 import org.apache.geronimo.kernel.repository.Artifact; 032 import org.apache.geronimo.kernel.repository.ArtifactManager; 033 import org.apache.geronimo.kernel.repository.ArtifactResolver; 034 import org.apache.geronimo.kernel.repository.DefaultArtifactResolver; 035 import org.apache.geronimo.kernel.repository.ListableRepository; 036 import org.apache.geronimo.system.serverinfo.ServerInfo; 037 038 /** 039 * @version $Rev: 531311 $ $Date: 2007-04-22 21:33:01 -0400 (Sun, 22 Apr 2007) $ 040 */ 041 public class ExplicitDefaultArtifactResolver extends DefaultArtifactResolver { 042 043 public ExplicitDefaultArtifactResolver(String versionMapLocation, 044 ArtifactManager artifactManager, 045 Collection repositories, 046 ServerInfo serverInfo ) throws IOException { 047 super(artifactManager, repositories, buildExplicitResolution(versionMapLocation, serverInfo)); 048 } 049 050 private static Map buildExplicitResolution(String versionMapLocation, ServerInfo serverInfo) throws IOException { 051 if (versionMapLocation == null) { 052 return null; 053 } 054 File location = serverInfo == null? new File(versionMapLocation): serverInfo.resolveServer(versionMapLocation); 055 FileInputStream in = new FileInputStream(location); 056 Properties properties = new Properties(); 057 try { 058 properties.load(in); 059 } finally { 060 in.close(); 061 } 062 return propertiesToArtifactMap(properties); 063 } 064 065 private static Map propertiesToArtifactMap(Properties properties) { 066 Map explicitResolution = new HashMap(); 067 for (Iterator iterator = properties.entrySet().iterator(); iterator.hasNext();) { 068 Map.Entry entry = (Map.Entry) iterator.next(); 069 String key = (String) entry.getKey(); 070 String resolvedString = (String) entry.getValue(); 071 //split the string ourselves since we wish to allow blank artifactIds. 072 String[] parts = key.split("/", -1); 073 if (parts.length != 4) { 074 throw new IllegalArgumentException("Invalid id: " + key); 075 } 076 Artifact source = new Artifact(parts[0], parts[1], (String)null, parts[3]); 077 Artifact resolved = Artifact.create(resolvedString); 078 explicitResolution.put(source,resolved); 079 } 080 return explicitResolution; 081 } 082 083 public static final GBeanInfo GBEAN_INFO; 084 085 static { 086 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(ExplicitDefaultArtifactResolver.class, "ArtifactResolver"); 087 infoFactory.addAttribute("versionMapLocation", String.class, true, true); 088 infoFactory.addReference("ArtifactManager", ArtifactManager.class, "ArtifactManager"); 089 infoFactory.addReference("Repositories", ListableRepository.class, "Repository"); 090 infoFactory.addReference("ServerInfo", ServerInfo.class, "GBean"); 091 infoFactory.addInterface(ArtifactResolver.class); 092 093 infoFactory.setConstructor(new String[]{ 094 "versionMapLocation", 095 "ArtifactManager", 096 "Repositories", 097 "ServerInfo" 098 }); 099 100 101 GBEAN_INFO = infoFactory.getBeanInfo(); 102 103 } 104 105 public static GBeanInfo getGBeanInfo() { 106 return GBEAN_INFO; 107 } 108 }