1 17 package org.apache.ws.jaxme.webapp; 18 19 import java.io.File ; 20 import java.io.FileInputStream ; 21 import java.io.FileOutputStream ; 22 import java.io.IOException ; 23 import java.io.InputStream ; 24 import java.net.MalformedURLException ; 25 import java.net.URL ; 26 import java.util.HashMap ; 27 import java.util.Map ; 28 import java.util.zip.ZipEntry ; 29 import java.util.zip.ZipOutputStream ; 30 31 import javax.servlet.ServletException ; 32 import javax.servlet.http.HttpServletRequest ; 33 import javax.servlet.http.HttpServletResponse ; 34 35 import org.apache.ws.jaxme.generator.Generator; 36 import org.apache.ws.jaxme.generator.impl.GeneratorImpl; 37 import org.apache.ws.jaxme.generator.sg.impl.JAXBSchemaReader; 38 import org.apache.ws.jaxme.xs.XSParser; 39 import org.xml.sax.EntityResolver ; 40 import org.xml.sax.InputSource ; 41 import org.xml.sax.SAXException ; 42 43 44 46 public class JaxMeServlet extends BaseServlet { 47 private class StoringEntityResolver implements EntityResolver { 48 private final File schemaDir; 49 private final Map urlMap = new HashMap (); 50 public StoringEntityResolver(File pSchemaDir) { 51 schemaDir = pSchemaDir; 52 } 53 54 public InputSource resolveEntity(String pPublicId, String pSystemId) throws SAXException , IOException { 55 try { 56 URL url = new URL (pSystemId); 57 String fileName = (String ) urlMap.get(url); 58 if (fileName != null) { 59 FileInputStream istream = new FileInputStream (new File (schemaDir, fileName)); 60 InputSource isource = new InputSource (istream); 61 isource.setSystemId(url.toString()); 62 return isource; 63 } 64 65 String file = url.getFile(); 66 if (file == null) { 67 file = ""; 68 } else { 69 int offset = file.lastIndexOf('/'); 70 if (offset >= 0) { 71 file = file.substring(offset+1); 72 } 73 } 74 if ("".equals(file)) { 75 file = "schema.xsd"; 76 } 77 int offset = file.lastIndexOf('.'); 78 String prefix; 79 String suffix; 80 String numAsStr = ""; 81 if (offset > 0 && offset < file.length()) { 82 prefix = file.substring(0, offset); 83 suffix = file.substring(offset); 84 } else { 85 prefix = file; 86 suffix = ".xsd"; 87 } 88 File f; 89 for (int num = 1; ; ++num) { 90 f = new File (schemaDir, prefix + numAsStr + suffix); 91 if (f.exists()) { 92 numAsStr = "_" + num; 93 } else { 94 break; 95 } 96 } 97 98 InputStream istream = url.openStream(); 99 schemaDir.mkdirs(); 100 FileOutputStream fos = new FileOutputStream (f); 101 try { 102 byte[] buffer = new byte[1024]; 103 for (;;) { 104 int res = istream.read(buffer); 105 if (res == -1) { 106 break; 107 } else if (res > 0) { 108 fos.write(buffer, 0, res); 109 } 110 } 111 istream.close(); 112 fos.close(); 113 fos = null; 114 } finally { 115 if (fos != null) { try { f.delete(); } catch (Throwable ignore) {} } 116 } 117 118 urlMap.put(url, f.getName()); 119 InputSource isource = new InputSource (new FileInputStream (f)); 120 isource.setSystemId(url.toString()); 121 return isource; 122 } catch (Exception e) { 123 JaxMeServlet.this.log("Failed to resolve URL " + pSystemId, e); 124 } 125 return null; 126 } 127 } 128 129 public File createTempDir() throws IOException , ServletException { 130 File f = File.createTempFile("jaxme", ".tmp", getWorkDir()); 131 f.delete(); 132 if (!f.mkdir()) { 133 throw new ServletException ("Unable to create temporary directory " + f.getAbsolutePath()); 134 } 135 return f; 136 } 137 138 public void addContents(ZipOutputStream pZipFile, File pDirectory, String pDirName) throws IOException { 139 File [] files = pDirectory.listFiles(); 140 for (int i = 0; i < files.length; i++) { 141 File f = files[i]; 142 String name = pDirName.length() == 0 ? f.getName() : pDirName + "/" + f.getName(); 143 if (f.isDirectory()) { 144 addContents(pZipFile, f, name); 145 } else if (f.isFile()) { 146 FileInputStream istream = new FileInputStream (f); 147 try { 148 ZipEntry zipEntry = new ZipEntry (name); 149 pZipFile.putNextEntry(zipEntry); 150 byte[] buffer = new byte[1024]; 151 for (;;) { 152 int res = istream.read(buffer); 153 if (res == -1) { 154 break; 155 } else if (res > 0) { 156 pZipFile.write(buffer, 0, res); 157 } 158 } 159 pZipFile.closeEntry(); 160 istream.close(); 161 istream = null; 162 } finally { 163 if (istream != null) { try { istream.close(); } catch (Throwable ignore) {} } 164 } 165 } 166 } 167 } 168 169 public void removeDirectory(File pDirectory) throws ServletException { 170 cleanDirectory(pDirectory); 171 pDirectory.delete(); 172 } 173 174 protected void doCompile(boolean pValidating, File pTempDir, URL pURL, HttpServletResponse pResponse) 175 throws ServletException , IOException { 176 Generator gen = new GeneratorImpl(); 177 gen.setTargetDirectory(new File (pTempDir, "src")); 178 gen.setValidating(pValidating); 179 gen.setSchemaReader(new JAXBSchemaReader()); 180 gen.setEntityResolver(new StoringEntityResolver(new File (pTempDir, "schema"))); 181 try { 182 gen.generate(pURL); 183 } catch (Exception e) { 184 throw new ServletException (e); 185 } 186 187 pResponse.setContentType("application/zip"); 188 pResponse.setHeader("Content-Disposition", "attachment; filename=\"jaxmeGeneratedSrc.zip\""); 189 ZipOutputStream zipOutputStream = new ZipOutputStream (pResponse.getOutputStream()); 190 addContents(zipOutputStream, pTempDir, ""); 191 zipOutputStream.close(); 192 removeDirectory(pTempDir); 193 pTempDir = null; 194 } 195 196 protected void doValidate(boolean pValidating, File pTempDir, URL pURL, HttpServletResponse pResponse) 197 throws ServletException , IOException { 198 XSParser parser = new XSParser(); 199 parser.setValidating(pValidating); 200 InputSource isource = new InputSource (pURL.toString()); 201 try { 202 parser.parse(isource); 203 } catch (Exception e) { 204 throw new ServletException (e); 205 } 206 } 207 208 public void doGet(HttpServletRequest pRequest, HttpServletResponse pResponse) 209 throws ServletException , IOException { 210 String s = pRequest.getParameter("url"); 211 if (s == null || s.length() == 0) { 212 throw new ServletException ("Missing or empty request parameter: " + s); 213 } 214 URL url; 215 try { 216 url = new URL (s); 217 } catch (MalformedURLException e) { 218 throw new ServletException ("Malformed URL: " + s); 219 } 220 221 boolean isValidating = Boolean.valueOf(pRequest.getParameter("isValidating")).booleanValue(); 222 File f = createTempDir(); 223 224 String what = pRequest.getParameter("what"); 225 226 boolean forward = false; 227 try { 228 if ("compile".equals(what)) { 229 try { 230 doCompile(isValidating, f, url, pResponse); 231 } catch (ServletException e) { 232 pRequest.setAttribute("error", e); 233 forward = true; 234 } 235 } else if ("validate".equals(what)) { 236 doValidate(isValidating, f, url, pResponse); 237 pRequest.setAttribute("success", Boolean.TRUE); 238 forward = true; 239 } else { 240 throw new ServletException ("You must choose a proper action: Either 'compile' or 'validate'."); 241 } 242 243 f = null; 244 } finally { 245 if (f != null) { try { removeDirectory(f); } catch (Throwable ignore) {} } 246 } 247 248 if (forward) { 249 pRequest.getRequestDispatcher("index.jsp").forward(pRequest, pResponse); 250 } 251 } 252 253 public void doPost(HttpServletRequest pRequest, HttpServletResponse pResponse) 254 throws ServletException , IOException { 255 doGet(pRequest, pResponse); 257 } 258 } 259 | Popular Tags |