- Timestamp:
- 07/12/08 00:57:32 (4 months ago)
- Location:
- lang/java/mvnbeans/trunk/src
- Files:
-
- 9 added
- 4 modified
-
main/java/jp/javelindev/mvnbeans/Artifact.java (modified) (6 diffs)
-
main/java/jp/javelindev/mvnbeans/Metadata.java (added)
-
main/java/jp/javelindev/mvnbeans/MetadataParser.java (added)
-
main/java/jp/javelindev/mvnbeans/MetadataRetriever.java (added)
-
main/java/jp/javelindev/mvnbeans/Pom.java (added)
-
main/java/jp/javelindev/mvnbeans/PomParser.java (added)
-
main/java/jp/javelindev/mvnbeans/PomRetriever.java (added)
-
main/java/jp/javelindev/mvnbeans/Repository.java (modified) (4 diffs)
-
main/java/jp/javelindev/mvnbeans/exception/XmlParseException.java (added)
-
main/java/jp/javelindev/mvnbeans/utils/UrlUtils.java (added)
-
main/java/jp/javelindev/mvnbeans/utils/XPathUtils.java (added)
-
test/java/jp/javelindev/mvnbeans/DummyArtifactFactory.java (modified) (2 diffs)
-
test/java/jp/javelindev/mvnbeans/ui/LibTest.java (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/java/mvnbeans/trunk/src/main/java/jp/javelindev/mvnbeans/Artifact.java
r14434 r15681 18 18 package jp.javelindev.mvnbeans; 19 19 20 import java.net.MalformedURLException;21 20 import java.net.URL; 22 21 import java.util.ArrayList; 23 22 import java.util.List; 24 23 25 import jp.javelindev.mvnbeans. exception.MalformedURLRuntimeException;24 import jp.javelindev.mvnbeans.utils.UrlUtils; 26 25 27 26 import org.apache.commons.lang.StringUtils; … … 40 39 private String version; 41 40 private DependencyScope scope; 42 private URL pomUrl;41 private Pom pom; 43 42 private List<Artifact> dependencies; 44 43 … … 53 52 public String getGroupId() { 54 53 return groupId; 55 }56 57 public String getGroupIdAsPath() {58 return groupId.replace('.', '/');59 54 } 60 55 … … 75 70 } 76 71 77 public URL getPomUrl() {78 return pom Url;72 public Pom getPom() { 73 return pom; 79 74 } 80 75 81 public void setPomUrl(URL pomUrl) { 82 this.pomUrl = pomUrl; 83 } 84 85 /** 86 * 指定されたリポジトリに対するPOMファイルのURLを解決します。 87 * <p> 88 * 接続可能かどうかはここでは保証されません。 89 * 接続可能、つまり、アーティファクトの存在するリポジトリとそれに対するURLが 90 * 確定した際には、本インスタンスのpomUrlにそのURLが格納されます。 91 * </p> 92 * 93 * @param repository 94 * @return 95 */ 96 public URL resolvePomUrl(Repository repository) { 97 StringBuilder sb = new StringBuilder(repository.getRepositoryUrl()); 98 sb.append(getGroupIdAsPath()).append("/"); 99 sb.append(getArtifactId()).append("/"); 100 sb.append(getVersion()).append("/"); 101 sb.append(getFileName(ResourceType.POM)); 102 return createUrl(sb.toString()); 76 public void setPom(Pom pom) { 77 this.pom = pom; 103 78 } 104 79 … … 112 87 113 88 public URL resolveUrl(String fileName) { 114 assert (pomUrl != null); 115 String urlBase = pomUrl.toString().replaceFirst("/[^/]*$", "/"); 116 return createUrl(urlBase + fileName); 117 } 118 119 private static URL createUrl(String url) throws MalformedURLRuntimeException { 120 try { 121 return new URL(url); 122 } catch (MalformedURLException e) { 123 throw new MalformedURLRuntimeException(url, e); 124 } 89 assert (pom != null); 90 String urlBase = pom.getUrl().toString().replaceFirst("/[^/]*$", "/"); 91 return UrlUtils.createUrl(urlBase + fileName); 125 92 } 126 93 … … 184 151 sb.append(version).append(" "); 185 152 sb.append("[").append(scope).append("] "); 186 sb.append("(").append(pom Url).append(")");153 sb.append("(").append(pom.getUrl()).append(")"); 187 154 return sb.toString(); 188 155 } -
lang/java/mvnbeans/trunk/src/main/java/jp/javelindev/mvnbeans/Repository.java
r15207 r15681 2 2 3 3 import java.io.File; 4 import java.io.FileNotFoundException;5 4 import java.io.IOException; 6 import java.io.InputStream;7 import java.net.MalformedURLException;8 import java.net.URL;9 import java.util.ArrayList;10 5 import java.util.List; 11 6 12 import java.util.logging.Level;13 import java.util.logging.Logger;14 7 import jp.javelindev.mvnbeans.exception.ArtifactNotFoundException; 8 import jp.javelindev.mvnbeans.exception.MalformedURLRuntimeException; 15 9 import jp.javelindev.mvnbeans.exception.RepositoryIOException; 16 import jp.javelindev.mvnbeans. utils.CastUtils;10 import jp.javelindev.mvnbeans.exception.XmlParseException; 17 11 18 import org.apache.commons.io.IOUtils; 19 import org.jdom.Element; 20 import org.jdom.JDOMException; 21 import org.jdom.Namespace; 22 import org.jdom.input.SAXBuilder; 23 import org.jdom.xpath.XPath; 12 import org.apache.commons.lang.StringUtils; 24 13 25 14 /** … … 28 17 * @author nobeans 29 18 */ 30 public class Repository { 19 public class Repository { 31 20 32 private Namespace pomNameSpace;33 21 private String repositoryUrl; 34 22 … … 43 31 * 指定された条件に一致するアーティファクトを返します。 44 32 * 45 * @param groupId 46 * @param artifactId 47 * @param version 33 * @param groupId グループID(必須) 34 * @param artifactId アーティファクトID(必須) 35 * @param version バージョン(省略可/null可) 48 36 * @return 49 37 * @throws ArtifactNotFoundException … … 51 39 */ 52 40 public Artifact findArtifact(String groupId, String artifactId, String version) throws ArtifactNotFoundException, RepositoryIOException { 53 //バージョンが空の場合、maven-metadata.xmlから最新バージョンを探し出してきてそれを使います。 54 String completedVersion = completeVersion(groupId, artifactId, version); 55 Artifact artifact = new Artifact(groupId, artifactId, completedVersion); 56 complete(artifact); 41 assert (groupId != null) && (artifactId != null) : "省略不可"; 42 String resolvedVersion = resolveVersion(groupId, artifactId, version); 43 Artifact artifact = new Artifact(groupId, artifactId, resolvedVersion); 44 setupPom(artifact); // この2つ、 45 setupDependencies(artifact); // 順番重要。 57 46 return artifact; 58 47 } 59 48 60 private void complete(Artifact artifact) throws RepositoryIOException, ArtifactNotFoundException { 61 List<Artifact> dependencies = getDependencies(artifact); 49 private void setupPom(Artifact artifact) throws ArtifactNotFoundException, RepositoryIOException { 50 Pom pom = new PomRetriever(this).retrieve(artifact); 51 artifact.setPom(pom); 52 } 53 54 private void setupDependencies(Artifact artifact) throws RepositoryIOException { 55 List<Artifact> dependencies = new PomParser(artifact.getPom()).getDependencies(); 62 56 artifact.setDependencies(dependencies); 63 57 } 64 58 65 private List<Artifact> getDependencies(Artifact artifact) throws RepositoryIOException, ArtifactNotFoundException { 66 artifact.setPomUrl(artifact.resolvePomUrl(this)); 67 List<Element> dependencies = retrieveDependencyElements(artifact); 68 return convertElementsToArtifacts(dependencies); 69 } 70 71 private List<Element> retrieveDependencyElements(Artifact artifact) throws RepositoryIOException, ArtifactNotFoundException { 72 InputStream is = null; 59 /** 60 * バージョンが空の場合、maven-metadata.xmlから最新バージョンを探し出してきてそれを使います。 61 * 62 * @param groupId 63 * @param artifactId 64 * @param version 65 * @return 66 * @throws RepositoryIOException 67 */ 68 private String resolveVersion(String groupId, String artifactId, String version) throws RepositoryIOException { 73 69 try { 74 is = SingletonInputStreamOpener.getInstance().openStream(artifact.getPomUrl()); 75 Element root = new SAXBuilder().build(is).getRootElement(); 76 77 // XPathで依存性をパースする。 78 resolveNameSpace(root); 79 XPath xpath = XPath.newInstance("//p:dependencies/p:dependency"); 80 xpath.addNamespace(pomNameSpace); 81 return CastUtils.cast(xpath.selectNodes(root)); 82 83 } catch (FileNotFoundException e) { 84 throw new ArtifactNotFoundException(String.format("Artifact '%s:%s:%s' is not found in repository '%s'.", artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), repositoryUrl), e); 70 if (!StringUtils.isEmpty(version)) return version; 71 Metadata metadata = new MetadataRetriever(this).retrieve(groupId, artifactId); 72 return new MetadataParser(metadata).getLatestVersion(); 73 } catch (XmlParseException e) { 74 throw new RepositoryIOException(e); 75 } catch (MalformedURLRuntimeException e) { 76 throw new RepositoryIOException(e); 85 77 } catch (IOException e) { 86 throw new RepositoryIOException("Cannot access to: " + artifact.getPomUrl(), e); 87 } catch (JDOMException e) { 88 throw new RepositoryIOException("Failed to analyze pom file: " + artifact, e); 89 } finally { 90 IOUtils.closeQuietly(is); 78 throw new RepositoryIOException(e); 91 79 } 92 80 } 93 81 94 private void resolveNameSpace(Object root) throws JDOMException { 95 String namespace = (String) XPath.selectSingleNode(root, "namespace-uri()"); 96 if (namespace != null) { 97 pomNameSpace = Namespace.getNamespace("p", namespace); 98 } else { 99 pomNameSpace = Namespace.NO_NAMESPACE; 100 } 101 } 102 103 private List<Artifact> convertElementsToArtifacts(List<Element> dependencies) { 104 List<Artifact> artifactList = new ArrayList<Artifact>(); 105 for (Element element : dependencies) { 106 String depGroupId = element.getChildText("groupId", pomNameSpace); 107 String depArtifactId = element.getChildText("artifactId", pomNameSpace); 108 String depVersion = element.getChildText("version", pomNameSpace); 109 110 //からの<dependencies>などの場合にgroupIdがnullになるケースがある。その場合は次のループにまわす。おそらく 111 //ループは直後に終わるはず。 112 if(depGroupId == null) continue; 113 114 depVersion = completeVersion(depGroupId, depArtifactId, depVersion); 115 String depScope = element.getChildText("scope", pomNameSpace); 116 if (!isTargetForScope(depScope)) continue; 117 118 String optional = element.getChildText("optional", pomNameSpace); 119 if (!isTargetForOptional(optional)) continue; 120 121 Artifact depArtifact = new Artifact(depGroupId, depArtifactId, depVersion); 122 depArtifact.setScope(DependencyScope.get(depScope)); 123 artifactList.add(depArtifact); 124 } 125 return artifactList; 126 } 127 128 private String completeVersion(String groupId, String artifactId, String version) { 129 if(version != null && !version.isEmpty()) { 130 return version; 131 } 132 try { 133 return getLatestVersion(groupId, artifactId); 134 } catch (RepositoryIOException ex) { 135 Logger.getLogger(Repository.class.getName()).log(Level.SEVERE, null, ex); 136 throw new RuntimeException(ex); 137 } 138 } 139 140 private String groupIdAsPath(String groupId) { 141 if(groupId == null) return null; 142 return groupId.replace('.', '/'); 143 } 144 145 private String getLatestVersion(String groupId, String artifactId) throws RepositoryIOException, RepositoryIOException { 146 StringBuilder sb = new StringBuilder(getRepositoryUrl()); 147 sb.append(groupIdAsPath(groupId)).append("/"); 148 sb.append(artifactId).append("/"); 149 sb.append("maven-metadata.xml"); 150 151 String metadataPath = sb.toString(); 152 153 Logger.getLogger(this.getClass().getName()).fine("maven-metadata.xml path: " + metadataPath); 154 155 InputStream is = null; 156 try { 157 URL metadataUrl = new URL(metadataPath); 158 is = SingletonInputStreamOpener.getInstance().openStream(metadataUrl); 159 Element root = new SAXBuilder().build(is).getRootElement(); 160 resolveNameSpace(root); 161 XPath xpath = XPath.newInstance("//p:versioning/p:versions/p:version"); 162 xpath.addNamespace(pomNameSpace); 163 164 165 List<Element> elems = CastUtils.cast(xpath.selectNodes(root)); 166 if(elems == null || elems.isEmpty()) { 167 return null; 168 } else { 169 Element element = elems.get(elems.size() - 1); 170 return element.getText(); 171 } 172 } catch (FileNotFoundException ex) { 173 //metadata.xmlが見つからない。最新バージョンも変わらないのでnullを返す。 174 Logger.getLogger(this.getClass().getName()).log(Level.FINE, "File not found.", ex); 175 return null; 176 } catch (IOException ex) { 177 throw new RepositoryIOException("Cannot access to: " + metadataPath, ex); 178 } catch (JDOMException ex) { 179 throw new RepositoryIOException("Failed to analyze maven-metadata.xml file: " + metadataPath, ex); 180 } finally { 181 IOUtils.closeQuietly(is); 182 } 183 184 } 185 186 private static boolean isTargetForScope(String scope) { 187 return scope == null || !(scope.equalsIgnoreCase("test") || scope.equalsIgnoreCase("provided")); // FIXME 固定でいいかなぁ? 188 } 189 190 private static boolean isTargetForOptional(String optional) { 191 return optional == null || !optional.equalsIgnoreCase("true"); // FIXME 固定でいいかなぁ? 192 } 193 82 /** 83 * このリポジトリのベースURLを返します。 84 * 85 * @return 86 */ 194 87 public String getRepositoryUrl() { 195 88 return repositoryUrl; 196 89 } 197 90 91 /** 92 * ローカルリポジトリかどうかを返します。 93 * 94 * @return 95 */ 198 96 public boolean isLocal() { 199 97 return RepositoryScope.LOCAL_ONLY.match(repositoryUrl); -
lang/java/mvnbeans/trunk/src/test/java/jp/javelindev/mvnbeans/DummyArtifactFactory.java
r14393 r15681 8 8 Artifact artifact = new Artifact("mygroup", "myartifact1", "1.0"); 9 9 artifact.setScope(DependencyScope.ROOT); 10 artifact.setPom Url(new URL("http://hogehoge/foo/myartifact1-1.0.pom"));10 artifact.setPom(new Pom(new URL("http://hogehoge/foo/myartifact1-1.0.pom"), "DUMMY")); 11 11 return artifact; 12 12 } … … 21 21 Artifact artifact2 = new Artifact("mygroup2", "myartifact2", "2." + revision); 22 22 artifact2.setScope(DependencyScope.COMPILE); 23 artifact2.setPom Url(new URL("http://hogehoge/foo/myartifact2-2." + revision + ".pom"));23 artifact2.setPom(new Pom(new URL("http://hogehoge/foo/myartifact2-2." + revision + ".pom"), "DUMMY")); 24 24 artifact.addDependency(artifact2); 25 25 26 26 Artifact artifact3 = new Artifact("mygroup3", "myartifact3", "3." + revision); 27 27 artifact3.setScope(DependencyScope.PROVIDED); 28 artifact3.setPom Url(new URL("http://hogehoge/bar/myartifact3-3." + revision + ".pom"));28 artifact3.setPom(new Pom(new URL("http://hogehoge/bar/myartifact3-3." + revision + ".pom"), "DUMMY")); 29 29 artifact.addDependency(artifact3); 30 30 31 31 Artifact artifact4 = new Artifact("mygroup4", "myartifact4", "4." + revision); 32 32 artifact4.setScope(DependencyScope.TEST); 33 artifact4.setPom Url(new URL("http://hogehoge/bar/myartifact4-4." + revision + ".pom"));33 artifact4.setPom(new Pom(new URL("http://hogehoge/bar/myartifact4-4." + revision + ".pom"), "DUMMY")); 34 34 artifact2.addDependency(artifact4); 35 35 -
lang/java/mvnbeans/trunk/src/test/java/jp/javelindev/mvnbeans/ui/LibTest.java
r14542 r15681 62 62 63 63 // 各種URLを確認する。 64 URL pomUrl = artifact.getPom Url();64 URL pomUrl = artifact.getPom().getUrl(); 65 65 System.out.println(pomUrl); 66 66 assertTrue(pomUrl.toString().endsWith("/src/test/resources/localRepository/mygroup/myartifact/1.0/myartifact-1.0.pom")); … … 105 105 106 106 // 各種URLを確認する。 107 URL pomUrl = artifact.getPom Url();107 URL pomUrl = artifact.getPom().getUrl(); 108 108 System.out.println(pomUrl); 109 109 assertThat(pomUrl.toString(), is("http://maven2.javelindev.jp/repository/commons-pool/commons-pool/1.2.2/commons-pool-1.2.2.pom")); … … 228 228 @Test 229 229 public void プロキシの設定() throws Exception { 230 // プロキシは直接どうぞ:これで効くのであれば・・・ 231 // ★未確認 232 System.setProperty("http.proxyHost", "localhost"); 233 System.setProperty("http.proxyPort", "8080"); 230 // http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/net/proxies.html 231 232 // { 233 // InputStream is = new URL("http://java.sun.com/").openStream(); 234 // List lines = UrlUtils.readLines(is); 235 // System.out.println(lines); 236 // } 237 // System.out.println(System.getProperty("http.proxyHost")); 238 239 // プロキシサーバとポート 240 System.setProperty("http.proxyHost", "hoge.locaasdfasfsad234;lj;lkajsdfl;sakjfl;safkj;salkflhost"); 241 System.setProperty("http.proxyPort", "1234"); 242 243 // プロキシ対象外 244 System.setProperty("http.nonProxyHosts", "localhost|*.my.local.network"); 245 246 // この後のじゃまにならないように元に戻す 247 System.getProperties().remove("http.proxyHost"); 248 System.getProperties().remove("http.proxyPort"); 249 250 // { 251 // InputStream is = new URL("http://java.sun.com/").openStream(); 252 // List lines = UrlUtils.readLines(is); 253 // System.out.println(lines); 254 // } 234 255 } 235 256 }
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)