package org.openspaces.webapp; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.net.URL; import java.net.URLEncoder; import java.util.Arrays; import org.mortbay.jetty.Handler; import org.mortbay.jetty.HandlerContainer; import org.mortbay.jetty.Server; import org.mortbay.jetty.handler.ContextHandlerCollection; import org.mortbay.jetty.handler.HandlerWrapper; import org.mortbay.jetty.webapp.WebAppContext; import org.mortbay.util.IO; import org.mortbay.util.URIUtil; import org.mortbay.util.UrlEncoded; import org.openspaces.core.GigaSpace; import org.openspaces.core.context.GigaSpaceContext; /** */ public class GigaWebApp { public final String GIGASPACE_ATTR = "org.openspaces.core.GigaSpace"; @GigaSpaceContext private GigaSpace gigaSpace; private Server _server; private File _tmp; private WebAppContext _webAppContext; private HandlerContainer _container; private String _contextPath="/"; private String _webapp="webapp/"; public GigaSpace getGigaSpace() { return gigaSpace; } public void setGigaSpace(GigaSpace gigaSpace) { this.gigaSpace = gigaSpace; } public Server getServer() { return _server; } public void setServer(Server server) { this._server = server; } public String getWebapp() { return _webapp; } public void setWebapp(String webapp) { _webapp = webapp; } public WebAppContext getWebAppContext() { return _webAppContext; } public void setWebAppContext(WebAppContext appContext) { _webAppContext = appContext; } public String getContextPath() { return _contextPath; } public void setContextPath(String path) { _contextPath = path; } public void deploy() throws Exception { //gigaSpace. if (_server==null) throw new IllegalStateException("No Server"); System.out.println("--- Deploy " + this+ " to "+_server.getConnectors()[0].getLocalPort()); org.jini.rio.boot.ServiceClassLoader loader = (org.jini.rio.boot.ServiceClassLoader)Thread.currentThread().getContextClassLoader(); System.out.println("\nloader="+loader); System.out.println("isA="+loader.getClass()); System.out.println("search="+Arrays.asList(loader.getSearchPath())); URL url = loader.getSearchPath()[0]; System.out.println("URL="+url); _tmp = File.createTempFile("gigawebapp",".tmp"); _tmp.delete(); _tmp.mkdir(); String docroot = URIUtil.addPaths(url.toString(),_webapp); System.out.println("docroot="+docroot); System.out.println("tmp="+_tmp); copy(docroot,_tmp); System.out.println("\n"); if (_webAppContext==null) _webAppContext=new WebAppContext(); _webAppContext.setContextPath("/"); File tmp = new File(_tmp,"ctx"); tmp.mkdir(); _webAppContext.setTempDirectory(tmp); _webAppContext.setWar(URIUtil.addPaths(_tmp.toURL().toString(),_webapp)); _webAppContext.setExtractWAR(true); _webAppContext.setCopyWebDir(false); _webAppContext.setAttribute(GIGASPACE_ATTR,getGigaSpace()); // Look for a place to add the webappcontext _container=_server; Handler[] contexts = _container.getChildHandlersByClass(ContextHandlerCollection.class); if (contexts!=null && contexts.length>0) _container=(HandlerContainer)contexts[0]; else { while (_container!=null) { if (_container instanceof HandlerWrapper) { HandlerWrapper wrapper = (HandlerWrapper)_container; Handler handler=wrapper.getHandler(); if (handler==null) break; if (handler instanceof HandlerContainer) _container=(HandlerContainer)handler; else throw new IllegalStateException("No container"); } throw new IllegalStateException("No container"); } } _container.addHandler(_webAppContext); if (_container.isStarted() || _container.isStarting()) _webAppContext.start(); } private void copy(String url, File toDir) throws IOException { System.err.println("url="+url+" dir="+toDir); if (url.endsWith("/")) { String basename=url.substring(url.lastIndexOf("/",url.length()-2)+1); File directory=new File(toDir,basename); directory.mkdir(); LineNumberReader reader = new LineNumberReader(new InputStreamReader(new URL(url).openStream(),"utf-8")); String line; while ((line=reader.readLine())!=null) { System.err.println(line.replace('\t','|')); int tab=line.lastIndexOf('\t',line.lastIndexOf('\t',line.lastIndexOf('\t')-1)-1); System.err.println(tab); char type=line.charAt(tab+1); String file=line.substring(0,tab); copy(url+URIUtil.encodePath(file)+(type=='d'?"/":""),directory); } } else { String basename=url.substring(url.lastIndexOf("/")+1); File file = new File(toDir,basename); System.err.println("copy "+url+" --> "+file); IO.copy(new URL(url).openStream(),new FileOutputStream(file)); } } public void undeploy() throws Exception { System.out.println("--- Undeploy " + this); if (!_webAppContext.isRunning()) return; _webAppContext.stop(); if (_container!=null) _server.removeHandler(_webAppContext); IO.delete(_tmp); } }