You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by am...@apache.org on 2006/05/16 02:32:14 UTC
svn commit: r406785 - in /geronimo/branches/1.1/modules/system/src:
java/org/apache/geronimo/system/plugin/ schema/
Author: ammulder
Date: Mon May 15 17:32:14 2006
New Revision: 406785
URL: http://svn.apache.org/viewcvs?rev=406785&view=rev
Log:
Plugins can include files to copy into the Geronimo installation directory
(GERONIMO-2029)
Plugins automatically include themselves as obsoletes
Modified:
geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/plugin/DownloadResults.java
geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/plugin/PluginInstallerGBean.java
geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/plugin/PluginMetadata.java
geronimo/branches/1.1/modules/system/src/schema/plugins-1.1.xsd
Modified: geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/plugin/DownloadResults.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/plugin/DownloadResults.java?rev=406785&r1=406784&r2=406785&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/plugin/DownloadResults.java (original)
+++ geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/plugin/DownloadResults.java Mon May 15 17:32:14 2006
@@ -89,7 +89,6 @@
}
public synchronized void setFailure(Exception failure) {
-failure.printStackTrace();
this.failure = failure;
}
Modified: geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/plugin/PluginInstallerGBean.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/plugin/PluginInstallerGBean.java?rev=406785&r1=406784&r2=406785&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/plugin/PluginInstallerGBean.java (original)
+++ geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/plugin/PluginInstallerGBean.java Mon May 15 17:32:14 2006
@@ -569,6 +569,7 @@
} else {
soFar.add(configID);
}
+ // Download and install the main artifact
//todo: check all repositories?
Artifact[] matches = configManager.getArtifactResolver().queryArtifacts(configID);
if(matches.length == 0) { // not present, needs to be downloaded
@@ -617,7 +618,7 @@
monitor.getResults().addInstalledConfigID(configID);
}
}
-
+ // Download and install the dependencies
try {
ConfigurationData data = null;
if(!configID.isResolved()) {
@@ -649,6 +650,63 @@
} catch (InvalidConfigException e) {
throw new IllegalStateException("Installed configuration into repository but ConfigStore cannot load it: "+e.getMessage());
}
+ // Copy any files out of the artifact
+ PluginMetadata currentPlugin = configManager.isConfiguration(configID) ? getPluginMetadata(configID) : null;
+ for (int i = 0; i < currentPlugin.getFilesToCopy().length; i++) {
+ PluginMetadata.CopyFile data = currentPlugin.getFilesToCopy()[i];
+ monitor.getResults().setCurrentFilePercent(-1);
+ monitor.getResults().setCurrentFile(data.getSourceFile());
+ monitor.getResults().setCurrentMessage("Copying "+data.getSourceFile()+" from plugin to Geronimo installation");
+ Set set;
+ try {
+ set = configStore.resolve(configID, null, data.getSourceFile());
+ } catch (NoSuchConfigException e) {
+ throw new IllegalStateException("Unable to identify module "+configID+" to copy files from");
+ }
+ if(set.size() == 0) {
+ log.error("Installed configuration into repository but cannot locate file to copy "+data.getSourceFile());
+ continue;
+ }
+ File targetDir = data.isRelativeToVar() ? serverInfo.resolveServer("var/"+data.getDestDir()) : serverInfo.resolve(data.getDestDir());
+ if(!targetDir.isDirectory()) {
+ log.error("Plugin install cannot write file "+data.getSourceFile()+" to "+data.getDestDir()+" because "+targetDir.getAbsolutePath()+" is not a directory");
+ continue;
+ }
+ if(!targetDir.canWrite()) {
+ log.error("Plugin install cannot write file "+data.getSourceFile()+" to "+data.getDestDir()+" because "+targetDir.getAbsolutePath()+" is not writable");
+ continue;
+ }
+ for (Iterator it = set.iterator(); it.hasNext();) {
+ URL url = (URL) it.next();
+ String path = url.getPath();
+ if(path.lastIndexOf('/') > -1) {
+ path = path.substring(path.lastIndexOf('/'));
+ }
+ File target = new File(targetDir, path);
+ if(!target.exists()) {
+ if(!target.createNewFile()) {
+ log.error("Plugin install cannot create new file "+target.getAbsolutePath());
+ continue;
+ }
+ }
+ if(!target.canWrite()) {
+ log.error("Plugin install cannot write to file "+target.getAbsolutePath());
+ continue;
+ }
+ copyFile(url.openStream(), new FileOutputStream(target));
+ }
+ }
+ }
+
+ private void copyFile(InputStream in, FileOutputStream out) throws IOException {
+ byte[] buf = new byte[4096];
+ int count;
+ while((count = in.read(buf)) > -1) {
+ out.write(buf, 0, count);
+ }
+ in.close();
+ out.flush();
+ out.close();
}
/**
@@ -969,7 +1027,8 @@
meta.setGeronimoVersions(new String[]{serverInfo.getVersion()});
meta.setJvmVersions(new String[0]);
meta.setLicenses(new PluginMetadata.License[0]);
- meta.setObsoletes(new String[0]);
+ meta.setObsoletes(new String[]{new Artifact(data.getId().getGroupId(), data.getId().getArtifactId(), (Version)null, data.getId().getType()).toString()});
+ meta.setFilesToCopy(new PluginMetadata.CopyFile[0]);
List deps = new ArrayList();
PluginMetadata.Prerequisite prereq = null;
prereq = processDependencyList(data.getEnvironment().getDependencies(), prereq, deps);
@@ -1107,6 +1166,15 @@
Element elem = (Element) hashList.item(0);
hash = new PluginMetadata.Hash(elem.getAttribute("type"), getText(elem));
}
+ NodeList fileList = plugin.getElementsByTagName("copy-file");
+ PluginMetadata.CopyFile[] files = new PluginMetadata.CopyFile[fileList.getLength()];
+ for (int i = 0; i < files.length; i++) {
+ Element node = (Element) fileList.item(i);
+ String relative = node.getAttribute("relative-to");
+ String destDir = node.getAttribute("dest-dir");
+ String fileName = getText(node);
+ files[i] = new PluginMetadata.CopyFile(relative.equals("server"), fileName, destDir);
+ }
boolean eligible = true;
NodeList preNodes = plugin.getElementsByTagName("prerequisite");
PluginMetadata.Prerequisite[] prereqs = new PluginMetadata.Prerequisite[preNodes.getLength()];
@@ -1161,6 +1229,7 @@
data.setLicenses(licenses);
data.setPrerequisites(prereqs);
data.setRepositories(repos);
+ data.setFilesToCopy(files);
NodeList list = plugin.getElementsByTagName("dependency");
List start = new ArrayList();
String deps[] = new String[list.getLength()];
@@ -1384,6 +1453,14 @@
for (int i = 0; i < data.getRepositories().length; i++) {
URL url = data.getRepositories()[i];
addTextChild(doc, config, "source-repository", url.toString());
+ }
+ for (int i = 0; i < data.getFilesToCopy().length; i++) {
+ PluginMetadata.CopyFile file = data.getFilesToCopy()[i];
+ Element copy = doc.createElement("copy-file");
+ copy.setAttribute("relative-to", file.isRelativeToVar() ? "server" : "geronimo");
+ copy.setAttribute("dest-dir", file.getDestDir());
+ copy.appendChild(doc.createTextNode(file.getSourceFile()));
+ config.appendChild(copy);
}
return doc;
}
Modified: geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/plugin/PluginMetadata.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/plugin/PluginMetadata.java?rev=406785&r1=406784&r2=406785&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/plugin/PluginMetadata.java (original)
+++ geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/plugin/PluginMetadata.java Mon May 15 17:32:14 2006
@@ -42,6 +42,7 @@
private String[] forceStart = new String[0];
private String[] obsoletes = new String[0];
private URL[] repositories = new URL[0];
+ private CopyFile[] filesToCopy = new CopyFile[0];
private final boolean installed;
private final boolean eligible;
@@ -191,6 +192,16 @@
return eligible;
}
+ /**
+ * Gets a list of files to copy from the plugin CAR into the server installation.
+ */
+ public CopyFile[] getFilesToCopy() {
+ return filesToCopy;
+ }
+
+ public void setFilesToCopy(CopyFile[] filesToCopy) {
+ this.filesToCopy = filesToCopy;
+ }
public int compareTo(Object o) {
PluginMetadata other = (PluginMetadata) o;
@@ -234,6 +245,30 @@
public String getValue() {
return value;
+ }
+ }
+
+ public static class CopyFile implements Serializable {
+ private final boolean relativeToVar; // if not, relative to the Geronimo install directory
+ private final String sourceFile;
+ private final String destDir;
+
+ public CopyFile(boolean relativeToVar, String sourceFile, String destDir) {
+ this.relativeToVar = relativeToVar;
+ this.sourceFile = sourceFile;
+ this.destDir = destDir;
+ }
+
+ public boolean isRelativeToVar() {
+ return relativeToVar;
+ }
+
+ public String getSourceFile() {
+ return sourceFile;
+ }
+
+ public String getDestDir() {
+ return destDir;
}
}
Modified: geronimo/branches/1.1/modules/system/src/schema/plugins-1.1.xsd
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/system/src/schema/plugins-1.1.xsd?rev=406785&r1=406784&r2=406785&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/system/src/schema/plugins-1.1.xsd (original)
+++ geronimo/branches/1.1/modules/system/src/schema/plugins-1.1.xsd Mon May 15 17:32:14 2006
@@ -310,6 +310,16 @@
</xs:documentation>
</xs:annotation>
</xs:element>
+ <xs:element name="copy-file" type="list:copy-fileType" minOccurs="0" maxOccurs="unbounded">
+ <xs:annotation>
+ <xs:documentation>
+ Lets a plugin include files that should be copied into the Geronimo
+ installation tree, beyond copying the plugin into the repository. For
+ example, this could be used to copy files into geronimo/bin, geronimo/lib,
+ geronimo/var/security/keystores, or other Geronimo dirs.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
</xs:sequence>
</xs:complexType>
@@ -382,6 +392,52 @@
MD5
SHA-1
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="copy-fileType">
+ <xs:annotation>
+ <xs:documentation>
+ The name of a file in the plugin archive that should be copied into
+ the server installation tree somewhere when the plugin is installed.
+ There may be a path component (relative to the root of the plugin
+ archive), though that will not be used to construct the destination
+ location. For example:
+
+ <copy-file relative-to="server" dest-dir="security/keystores">
+ resources/keystores/my-keystore
+ </copy-file>
+
+ This will copy the file resources/keystores/my-keystore to e.g.
+ geronimo/var/security/keystores/my-keystore
+ </xs:documentation>
+ </xs:annotation>
+
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="relative-to" use="required" type="xs:string">
+ <xs:annotation>
+ <xs:documentation>
+ Indicates whether the destination is relative to the Geronimo install
+ directory or the server instance var/ directory. The values presently
+ supported are:
+
+ geronimo
+ server
+
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="dest-dir" use="required" type="xs:string">
+ <xs:annotation>
+ <xs:documentation>
+ The directory to copy the file to, relative to either the Geronimo
+ install dir or the server's home directory (normally var/ but may
+ vary).
</xs:documentation>
</xs:annotation>
</xs:attribute>