/*
* Copyright 2012 James Moger
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.moxie.proxy.resources;
import java.io.File;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.moxie.Dependency;
import org.moxie.Pom;
import org.moxie.RemoteRepository;
import org.moxie.Scope;
import org.moxie.proxy.Constants;
import org.moxie.proxy.DependencyLink;
import org.moxie.utils.FileUtils;
import org.moxie.utils.StringUtils;
import org.restlet.representation.Representation;
import org.restlet.resource.Get;
public class ArtifactsResource extends BaseResource {
@Override
protected String getBasePath() {
// grab snapshots/releases/whatever from request url
String path = getRequest().getResourceRef().getPath();
if (path.charAt(0) == '/') {
path = path.substring(1);
}
if (path.indexOf('/') > -1) {
return path.substring(0, path.indexOf('/'));
}
return path;
}
@Override
protected String getBasePathName() {
String basepath = getBasePath();
try {
// return a translation of the base path, if available
return getTranslation().getString("mp." + basepath);
} catch (Throwable t) {
return basepath;
}
}
boolean isRemoteRepository() {
String repository = getBasePath();
return getProxyConfig().isRemoteRepository(repository);
}
String getRepositoryUrl() {
if (isRemoteRepository()) {
RemoteRepository repository = getProxyConfig().getRemoteRepository(getBasePath());
return repository.url;
}
String repository = getBasePath();
return getRootRef() + "/m2/" + repository;
}
String getProxyScheme() {
return "http";
}
String getProxyUrl() {
return getProxyScheme() + "://" + getRootRef().getHostDomain() + ":" + getProxyConfig().getProxyPort();
}
String getRepositoryNote(Pom pom) {
if (pom != null) {
return null;
} else if (isRemoteRepository()) {
// remote/proxied repository
RemoteRepository repository = getProxyConfig().getRemoteRepository(getBasePath());
String message = getTranslation().getString("mp.remoteRepositoryNote");
return MessageFormat.format(message, repository.id, repository.getHost(), getProxyUrl());
} else {
// local repository
String repository = getBasePath();
String message = getTranslation().getString("mp.localRepositoryNote");
return MessageFormat.format(message, repository);
}
}
String getRepositoryId() {
String repository = getBasePath();
return "moxie" + Character.toUpperCase(repository.charAt(0)) + repository.substring(1);
}
String getMoxieSnippet(Pom pom) {
StringBuilder sb = new StringBuilder();
if (pom != null) {
// artifact
sb.append("dependencies:\n");
sb.append(" - compile '").append(pom.getCoordinates()).append('\'');
} else if (isRemoteRepository()) {
// proxy settings
RemoteRepository repository = getProxyConfig().getRemoteRepository(getBasePath());
sb.append("proxies:\n");
sb.append(MessageFormat.format("- '{'\n active: true\n id: ''moxieProxy''\n protocol: ''{0}''\n host: ''{1}''\n port: {2,number,0}\n username: ''username''\n password: ''password''\n proxyHosts: ''{3}''\n'}'", getProxyScheme(), getRootRef().getHostDomain(), getProxyConfig().getProxyPort(), repository.getHost()));
} else {
// repository settings
sb.append("registeredRepositories:\n");
sb.append(MessageFormat.format(" - '{'\n id: ''{0}''\n url: ''{1}''\n' }'\n", getRepositoryId(), getRepositoryUrl()));
sb.append(MessageFormat.format("repositories: ''central'', ''{0}''\n", getRepositoryId()));
}
return sb.toString();
}
String getMavenSnippet(Pom pom) {
String repository = getBasePath();
StringBuilder sb = new StringBuilder();
if (pom != null) {
// artifact
sb.append("<dependency>\n");
sb.append(StringUtils.toXML("groupId", pom.groupId));
sb.append(StringUtils.toXML("artifactId", pom.artifactId));
sb.append(StringUtils.toXML("version", pom.version));
sb.append(StringUtils.toXML("scope", Scope.compile.name()));
sb.append("</dependency>");
} else if (isRemoteRepository()) {
// proxy settings
sb.append("<proxy>\n");
sb.append(StringUtils.toXML("id", "moxieProxy"));
sb.append(StringUtils.toXML("active", "true"));
sb.append(StringUtils.toXML("protocol", getProxyScheme()));
sb.append(StringUtils.toXML("host", getRootRef().getHostDomain()));
sb.append(StringUtils.toXML("port", "" + getProxyConfig().getProxyPort()));
sb.append(StringUtils.toXML("username", "username"));
sb.append(StringUtils.toXML("password", "password"));
sb.append(StringUtils.toXML("nonProxyHosts", "*.nonproxyrepos.com|localhost"));
sb.append("</proxy>");
} else {
// repository settings
sb.append("<repository>\n");
sb.append(StringUtils.toXML("id", getRepositoryId()));
sb.append(StringUtils.toXML("name", Constants.getName() + " " + repository));
sb.append(StringUtils.toXML("url", getRepositoryUrl()));
sb.append(StringUtils.toXML("layout", "default"));
sb.append("</repository>");
}
return StringUtils.escapeForHtml(sb.toString(), false);
}
String getGradleSnippet(Pom pom) {
StringBuilder sb = new StringBuilder();
if (pom != null) {
// artifact
sb.append("dependencies {\n");
sb.append(" compile \"").append(pom.getCoordinates()).append("\"\n");
sb.append("}");
} else if (isRemoteRepository()) {
// proxy settings
String base = "systemProp." + getRootRef().getScheme() + ".";
sb.append(base).append("proxyHost=").append(getRootRef().getHostDomain()).append('\n');
sb.append(base).append("proxyPort=").append(getProxyConfig().getProxyPort()).append('\n');
sb.append(base).append("proxyUser=username").append('\n');
sb.append(base).append("proxyPassword=password\n");
sb.append(base).append("nonProxyHosts=*.nonproxyrepos.com|localhost");
} else {
// repository settings
sb.append("repositories {\n");
sb.append(" maven {\n");
sb.append(" url \"").append(getRepositoryUrl()).append("\"\n");
sb.append(" }\n");
sb.append("}");
}
return sb.toString();
}
String getGrapeSnippet(Pom pom) {
StringBuilder sb = new StringBuilder();
if (pom != null) {
// artifact
sb.append("@Grapes(\n");
sb.append(MessageFormat.format(" @Grab(group=''{0}'',\n\tmodule=''{1}'',\n\tversion=''{2}'')\n", pom.groupId, pom.artifactId, pom.version));
sb.append(")");
} else if (isRemoteRepository()) {
// proxy settings
} else {
// repository settings
sb.append(MessageFormat.format("@GrabResolver(\n\tname=''{0}'',\n\troot=''{1}'')", getRepositoryId(), getRepositoryUrl()));
}
return StringUtils.escapeForHtml(sb.toString(), false);
}
String getIvySnippet(Pom pom) {
StringBuilder sb = new StringBuilder();
if (pom != null) {
// artifact
sb.append(MessageFormat.format("<dependency\n\torg=\"{0}\"\n\tname=\"{1}\"\n\trev=\"{2}\" />", pom.groupId, pom.artifactId, pom.version));
} else if (isRemoteRepository()) {
// proxy settings
sb.append(MessageFormat.format("<setproxy\n\tproxyhost=\"{0}\"\n\tproxyport=\"{1,number,0}\"\n\tproxyuser=\"username\"\n\tproxypassword=\"password\"\n\tnonproxyhosts=\"*.nonproxyrepos.com|localhost\"/>", getRootRef().getHostDomain(), getProxyConfig().getProxyPort()));
} else {
// repository settings
sb.append("<resolvers>\n");
sb.append(MessageFormat.format(" <ibiblio name=\"{0}\" m2compatible=\"true\"\n\troot=\"{1}\" />\n", getRepositoryId(), getRepositoryUrl()));
sb.append("</resolvers>");
}
return StringUtils.escapeForHtml(sb.toString(), false);
}
File getArtifactRoot() {
return getProxyConfig().getArtifactRoot(getBasePath());
}
File getFile(String path) {
File root = getArtifactRoot();
File file;
if (StringUtils.isEmpty(path)) {
file = root;
} else {
if (path.startsWith(getBasePath())) {
// strip leading /releases or /snapshots
path = path.substring(getBasePath().length() + 1);
}
file = new File(root, path);
}
return file;
}
List<ListItem> getItems(File folder) {
String rootPath = getArtifactRoot().getAbsolutePath();
List<ListItem> list = new ArrayList<ListItem>();
String pattern = getProxyConfig().getDateFormat();
SimpleDateFormat df = new SimpleDateFormat(pattern);
File [] files = folder.listFiles();
if (files != null) {
for (File file : files) {
String relativePath= StringUtils.getRelativePath(rootPath, file.getAbsolutePath());
ListItem item = new ListItem(file.getName(), relativePath, file.isFile() && !isText(file));
item.isDirectory = file.isDirectory();
if (file.isFile()) {
item.size = FileUtils.formatSize(file.length());
item.date = df.format(new Date(file.lastModified()));
}
list.add(item);
}
}
Collections.sort(list);
return list;
}
List<ListItem> getCrumbs(File folder) {
String rootPath = getArtifactRoot().getAbsolutePath();
String folderPath = folder.getAbsolutePath();
String relativePath = StringUtils.getRelativePath(rootPath, folderPath);
List<ListItem> list = new ArrayList<ListItem>();
String [] paths = relativePath.split("/");
for (int i = 0; i < Math.max(0, paths.length - 1); i++) {
// build relative path links
StringBuilder sb = new StringBuilder();
for (int j = 0; j <= i; j++) {
sb.append(paths[j].trim()).append('/');
}
// exclude breadcrumb root
if (sb.length() > 1) {
// trim out trailing /
sb.setLength(sb.length() - 1);
list.add(new ListItem(paths[i], sb.toString(), false));
}
}
return list;
}
List<DependencyLink> getDependencies(Pom pom) {
if (pom == null) {
return null;
}
// find dependencies as they might be in another local/proxied repository
List<DependencyLink> list = new ArrayList<DependencyLink>();
for (Dependency dependency : pom.getDependencies(true)) {
DependencyLink link = getProxyConfig().find(dependency);
if (link != null) {
list.add(link);
}
}
return list;
}
@Get
public Representation toText() {
String path = getRequestAttribute("path");
File file = getFile(path);
if (!file.exists()) {
// TODO proxy download? do not know source repo, try all?
getLogger().warning(path + " does not exist!");
}
Map<String, Object> map = new HashMap<String, Object>();
map.put("title", Constants.getName());
map.put("crumbsRoot", getBasePathName());
map.put("repository", getBasePath());
map.put("crumbs", getCrumbs(file));
boolean isRemote = isRemoteRepository();
String activeCrumb = file.getName();
if (isRemote && file.equals(getArtifactRoot())) {
// show the proxied url as the active root crumb
activeCrumb = getProxyConfig().getRemoteRepository(getBasePath()).url;
}
map.put("activeCrumb", activeCrumb);
if (file.isFile()) {
if (isText(file)) {
// display file content
String content = FileUtils.readContent(file, "\n").trim();
String html = StringUtils.escapeForHtml(content, true);
map.put("content", html);
return toHtml(map, "artifact.html");
}
}
// list of files/folders
Pom pom = getApplication().readPom(file);
map.put("pom", pom);
map.put("dependencies", getDependencies(pom));
map.put("isRemoteRepository", isRemote);
map.put("repositoryUrl", getRepositoryUrl());
map.put("repositoryNote", getRepositoryNote(pom));
map.put("moxieSnippet", getMoxieSnippet(pom));
map.put("mavenSnippet", getMavenSnippet(pom));
map.put("gradleSnippet", getGradleSnippet(pom));
map.put("grapeSnippet", getGrapeSnippet(pom));
map.put("ivySnippet", getIvySnippet(pom));
map.put("items", getItems(file));
return toHtml(map, "artifacts.html");
}
boolean isText(File file) {
String ext = file.getName().substring(file.getName().lastIndexOf('.') + 1).toLowerCase();
if ("pom".equals(ext) || "xml".equals(ext) || "sha1".equals(ext) || "md5".equals(ext) || "asc".equals(ext)) {
return true;
}
return false;
}
}