//========================================================================
//$Id: Installer.java 474 2012-01-23 03:07:14Z janb.webtide $
//Copyright 2008 Mort Bay Consulting Pty. Ltd.
//------------------------------------------------------------------------
//Licensed under the Apache License, Version 2.0 (the "License");
//you may not use this file except in compliance with the License.
//You may obtain a copy of the License at
//http://www.apache.org/licenses/LICENSE-2.0
//Unless required by applicable law or agreed to in writing, software
//distributed under the License is distributed on an "AS IS" BASIS,
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//See the License for the specific language governing permissions and
//limitations under the License.
//========================================================================
package cn.ccsu.ShareFV;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
import org.eclipse.jetty.util.resource.JarResource;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.util.IO;
import android.util.Log;
public class Installer {
private static final String TAG = "Jetty.install";
public static void install(File warFile, String contextPath,
File webappsDir, String webappName, boolean createContextXml)
throws MalformedURLException, IOException {
File webapp = new File(webappsDir, webappName);
if (!webapp.exists())
webapp.mkdirs();
Resource war = Resource.newResource("jar:" + warFile.toURL() + "!/");
((JarResource) war).copyTo(webapp);
if (createContextXml)
installContextFile(webappName, contextPath);
}
public static void install(InputStream warStream, String contextPath,
File webappsDir, String webappName, boolean createContextXml) {
File webapp = new File(webappsDir, webappName);
if (warStream != null) {
try {
JarInputStream jin = new JarInputStream(warStream);
JarEntry entry;
while ((entry = jin.getNextJarEntry()) != null) {
String entryName = entry.getName();
File file = new File(webapp, entryName);
if (entry.isDirectory()) {
// Make directory
if (!file.exists())
file.mkdirs();
} else {
// make directory (some jars don't list dirs)
File dir = new File(file.getParent());
if (!dir.exists())
dir.mkdirs();
// Make file
FileOutputStream fout = null;
try {
fout = new FileOutputStream(file);
IO.copy(jin, fout);
} finally {
IO.close(fout);
}
// touch the file.
if (entry.getTime() >= 0)
file.setLastModified(entry.getTime());
}
}
IO.close(jin);
if (createContextXml)
installContextFile(webappName, contextPath);
} catch (Exception e) {
Log.e(TAG, "Error inflating console.war", e);
}
} else
Log.e(TAG, "No war");
}
public static void installContextFile(String webappName, String contextPath)
throws FileNotFoundException {
Log.i(TAG, "Installing " + webappName + ".xml");
contextPath = contextPath == null ? webappName : contextPath;
contextPath = contextPath.equals("/") ? "root" : contextPath;
contextPath = contextPath.startsWith("/") ? contextPath : "/"
+ contextPath;
String configurationClassesXml = "<Array type=\"java.lang.String\">";
for (int i = 0; i < IJettyService.__configurationClasses.length; i++) {
configurationClassesXml += "<Item>"
+ IJettyService.__configurationClasses[i] + "</Item>";
}
configurationClassesXml += "</Array>";
File tmpDir = new File(IJetty.__JETTY_DIR + "/" + IJetty.__TMP_DIR);
File tmpContextFile = new File(tmpDir, webappName + ".xml");
PrintWriter writer = new PrintWriter(tmpContextFile);
writer.println("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>");
writer.println("<!DOCTYPE Configure PUBLIC \"-//Jetty//Configure//EN\" \"http://www.eclipse.org/jetty/configure.dtd\">");
writer.println("<Configure class=\"org.eclipse.jetty.webapp.WebAppContext\">");
writer.println("<Set name=\"configurationClasses\">"
+ configurationClassesXml + "</Set>");
writer.println("<Set name=\"contextPath\">" + contextPath + "</Set>");
writer.println("<Set name=\"war\"><SystemProperty name=\"jetty.home\" default=\".\"/>/webapps/"
+ webappName + "</Set>");
writer.println("<Set name=\"defaultsDescriptor\"><SystemProperty name=\"jetty.home\" default=\".\"/>/etc/webdefault.xml</Set>");
writer.println("</Configure>");
writer.flush();
writer.close();
File contextDir = new File(IJetty.__JETTY_DIR + "/"
+ IJetty.__CONTEXTS_DIR);
File contextFile = new File(contextDir, webappName + ".xml");
if (!tmpContextFile.renameTo(contextFile))
Log.e(TAG, "mv " + tmpContextFile.getAbsolutePath() + " "
+ contextFile.getAbsolutePath() + " failed");
}
public static void clean(File warFile) {
String webappName = warFile.getName();
if (webappName.endsWith(".war") || webappName.endsWith(".jar"))
webappName = webappName.substring(0, webappName.length() - 4);
// delete any tmp context.xml file left over
File tmpDir = new File(IJetty.__JETTY_DIR + "/" + IJetty.__TMP_DIR);
File contextFile = new File(tmpDir, webappName + ".xml");
contextFile.delete();
Log.i("Jetty", "deleted " + IJetty.__JETTY_DIR + "/" + IJetty.__TMP_DIR
+ "/" + webappName + ".xml");
// delete the real context.xml file (will cause an undeploy if jetty is
// running)
File contextDir = new File(IJetty.__JETTY_DIR + "/"
+ IJetty.__CONTEXTS_DIR);
contextFile = new File(contextDir, webappName + ".xml");
contextFile.delete();
Log.i("Jetty", "deleted " + IJetty.__JETTY_DIR + "/"
+ IJetty.__CONTEXTS_DIR + "/" + webappName + ".xml");
// delete the unpacked webapp
File webappsDir = new File(IJetty.__JETTY_DIR + "/"
+ IJetty.__WEBAPP_DIR);
File webapp = new File(webappsDir, webappName);
if (webapp.exists())
delete(webapp);
Log.i(TAG, "deleted " + IJetty.__JETTY_DIR + "/" + IJetty.__WEBAPP_DIR
+ "/" + webappName);
warFile.delete();
Log.i(TAG, "deleted " + warFile.getAbsolutePath());
}
public static void delete(File webapp) {
if (webapp.isDirectory()) {
File[] files = webapp.listFiles();
for (File f : files) {
delete(f);
}
webapp.delete();
} else
webapp.delete();
}
}