package org.apache.maven.plugin.nar;
import java.io.File;
import java.io.IOException;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectHelper;
import org.codehaus.plexus.archiver.manager.ArchiverManager;
import org.codehaus.plexus.util.FileUtils;
/**
* NAR layout for oodrive projects. Pack all the binaries in the same NAR (bin
* and lib directories).
* <p>
* TODO separate dev binaries / noarch files from runtime binaries / noarch
* files.
*
* @author oodrive
* @author llambert
*/
public final class NarLayoutOodrive extends AbstractNarLayout {
private final NarFileLayout fileLayout;
public NarLayoutOodrive(Log log) {
super(log);
this.fileLayout = new NarFileLayoutOodrive();
}
private File getAolDirectory(File baseDir, String artifactId,
String version, String aol, String type) {
return new File(baseDir, artifactId + "-" + version + "-" + aol + "-bin");
}
@Override
public File getNoArchDirectory(File baseDir, String artifactId,
String version) throws MojoExecutionException, MojoFailureException {
return new File(baseDir, artifactId + "-" + version + "-"
+ NarConstants.NAR_NO_ARCH);
}
@Override
public File getLibDirectory(File baseDir, String artifactId,
String version, String aol, String type)
throws MojoExecutionException, MojoFailureException {
// if (type.equals(Library.EXECUTABLE)) {
// throw new MojoExecutionException(
// "NAR: for type EXECUTABLE call getBinDirectory instead of getLibDirectory");
// }
File dir = getAolDirectory(baseDir, artifactId, version, aol, type);
dir = new File(dir, fileLayout.getLibDirectory(aol, type));
return dir;
}
@Override
public File getIncludeDirectory(File baseDir, String artifactId,
String version) throws MojoExecutionException, MojoFailureException {
return new File(getNoArchDirectory(baseDir, artifactId, version),
fileLayout.getIncludeDirectory());
}
@Override
public File getBinDirectory(File baseDir, String artifactId,
String version, String aol) throws MojoExecutionException,
MojoFailureException {
File dir = getAolDirectory(baseDir, artifactId, version, aol,
Library.EXECUTABLE);
dir = new File(dir, fileLayout.getBinDirectory(aol));
return dir;
}
@Override
public void attachNars(File baseDir, ArchiverManager archiverManager,
MavenProjectHelper projectHelper, MavenProject project,
NarInfo narInfo) throws MojoExecutionException,
MojoFailureException {
if (getNoArchDirectory(baseDir, project.getArtifactId(),
project.getVersion()).exists()) {
attachNar(
archiverManager,
projectHelper,
project,
NarConstants.NAR_NO_ARCH,
getNoArchDirectory(baseDir, project.getArtifactId(),
project.getVersion()), "*/**");
narInfo.setNar(null, NarConstants.NAR_NO_ARCH, project.getGroupId()
+ ":" + project.getArtifactId() + ":"
+ NarConstants.NAR_TYPE + ":" + NarConstants.NAR_NO_ARCH);
}
// list all directories in basedir, scan them for classifiers
String[] subDirs = baseDir.list();
for (int i = 0; (subDirs != null) && (i < subDirs.length); i++) {
String artifactIdVersion = project.getArtifactId() + "-"
+ project.getVersion();
// skip entries not belonging to this project
if (!subDirs[i].startsWith(artifactIdVersion))
continue;
String classifier = subDirs[i]
.substring(artifactIdVersion.length() + 1);
// skip noarch here
if (classifier.equals(NarConstants.NAR_NO_ARCH))
continue;
File dir = new File(baseDir, subDirs[i]);
attachNar(archiverManager, projectHelper, project, classifier, dir,
"*/**");
int lastDash = classifier.lastIndexOf('-');
String type = classifier.substring(lastDash + 1);
AOL aol = new AOL(classifier.substring(0, lastDash - 1));
if (type.equals(Library.EXECUTABLE)) {
if (narInfo.getBinding(aol, null) == null) {
narInfo.setBinding(aol, Library.EXECUTABLE);
}
if (narInfo.getBinding(null, null) == null) {
narInfo.setBinding(null, Library.EXECUTABLE);
}
} else {
// and not set or override if SHARED
if ((narInfo.getBinding(aol, null) == null)
|| !type.equals(Library.SHARED)) {
narInfo.setBinding(aol, type);
}
// and not set or override if SHARED
if ((narInfo.getBinding(null, null) == null)
|| !type.equals(Library.SHARED)) {
narInfo.setBinding(null, type);
}
}
narInfo.setNar(null, type,
project.getGroupId() + ":" + project.getArtifactId() + ":"
+ NarConstants.NAR_TYPE + ":" + "${aol}" + "-"
+ type);
}
}
@Override
public void unpackNar(File unpackDirectory,
ArchiverManager archiverManager, File file, String os,
String linkerName, AOL defaultAOL) throws MojoExecutionException,
MojoFailureException {
File dir = getNarUnpackDirectory(unpackDirectory, file);
boolean process = false;
if (!unpackDirectory.exists()) {
unpackDirectory.mkdirs();
process = true;
} else if (!dir.exists()) {
process = true;
} else if (file.lastModified() > dir.lastModified()) {
try {
FileUtils.deleteDirectory(dir);
} catch (IOException e) {
throw new MojoExecutionException("Could not delete directory: "
+ dir, e);
}
process = true;
}
if (process) {
unpackNarAndProcess(archiverManager, file, dir, os, linkerName,
defaultAOL);
}
}
@Override
public File getNarUnpackDirectory(File baseUnpackDirectory, File narFile) {
File dir = new File(baseUnpackDirectory, FileUtils.basename(
narFile.getPath(), "." + NarConstants.NAR_EXTENSION));
return dir;
}
}