package net.sourceforge.javautil.classloader.resolver.impl.maven;
import java.net.URL;
import net.sourceforge.javautil.classloader.resolver.ClassPackageProviderException;
import net.sourceforge.javautil.classloader.resolver.IClassDependencyPool;
import net.sourceforge.javautil.classloader.resolver.IClassPackage;
import net.sourceforge.javautil.classloader.resolver.IClassPackageDependencyReference;
import net.sourceforge.javautil.classloader.resolver.IClassPackageDescriptor;
import net.sourceforge.javautil.classloader.resolver.IClassPackageProvider;
import net.sourceforge.javautil.classloader.resolver.IClassPackageReference;
import net.sourceforge.javautil.classloader.resolver.IClassPackageRepositoryLocal;
import net.sourceforge.javautil.classloader.resolver.IClassPackageRepositoryLocalImportable;
import net.sourceforge.javautil.classloader.resolver.IClassPackageRepositoryRemote;
import net.sourceforge.javautil.classloader.resolver.IClassPackageResolver;
import net.sourceforge.javautil.classloader.resolver.IClassDependencyPool.PoolScope;
import net.sourceforge.javautil.classloader.resolver.impl.ClassDependencyPoolImpl;
import net.sourceforge.javautil.classloader.resolver.impl.ClassPackageImpl;
import net.sourceforge.javautil.classloader.resolver.impl.ClassPackageReferenceImpl;
import net.sourceforge.javautil.classloader.util.ClassPackageUtil;
import net.sourceforge.javautil.common.io.IVirtualArtifact;
import net.sourceforge.javautil.common.io.IVirtualDirectory;
import net.sourceforge.javautil.common.io.IVirtualFile;
import net.sourceforge.javautil.common.io.IVirtualPath;
import net.sourceforge.javautil.common.io.impl.SimplePath;
import net.sourceforge.javautil.common.io.impl.SystemDirectory;
import net.sourceforge.javautil.common.xml.XMLDocument;
/**
* A maven specific implementation for the {@link IClassPackageProvider}.
*
* @author elponderador
* @author $Author$
* @version $Id$
*/
public class MavenProvider implements IClassPackageProvider {
protected static final IVirtualPath JARRED_PATH_PREFIX = new SimplePath("META-INF/maven");
protected static final IClassPackageReference provider = new ClassPackageReferenceImpl(
IClassPackage.SELF_GROUPID, IClassPackage.SELF_ARTIFACTID,
IClassPackage.SELF_VERSION == null ? "unknown" : IClassPackage.SELF_VERSION.toVersionString(), null
);
protected IClassPackageResolver defaultResolver;
public IClassPackageReference getProviderInfo() { return provider; }
public IClassDependencyPool append(IClassDependencyPool pool, IClassPackageDependencyReference... references) {
ClassPackageUtil.append(pool, getDefaultResolver(), true, references);
return pool;
}
public IClassDependencyPool createPool(String name, PoolScope scope, IClassDependencyPool parent, IClassPackageDependencyReference... references) {
return this.append(parent.createChild(name, scope), references);
}
public IClassDependencyPool createPool(String name, IClassPackageDependencyReference... references) {
return this.append(new ClassDependencyPoolImpl(name), references);
}
public IClassPackageResolver getDefaultResolver() {
if (this.defaultResolver == null) {
this.defaultResolver = MavenRepositoryUtil.createStandardResolver();
}
return defaultResolver;
}
public IClassPackageDescriptor getDescriptor(IVirtualFile file) {
ProjectObjectModel pom = this.getProjectObjectModel(file);
if (pom == null)
throw new ClassPackageProviderException(this, "Could not find descriptor for: " + file);
return pom;
}
public IClassPackageRepositoryLocalImportable getLocalRepository(IVirtualDirectory repository) {
return new MavenRepositoryLocalPackage( repository );
}
public IClassPackageRepositoryLocalImportable getDefaultLocalRepository() {
String local = MavenLocalSettings.getDefaultInstance().getLocalRepository();
if (local == null) local = MavenLocalSettings.DEFAULT_LOCATION;
return getLocalRepository( new SystemDirectory( local ) );
}
public IClassPackageRepositoryLocalImportable getImportableRepository (IVirtualDirectory repository) {
return getLocalRepository(repository);
}
public IClassPackageRepositoryLocalImportable getDefaultImportableRepository() {
return getDefaultLocalRepository();
}
public IClassPackageRepositoryRemote getRemoteRepository(URL url) {
return new MavenRepositoryRemote(url.toExternalForm(), url);
}
public boolean isClassPackage(IVirtualArtifact artifact) {
return this.getDescriptorFile(artifact) != null;
}
/**
* This will return a parsed {@link ProjectObjectModel} if detected, otherwise null
*/
protected ProjectObjectModel getProjectObjectModel (IVirtualArtifact possibleClassPackage) {
IVirtualFile pomFile = this.getDescriptorFile(possibleClassPackage);
return pomFile == null ? null : XMLDocument.read(pomFile, ProjectObjectModel.class);
}
/**
* This will detect standard locations of the {@link ProjectObjectModel} file.
*/
protected IVirtualFile getDescriptorFile (IVirtualArtifact possibleClassPackage) {
if (possibleClassPackage instanceof IVirtualDirectory) {
IVirtualDirectory pkg = (IVirtualDirectory) possibleClassPackage;
IVirtualFile pomXMLFile = pkg.getFile(ProjectObjectModel.DEFAULT_FILE_NAME);
if (pomXMLFile == null) {
if ( pkg.isExists(JARRED_PATH_PREFIX) ) {
try {
IVirtualDirectory group = pkg.getDirectory(JARRED_PATH_PREFIX).getDirectories().get(0);
IVirtualDirectory artifact = group.getDirectories().get(0);
pomXMLFile = artifact.getFile(ProjectObjectModel.DEFAULT_FILE_NAME);
if (pomXMLFile != null) return pomXMLFile;
} catch (ArrayIndexOutOfBoundsException e) {}
}
} else return pomXMLFile;
}
return null;
}
}