001 /*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2008-2011 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * Sonar is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
019 */
020 package org.sonar.server.mavendeployer;
021
022 import org.apache.commons.codec.digest.DigestUtils;
023 import org.apache.commons.io.FileUtils;
024 import org.apache.commons.io.IOUtils;
025 import org.apache.commons.lang.CharEncoding;
026 import org.apache.commons.lang.StringUtils;
027
028 import java.io.File;
029 import java.io.IOException;
030 import java.io.InputStream;
031
032 public class Artifact {
033
034 public static final String BASE_GROUP_ID = "org.codehaus.sonar.runtime";
035
036 private String groupId;
037 private String artifactId;
038 protected String version;
039 protected File jar;
040 private String packaging;
041
042 public Artifact(String groupId, String artifactId, String version, String packaging, File jar) {
043 this.artifactId = artifactId;
044 this.groupId = groupId;
045 this.version = version;
046 this.jar = jar;
047 this.packaging = packaging;
048 }
049
050 public void deployTo(File rootDir) throws IOException {
051 File dir = createDir(rootDir);
052 savePom(dir);
053 saveMetadata(dir);
054 saveJar(dir);
055 }
056
057 protected File createDir(File rootDir) throws IOException {
058 String path = StringUtils.replace(groupId, ".", "/") + "/" + artifactId + "/" + version;
059 File dir = new File(rootDir, path);
060 FileUtils.forceMkdir(dir);
061 return dir;
062 }
063
064 protected String getArtifactName() {
065 return artifactId + "-" + version;
066 }
067
068 public String getGroupId() {
069 return groupId;
070 }
071
072 public String getArtifactId() {
073 return artifactId;
074 }
075
076 public String getVersion() {
077 return version;
078 }
079
080 private void saveJar(File dir) throws IOException {
081 if (jar != null) {
082 copyTo(dir);
083 File newJar = new File(dir, jar.getName());
084 File target = new File(dir, getArtifactName() + ".jar");
085 newJar.renameTo(target);
086 saveDigests(target);
087 }
088 }
089
090 protected void copyTo(File dir) throws IOException {
091 FileUtils.copyFileToDirectory(jar, dir);
092 }
093
094 private void savePom(File dir) throws IOException {
095 File pom = new File(dir, getArtifactName() + ".pom");
096 FileUtils.writeStringToFile(pom, getPom(), CharEncoding.UTF_8);
097 saveDigests(pom);
098 }
099
100 private void saveDigests(File file) throws IOException {
101 String path = file.getAbsolutePath();
102 byte[] content = FileUtils.readFileToByteArray(file);
103 FileUtils.writeStringToFile(new File(path + ".md5"), DigestUtils.md5Hex(content), CharEncoding.UTF_8);
104 FileUtils.writeStringToFile(new File(path + ".sha1"), DigestUtils.shaHex(content), CharEncoding.UTF_8);
105 }
106
107 public String getPom() throws IOException {
108 return transformFromTemplatePath(getTemplatePath());
109 }
110
111 protected String getTemplatePath() {
112 return "/org/sonar/server/mavendeployer/pom.template";
113 }
114
115 @Override
116 public boolean equals(Object o) {
117 if (this == o) {
118 return true;
119 }
120 if (o == null || getClass() != o.getClass()) {
121 return false;
122 }
123
124 Artifact that = (Artifact) o;
125 if (!artifactId.equals(that.artifactId)) {
126 return false;
127 }
128 return groupId.equals(that.groupId);
129 }
130
131 @Override
132 public int hashCode() {
133 int result = groupId.hashCode();
134 result = 31 * result + artifactId.hashCode();
135 return result;
136 }
137
138 @Override
139 public String toString() {
140 return new StringBuilder().append(groupId).append(":").append(artifactId).toString();
141 }
142
143 public String getMetadata() throws IOException {
144 return transformFromTemplatePath("/org/sonar/server/mavendeployer/maven-metadata.template");
145 }
146
147 protected void saveMetadata(File dir) throws IOException {
148 File metadataFile = new File(dir.getParentFile(), "maven-metadata.xml");
149 FileUtils.writeStringToFile(metadataFile, getMetadata(), CharEncoding.UTF_8);
150 }
151
152 protected final String transformFromTemplatePath(String templatePath) throws IOException {
153 InputStream template = this.getClass().getResourceAsStream(templatePath);
154 try {
155 String content = IOUtils.toString(template);
156 content = StringUtils.replace(content, "$groupId", groupId);
157 content = StringUtils.replace(content, "$artifactId", artifactId);
158 content = StringUtils.replace(content, "$version", version);
159 content = StringUtils.replace(content, "$timestamp", version);
160 content = StringUtils.replace(content, "$packaging", packaging);
161 return content;
162
163 } finally {
164 IOUtils.closeQuietly(template);
165 }
166 }
167
168 public String getXmlDefinition() throws IOException {
169 return transformFromTemplatePath("/org/sonar/server/mavendeployer/dependency.template");
170 }
171 }