package de.saumya.mojo.mavengem;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.jruby.embed.IsolatedScriptingContainer;
import org.jruby.embed.ScriptingContainer;
import org.sonatype.nexus.ruby.DefaultRubygemsGateway;
import org.sonatype.nexus.ruby.RubygemsGateway;
import org.sonatype.nexus.ruby.FileType;
import org.sonatype.nexus.ruby.GemArtifactFile;
import org.sonatype.nexus.ruby.IOUtil;
import org.sonatype.nexus.ruby.RubygemsFile;
import org.sonatype.nexus.ruby.cuba.RubygemsFileSystem;
import org.sonatype.nexus.ruby.layout.CachingProxyStorage;
import org.sonatype.nexus.ruby.layout.ProxiedRubygemsFileSystem;
import org.sonatype.nexus.ruby.layout.ProxyStorage;
public class RubygemsFactory {
private static RubygemsGateway gateway = new DefaultRubygemsGateway(new IsolatedScriptingContainer());
private static Map<URL, Rubygems> facades = new HashMap<URL, Rubygems>();
static URL NO_MIRROR;
static {
try {
NO_MIRROR = new URL("http://example.com/no_mirror");
}
catch (MalformedURLException e) {
throw new RuntimeException( "can not happen", e);
}
}
public static File DEFAULT_CACHEDIR = new File(System.getProperty("user.home"), ".mavengem");
public static final String MAVENGEM_MIRROR = "mavengem.mirror";
public static final String MAVENGEM_CACHEDIR = "mavengem.cachedir";
// keep package access for testing
final File cacheDir;
final Map<URL, URL> mirrors;
final URL catchAllMirror;
static RubygemsFactory factory;
public static synchronized RubygemsFactory defaultFactory()
throws MalformedURLException {
if (factory == null) {
factory = new RubygemsFactory(null, null, null, false);
}
return factory;
}
public RubygemsFactory()
throws MalformedURLException {
this(DEFAULT_CACHEDIR, NO_MIRROR, null);
}
public RubygemsFactory(URL mirror)
throws MalformedURLException {
this(DEFAULT_CACHEDIR, mirror, null);
}
public RubygemsFactory(Map<URL, URL> mirrors)
throws MalformedURLException {
this(DEFAULT_CACHEDIR, NO_MIRROR, mirrors);
}
public RubygemsFactory(File cacheDir)
throws MalformedURLException {
this(cacheDir, NO_MIRROR, null);
}
public RubygemsFactory(File cacheDir, URL mirror)
throws MalformedURLException {
this(cacheDir, mirror, null);
}
public RubygemsFactory(File cacheDir, Map<URL, URL> mirrors)
throws MalformedURLException {
this(cacheDir, NO_MIRROR, mirrors);
}
private RubygemsFactory(File cacheDir, URL mirror, Map<URL, URL> mirrors)
throws MalformedURLException {
this(cacheDir, mirror, mirrors, true);
}
private RubygemsFactory(File cacheDir, URL mirror, Map<URL, URL> mirrors, boolean check)
throws MalformedURLException {
if (check) {
if (cacheDir == null) {
throw new IllegalArgumentException("cache directory can not be null");
}
if (mirror == null) {
throw new IllegalArgumentException("mirror can not be null");
}
}
if (mirror != null) {
this.catchAllMirror = mirror;
}
else {
if (System.getProperty(MAVENGEM_MIRROR) != null) {
this.catchAllMirror = new URL(System.getProperty(MAVENGEM_MIRROR));
}
else {
this.catchAllMirror = NO_MIRROR;
}
}
this.mirrors = mirrors == null ? null : new HashMap(mirrors);
if (cacheDir != null) {
this.cacheDir = cacheDir;
}
else if (System.getProperty(MAVENGEM_CACHEDIR) != null) {
this.cacheDir = new File(System.getProperty(MAVENGEM_CACHEDIR));
}
else {
this.cacheDir = DEFAULT_CACHEDIR;
}
}
public Rubygems getOrCreate(URL url)
throws MalformedURLException {
if (this.catchAllMirror != NO_MIRROR) {
url = this.catchAllMirror;
}
else if (this.mirrors != null && this.mirrors.containsKey(url)) {
url = mirrors.get(url);
}
// FIXME the cachedir when coming from the facades map
// can be different as map get shared between factories
synchronized(facades) {
Rubygems result = facades.get(url);
if (result == null) {
result = new Rubygems(url, this.cacheDir);
facades.put(url, result);
}
return result;
}
}
}