blob: 6bb33b6b9d24b8a1d307dfb9d945beb468b9bdfd [file] [log] [blame]
package aQute.lib.deployer;
import java.io.*;
import java.util.*;
import java.util.jar.*;
import java.util.regex.*;
import aQute.bnd.header.*;
import aQute.bnd.osgi.*;
import aQute.bnd.version.*;
import aQute.lib.io.*;
import aQute.service.reporter.*;
public class FileInstallRepo extends FileRepo {
String group;
boolean dirty;
Reporter reporter;
Pattern REPO_FILE = Pattern.compile("([-a-zA-z0-9_\\.]+)-([0-9\\.]+)\\.(jar|lib)");
@Override
public void setProperties(Map<String,String> map) {
super.setProperties(map);
group = map.get("group");
}
@Override
public void setReporter(Reporter reporter) {
super.setReporter(reporter);
this.reporter = reporter;
}
@Override
protected PutResult putArtifact(File tmpFile, PutOptions options) throws Exception {
assert (tmpFile != null);
assert (options != null);
Jar jar = null;
try {
init();
dirty = true;
jar = new Jar(tmpFile);
Manifest manifest = jar.getManifest();
if (manifest == null)
throw new IllegalArgumentException("No manifest in JAR: " + jar);
String bsn = manifest.getMainAttributes().getValue(Analyzer.BUNDLE_SYMBOLICNAME);
if (bsn == null)
throw new IllegalArgumentException("No Bundle SymbolicName set");
Parameters b = Processor.parseHeader(bsn, null);
if (b.size() != 1)
throw new IllegalArgumentException("Multiple bsn's specified " + b);
for (String key : b.keySet()) {
bsn = key;
if (!Verifier.SYMBOLICNAME.matcher(bsn).matches())
throw new IllegalArgumentException("Bundle SymbolicName has wrong format: " + bsn);
}
String versionString = manifest.getMainAttributes().getValue(Analyzer.BUNDLE_VERSION);
Version version;
if (versionString == null)
version = new Version();
else
version = new Version(versionString);
if (reporter != null)
reporter.trace("bsn=%s version=%s", bsn, version);
File dir;
if (group == null) {
dir = getRoot();
} else {
dir = new File(getRoot(), group);
if (!dir.exists() && !dir.mkdirs()) {
throw new IOException("Could not create directory " + dir);
}
}
String fName = bsn + "-" + version.getWithoutQualifier() + ".jar";
File file = new File(dir, fName);
PutResult result = new PutResult();
if (reporter != null)
reporter.trace("updating %s ", file.getAbsolutePath());
if (file.exists()) {
IO.delete(file);
}
IO.rename(tmpFile, file);
result.artifact = file.toURI();
if (reporter != null)
reporter.progress(-1, "updated " + file.getAbsolutePath());
fireBundleAdded(jar, file);
File latest = new File(dir, bsn + "-latest.jar");
boolean latestExists = latest.exists() && latest.isFile();
boolean latestIsOlder = latestExists && (latest.lastModified() < jar.lastModified());
if ((options.createLatest && !latestExists) || latestIsOlder) {
if (latestExists) {
IO.delete(latest);
}
IO.copy(file, latest);
result.latest = latest.toURI();
}
return result;
}
finally {
if (jar != null) {
jar.close();
}
}
}
@Override
public boolean refresh() {
if (dirty) {
dirty = false;
return true;
}
return false;
}
@Override
public List<String> list(String regex) {
Instruction pattern = null;
if (regex != null)
pattern = new Instruction(regex);
String list[] = getRoot().list();
List<String> result = new ArrayList<String>();
for (String f : list) {
Matcher m = REPO_FILE.matcher(f);
if (!m.matches()) {
continue;
}
String s = m.group(1);
if (pattern == null || pattern.matches(s))
result.add(s);
}
return result;
}
}