summaryrefslogtreecommitdiff
path: root/src/main/java/org/apache/maven/plugin/nar/NarUtil.java
diff options
context:
space:
mode:
authorMark Donszelmann <Mark.Donszelmann@gmail.com>2009-10-01 14:33:24 +0200
committerMark Donszelmann <Mark.Donszelmann@gmail.com>2009-10-01 14:33:24 +0200
commit846700d44b67b22835b57a1c04f17043db8323a3 (patch)
treea253ecd4ada6f80dbcd08177035cfa71ade9b670 /src/main/java/org/apache/maven/plugin/nar/NarUtil.java
parent0a8746644d70eb8b1cfb615c27155c19e09f46d3 (diff)
downloadmaven-nar-plugin-846700d44b67b22835b57a1c04f17043db8323a3.tar.gz
maven-nar-plugin-846700d44b67b22835b57a1c04f17043db8323a3.tar.bz2
maven-nar-plugin-846700d44b67b22835b57a1c04f17043db8323a3.tar.xz
maven-nar-plugin-846700d44b67b22835b57a1c04f17043db8323a3.zip
Moved files in from freehep-nar-plugin version 2.0-alpha-11-SNAPSHOT
Diffstat (limited to 'src/main/java/org/apache/maven/plugin/nar/NarUtil.java')
-rw-r--r--src/main/java/org/apache/maven/plugin/nar/NarUtil.java417
1 files changed, 417 insertions, 0 deletions
diff --git a/src/main/java/org/apache/maven/plugin/nar/NarUtil.java b/src/main/java/org/apache/maven/plugin/nar/NarUtil.java
new file mode 100644
index 0000000..c5372b9
--- /dev/null
+++ b/src/main/java/org/apache/maven/plugin/nar/NarUtil.java
@@ -0,0 +1,417 @@
+// Copyright 2005-2007, FreeHEP.
+package org.freehep.maven.nar;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.regex.Pattern;
+
+import org.apache.bcel.classfile.ClassFormatException;
+import org.apache.bcel.classfile.ClassParser;
+import org.apache.bcel.classfile.JavaClass;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugin.logging.Log;
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.PropertyUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+
+/**
+ * @author Mark Donszelmann
+ * @version $Id: plugin/src/main/java/org/freehep/maven/nar/NarUtil.java 0ee9148b7c6a 2007/09/20 18:42:29 duns $
+ */
+public class NarUtil {
+
+ private static Properties defaults;
+
+ public static Properties getDefaults() throws MojoFailureException {
+ // read properties file with defaults
+ if (defaults == null) {
+ defaults = PropertyUtils.loadProperties(NarUtil.class
+ .getResourceAsStream("aol.properties"));
+ }
+ if (defaults == null)
+ throw new MojoFailureException(
+ "NAR: Could not load default properties file: 'aol.properties'.");
+
+ return defaults;
+ }
+
+ public static String getOS(String os) {
+ // adjust OS if not given
+ if (os == null) {
+ os = System.getProperty("os.name");
+ if (os.startsWith("Windows"))
+ os = OS.WINDOWS;
+ if (os.startsWith("windows"))
+ os = OS.WINDOWS;
+ if (os.equals("Mac OS X"))
+ os = OS.MACOSX;
+ }
+ return os;
+ }
+
+ public static String getArchitecture(String architecture) {
+ return architecture;
+ }
+
+ public static Linker getLinker(Linker linker) {
+ if (linker == null) {
+ linker = new Linker();
+ }
+ return linker;
+ }
+
+ public static String getLinkerName(String architecture, String os,
+ Linker linker) throws MojoFailureException {
+ return getLinker(linker).getName(getDefaults(),
+ getArchitecture(architecture) + "." + getOS(os) + ".");
+ }
+
+ public static AOL getAOL(String architecture, String os, Linker linker,
+ String aol) throws MojoFailureException {
+ // adjust aol
+ return aol == null ? new AOL(getArchitecture(architecture), getOS(os),
+ getLinkerName(architecture, os, linker)) : new AOL(aol);
+ }
+
+ // FIXME, should go to AOL.
+ public static String getAOLKey(String architecture, String os, Linker linker)
+ throws MojoFailureException {
+ // construct AOL key prefix
+ return getArchitecture(architecture) + "." + getOS(os) + "."
+ + getLinkerName(architecture, os, linker) + ".";
+ }
+
+ public static String getAOLKey(String aol) {
+ // FIXME, this may not always work correctly
+ return replace("-", ".", aol);
+ }
+
+ public static File getJavaHome(File javaHome, String os) {
+ // adjust JavaHome
+ if (javaHome == null) {
+ javaHome = new File(System.getProperty("java.home"));
+ if (!getOS(os).equals("MacOSX")) {
+ javaHome = new File(javaHome, "..");
+ }
+ }
+ return javaHome;
+ }
+
+ public static void makeExecutable(File file, final Log log)
+ throws MojoExecutionException, MojoFailureException {
+ if (!file.exists())
+ return;
+
+ if (file.isDirectory()) {
+ File[] files = file.listFiles();
+ for (int i = 0; i < files.length; i++) {
+ makeExecutable(files[i], log);
+ }
+ }
+ if (file.isFile() && file.canRead() && file.canWrite()
+ && !file.isHidden()) {
+ // chmod +x file
+ int result = runCommand("chmod", new String[] { "+x",
+ file.getPath() }, null, log);
+ if (result != 0) {
+ throw new MojoExecutionException("Failed to execute 'chmod +x "
+ + file.getPath() + "'" + " return code: \'" + result
+ + "\'.");
+ }
+ }
+ }
+
+ public static void runRanlib(File file, final Log log)
+ throws MojoExecutionException, MojoFailureException {
+ if (!file.exists()) {
+ return;
+ }
+
+ if (file.isDirectory()) {
+ File[] files = file.listFiles();
+ for (int i = 0; i < files.length; i++) {
+ runRanlib(files[i], log);
+ }
+ }
+ if (file.isFile() && file.canRead() && file.canWrite()
+ && !file.isHidden() && file.getName().endsWith(".a")) {
+ // ranlib file
+ int result = runCommand("ranlib", new String[] { file.getPath() },
+ null, log);
+ if (result != 0) {
+ throw new MojoExecutionException("Failed to execute 'ranlib "
+ + file.getPath() + "'" + " return code: \'" + result
+ + "\'.");
+ }
+ }
+ }
+
+ /**
+ * Returns the Bcel Class corresponding to the given class filename
+ *
+ * @param filename
+ * the absolute file name of the class
+ * @return the Bcel Class.
+ * @throws IOException,
+ * ClassFormatException
+ */
+ public static final JavaClass getBcelClass(String filename)
+ throws IOException, ClassFormatException {
+ ClassParser parser = new ClassParser(filename);
+ return parser.parse();
+ }
+
+ /**
+ * Returns the header file name (javah) corresponding to the given class
+ * file name
+ *
+ * @param filename
+ * the absolute file name of the class
+ * @return the header file name.
+ */
+ public static final String getHeaderName(String base, String filename) {
+ base = base.replaceAll("\\\\", "/");
+ filename = filename.replaceAll("\\\\", "/");
+ if (!filename.startsWith(base)) {
+ throw new IllegalArgumentException("Error " + filename
+ + " does not start with " + base);
+ }
+ String header = filename.substring(base.length() + 1);
+ header = header.replaceAll("/", "_");
+ header = header.replaceAll("\\.class", ".h");
+ return header;
+ }
+
+ /**
+ * Replaces target with replacement in string. For jdk 1.4 compatiblity.
+ *
+ * @param target
+ * @param replacement
+ * @param string
+ * @return
+ */
+ public static String replace(CharSequence target, CharSequence replacement,
+ String string) {
+ return Pattern.compile(quote(target.toString())/*
+ * , Pattern.LITERAL jdk
+ * 1.4
+ */).matcher(string).replaceAll(
+ /* Matcher. jdk 1.4 */quoteReplacement(replacement.toString()));
+ }
+
+ /* for jdk 1.4 */
+ private static String quote(String s) {
+ int slashEIndex = s.indexOf("\\E");
+ if (slashEIndex == -1)
+ return "\\Q" + s + "\\E";
+
+ StringBuffer sb = new StringBuffer(s.length() * 2);
+ sb.append("\\Q");
+ slashEIndex = 0;
+ int current = 0;
+ while ((slashEIndex = s.indexOf("\\E", current)) != -1) {
+ sb.append(s.substring(current, slashEIndex));
+ current = slashEIndex + 2;
+ sb.append("\\E\\\\E\\Q");
+ }
+ sb.append(s.substring(current, s.length()));
+ sb.append("\\E");
+ return sb.toString();
+ }
+
+ /* for jdk 1.4 */
+ private static String quoteReplacement(String s) {
+ if ((s.indexOf('\\') == -1) && (s.indexOf('$') == -1))
+ return s;
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < s.length(); i++) {
+ char c = s.charAt(i);
+ if (c == '\\') {
+ sb.append('\\');
+ sb.append('\\');
+ } else if (c == '$') {
+ sb.append('\\');
+ sb.append('$');
+ } else {
+ sb.append(c);
+ }
+ }
+ return sb.toString();
+ }
+
+ public static final String DEFAULT_EXCLUDES = "**/*~,**/#*#,**/.#*,**/%*%,**/._*,"
+ + "**/CVS,**/CVS/**,**/.cvsignore,"
+ + "**/SCCS,**/SCCS/**,**/vssver.scc,"
+ + "**/.svn,**/.svn/**,**/.DS_Store";
+
+ public static int copyDirectoryStructure(File sourceDirectory,
+ File destinationDirectory, String includes, String excludes)
+ throws IOException {
+ if (!sourceDirectory.exists()) {
+ throw new IOException("Source directory doesn't exists ("
+ + sourceDirectory.getAbsolutePath() + ").");
+ }
+
+ List files = FileUtils.getFiles(sourceDirectory, includes, excludes);
+ String sourcePath = sourceDirectory.getAbsolutePath();
+
+ int copied = 0;
+ for (Iterator i = files.iterator(); i.hasNext();) {
+ File file = (File) i.next();
+ String dest = file.getAbsolutePath();
+ dest = dest.substring(sourcePath.length() + 1);
+ File destination = new File(destinationDirectory, dest);
+ if (file.isFile()) {
+ destination = destination.getParentFile();
+ FileUtils.copyFileToDirectory(file, destination);
+ copied++;
+ } else if (file.isDirectory()) {
+ if (!destination.exists() && !destination.mkdirs()) {
+ throw new IOException(
+ "Could not create destination directory '"
+ + destination.getAbsolutePath() + "'.");
+ }
+ copied += copyDirectoryStructure(file, destination, includes,
+ excludes);
+ } else {
+ throw new IOException("Unknown file type: "
+ + file.getAbsolutePath());
+ }
+ }
+ return copied;
+ }
+
+ public static String getEnv(String envKey, String alternateSystemProperty,
+ String defaultValue) {
+ String envValue = null;
+ try {
+ envValue = System.getenv(envKey);
+ if (envValue == null && alternateSystemProperty != null) {
+ envValue = System.getProperty(alternateSystemProperty);
+ }
+ } catch (Error e) {
+ // JDK 1.4?
+ if (alternateSystemProperty != null) {
+ envValue = System.getProperty(alternateSystemProperty);
+ }
+ }
+
+ if (envValue == null) {
+ envValue = defaultValue;
+ }
+
+ return envValue;
+ }
+
+ public static String addLibraryPathToEnv(String path, Map environment,
+ String os) {
+ String pathName = null;
+ char separator = ' ';
+ if (os.equals(OS.WINDOWS)) {
+ pathName = "PATH";
+ separator = ';';
+ } else if (os.equals(OS.MACOSX)) {
+ pathName = "DYLD_LIBRARY_PATH";
+ separator = ':';
+ } else {
+ pathName = "LD_LIBRARY_PATH";
+ separator = ':';
+ }
+
+ String value = environment != null ? (String) environment.get(pathName)
+ : null;
+ if (value == null) {
+ value = NarUtil.getEnv(pathName, pathName, null);
+ }
+
+ path = path.replace(File.pathSeparatorChar, separator);
+ if (value != null) {
+ value += separator + path;
+ } else {
+ value = path;
+ }
+ if (environment != null) {
+ environment.put(pathName, value);
+ }
+ return pathName + "=" + value;
+ }
+
+ public static int runCommand(String cmd, String[] args, String[] env,
+ Log log) throws MojoExecutionException, MojoFailureException {
+ log.debug("RunCommand: " + cmd);
+ Commandline cmdLine = new Commandline();
+ cmdLine.setExecutable(cmd);
+ if (args != null) {
+ for (int i = 0; i < args.length; i++) {
+ log.debug(" '" + args[i] + "'");
+ }
+ cmdLine.addArguments(args);
+ }
+
+ if (env != null) {
+ log.debug("with Env:");
+ for (int i = 0; i < env.length; i++) {
+ String[] nameValue = env[i].split("=", 2);
+ if (nameValue.length < 2)
+ throw new MojoFailureException(" Misformed env: '"
+ + env[i] + "'");
+ log.debug(" '" + env[i] + "'");
+ cmdLine.addEnvironment(nameValue[0], nameValue[1]);
+ }
+ }
+
+ try {
+ Process process = cmdLine.execute();
+ StreamGobbler errorGobbler = new StreamGobbler(process
+ .getErrorStream(), true, log);
+ StreamGobbler outputGobbler = new StreamGobbler(process
+ .getInputStream(), false, log);
+
+ errorGobbler.start();
+ outputGobbler.start();
+ process.waitFor();
+ return process.exitValue();
+ } catch (Throwable e) {
+ throw new MojoExecutionException("Could not launch " + cmdLine, e);
+ }
+ }
+
+ static class StreamGobbler extends Thread {
+ InputStream is;
+ boolean error;
+ Log log;
+
+ StreamGobbler(InputStream is, boolean error, Log log) {
+ this.is = is;
+ this.error = error;
+ this.log = log;
+ }
+
+ public void run() {
+ try {
+ BufferedReader reader = new BufferedReader(
+ new InputStreamReader(is));
+ String line = null;
+ while ((line = reader.readLine()) != null) {
+ if (error) {
+ log.error(line);
+ } else {
+ log.debug(line);
+ }
+ }
+ reader.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+}