// Copyright FreeHEP, 2006-2007. package org.freehep.maven.nar; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Iterator; import java.util.Properties; import java.util.jar.JarEntry; import java.util.jar.JarFile; import org.apache.maven.plugin.logging.Log; /** * * @author Mark Donszelmann * @version $Id: NarInfo.java 13350 2007-09-20 18:42:29Z duns $ */ public class NarInfo { public static final String NAR_PROPERTIES = "nar.properties"; private String groupId, artifactId, version; private Properties info; private Log log; public NarInfo(String groupId, String artifactId, String version, Log log) { this.groupId = groupId; this.artifactId = artifactId; this.version = version; this.log = log; info = new Properties(); // Fill with general properties.nar file File propertiesDir = new File("src/main/resources/META-INF/nar/" + groupId + "/" + artifactId); if (!propertiesDir.exists()) { propertiesDir.mkdirs(); } File propertiesFile = new File(propertiesDir, NarInfo.NAR_PROPERTIES); try { info.load(new FileInputStream(propertiesFile)); } catch (IOException ioe) { // ignored } } public String toString() { StringBuffer s = new StringBuffer("NarInfo for "); s.append(groupId); s.append(":"); s.append(artifactId); s.append("-"); s.append(version); s.append(" {\n"); for (Iterator i = info.keySet().iterator(); i.hasNext();) { String key = (String) i.next(); s.append(" "); s.append(key); s.append("='"); s.append(info.getProperty(key, "<null>")); s.append("'\n"); } s.append("}\n"); return s.toString(); } public boolean exists(JarFile jar) { return getNarPropertiesEntry(jar) != null; } public void read(JarFile jar) throws IOException { info.load(jar.getInputStream(getNarPropertiesEntry(jar))); } private JarEntry getNarPropertiesEntry(JarFile jar) { return jar.getJarEntry("META-INF/nar/" + groupId + "/" + artifactId + "/" + NAR_PROPERTIES); } /** * No binding means default binding. * * @param aol * @return */ public String getBinding(AOL aol, String defaultBinding) { return getProperty(aol, "libs.binding", defaultBinding); } public void setBinding(AOL aol, String value) { setProperty(aol, "libs.binding", value); } // FIXME replace with list of AttachedNarArtifacts public String[] getAttachedNars(AOL aol, String type) { String attachedNars = getProperty(aol, "nar." + type); return attachedNars != null ? attachedNars.split(",") : null; } public void addNar(AOL aol, String type, String nar) { String nars = getProperty(aol, "nar." + type); nars = (nars == null) ? nar : nars + ", " + nar; setProperty(aol, "nar." + type, nars); } public void setNar(AOL aol, String type, String nar) { setProperty(aol, "nar." + type, nar); } public AOL getAOL(AOL aol) { return aol == null ? null : new AOL(getProperty(aol, aol.toString(), aol.toString())); } public String getOptions(AOL aol) { return getProperty(aol, "linker.options"); } public String getLibs(AOL aol) { return getProperty(aol, "libs.names", artifactId + "-" + version); } public String getSysLibs(AOL aol) { return getProperty(aol, "syslibs.names"); } public void writeToFile(File file) throws IOException { info.store(new FileOutputStream((file)), "NAR Properties for " + groupId + "." + artifactId + "-" + version); } private void setProperty(AOL aol, String key, String value) { if (aol == null) { info.setProperty(key, value); } else { info.setProperty(aol.toString() + "." + key, value); } } public String getProperty(AOL aol, String key) { return getProperty(aol, key, (String)null); } public String getProperty(AOL aol, String key, String defaultValue) { if (key == null) return defaultValue; String value = info.getProperty(key, defaultValue); value = aol == null ? value : info.getProperty(aol.toString() + "." + key, value); log.debug("getProperty(" + aol + ", " + key + ", " + defaultValue + ") = " + value); return value; } public int getProperty(AOL aol, String key, int defaultValue) { return Integer.parseInt(getProperty(aol, key, Integer.toString(defaultValue))); } public boolean getProperty(AOL aol, String key, boolean defaultValue) { return Boolean.parseBoolean(getProperty(aol, key, String.valueOf(defaultValue))); } public File getProperty(AOL aol, String key, File defaultValue) { return new File(getProperty(aol, key, defaultValue.getPath())); } }