alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Jetty example source code file (JspcMojo.java)

This example Jetty source code file (JspcMojo.java) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Java - Jetty tags/keywords

artifact, bufferedreader, bufferedreader, end_of_webapp:insertionmarker, exception, exception, file, file, filereader, io, jasper, net, network, printwriter, string, string, tomcat, util

The Jetty JspcMojo.java source code

//========================================================================
//$Id: JspcMojo.java 1890 2007-06-01 02:28:50Z janb $
//Copyright 2006 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 org.mortbay.jetty.jspc.plugin;



import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.PrintWriter;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.jasper.JspC;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import org.mortbay.util.IO;

/**
 *  <p>This goal will compile jsps for a webapp so that they can be included in a war.

* <p>At runtime, the plugin will use the jsp2.0 jspc compiler if you are running * on a 1.4 or lower jvm. If you are using a 1.5 jvm, then the jsp2.1 compiler will be selected. * (this is the same behaviour as the <a href="http://jetty.mortbay.org/maven-plugin">jetty plugin for executing webapps). * </p> * <p> * Note that the same java compiler will be used as for on-the-fly compiled jsps, which will * be the Eclipse java compiler. * </p> * * <p>See Usage Guide for instructions on using this plugin. * </p> * @author janb * * @goal jspc * @phase process-classes * @requiresDependencyResolution compile * @description Runs jspc compiler to produce .java and .class files */ public class JspcMojo extends AbstractMojo { public static final String END_OF_WEBAPP = "</web-app>"; /** * The maven project. * * @parameter expression="${project}" * @required * @readonly */ private MavenProject project; /** * File into which to generate the <servlet> and <servlet-mapping> * tags for the compiled jsps * @parameter expression="${basedir}/target/webfrag.xml" */ private String webXmlFragment; /** * Optional. A marker string in the src web.xml file which indicates where * to merge in the generated web.xml fragment. Note that the marker string * will NOT be preserved during the insertion. Can be left blank, in which * case the generated fragment is inserted just before the </web-app> line * @parameter */ private String insertionMarker; /** * Merge the generated fragment file with the web.xml from * webAppSourceDirectory. The merged file will go into the same * directory as the webXmlFragment. * * @parameter expression="true" */ private boolean mergeFragment; /** * The destination directory into which to put the * compiled jsps. * * @parameter expression="${basedir}/target/classes" */ private String generatedClasses; /** * Controls whether or not .java files generated during compilation will be preserved. * * @parameter expression="false" */ private boolean keepSources; /** * Default root package for all generated classes * @parameter expression="jsp" */ private String packageRoot; /** * Root directory for all html/jsp etc files * * @parameter expression="${basedir}/src/main/webapp" * @required */ private String webAppSourceDirectory; /** * The location of the compiled classes for the webapp * * @parameter expression="${project.build.outputDirectory}" */ private File classesDirectory; /** * Whether or not to output more verbose messages during compilation. * @parameter expression="false"; */ private boolean verbose; /** * If true, validates tlds when parsing. * @parameter expression="false"; */ private boolean validateXml; /** * The encoding scheme to use. * @parameter expression="UTF-8" */ private String javaEncoding; /** * Whether or not to generate JSR45 compliant debug info * * @parameter expression="true"; */ private boolean suppressSmap; /** * Whether or not to ignore precompilation errors caused by * jsp fragments. * * @parameter expression="false" */ private boolean ignoreJspFragmentErrors; /** * Allows a prefix to be appended to the standard schema locations * so that they can be loaded from elsewhere. * * @parameter */ private String schemaResourcePrefix; public void execute() throws MojoExecutionException, MojoFailureException { if (getLog().isDebugEnabled()) { getLog().info("verbose="+verbose); getLog().info("webAppSourceDirectory="+webAppSourceDirectory); getLog().info("generatedClasses="+generatedClasses); getLog().info("webXmlFragment="+webXmlFragment); getLog().info("validateXml="+validateXml); getLog().info("packageRoot="+packageRoot); getLog().info("javaEncoding="+javaEncoding); getLog().info("insertionMarker="+(insertionMarker==null||insertionMarker.equals("")?END_OF_WEBAPP:insertionMarker)); getLog().info("keepSources="+keepSources); getLog().info("mergeFragment="+mergeFragment); getLog().info("suppressSmap="+suppressSmap); getLog().info("ignoreJspFragmentErrors="+ignoreJspFragmentErrors); getLog().info("schemaResourcePrefix="+schemaResourcePrefix); } try { prepare(); compile (); cleanupSrcs (); mergeWebXml(); } catch (Exception e) { throw new MojoFailureException(e, "Failure processing jsps", "Failure processing jsps"); } } public void compile() throws Exception { ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader(); ArrayList urls = new ArrayList(); setUpClassPath(urls); URLClassLoader ucl = new URLClassLoader((URL[])urls.toArray(new URL[0]), currentClassLoader); StringBuffer classpathStr = new StringBuffer(); for (int i=0; i<urls.size(); i++) { if (getLog().isDebugEnabled()) getLog().debug("webappclassloader contains: "+urls.get(i)); classpathStr.append(((URL)urls.get(i)).getFile()); if (getLog().isDebugEnabled()) getLog().debug("added to classpath: "+((URL)urls.get(i)).getFile()); classpathStr.append(System.getProperty("path.separator")); } Thread.currentThread().setContextClassLoader(ucl); JspC jspc = new JspC(); jspc.setWebXmlFragment(webXmlFragment); jspc.setUriroot(webAppSourceDirectory); jspc.setPackage(packageRoot); jspc.setOutputDir(generatedClasses); jspc.setValidateXml(validateXml); jspc.setClassPath(classpathStr.toString()); jspc.setCompile(true); jspc.setSmapSuppressed(suppressSmap); jspc.setSmapDumped(!suppressSmap); jspc.setJavaEncoding(javaEncoding); //Glassfish jspc only checks try { jspc.setIgnoreJspFragmentErrors(ignoreJspFragmentErrors); } catch (NoSuchMethodError e) { getLog().debug("Tomcat Jasper does not support configuration option 'ignoreJspFragmentErrors': ignored"); } try { if (schemaResourcePrefix != null) jspc.setSchemaResourcePrefix(schemaResourcePrefix); } catch (NoSuchMethodError e) { getLog().debug("Tomcat Jasper does not support configuration option 'schemaResourcePrefix': ignored"); } if (verbose) jspc.setVerbose(99); else jspc.setVerbose(0); jspc.execute(); Thread.currentThread().setContextClassLoader(currentClassLoader); } /** * Until Jasper supports the option to generate the srcs in a * different dir than the classes, this is the best we can do. * @throws Exception */ public void cleanupSrcs () throws Exception { //delete the .java files - depending on keepGenerated setting if (!keepSources) { File generatedClassesDir = new File(generatedClasses); File[] srcFiles = generatedClassesDir.listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { if (name == null) return false; if (name.trim().equals("")) return false; if (name.endsWith(".java")) return true; return false; } }); for (int i=0; (srcFiles!= null) && (i<srcFiles.length); i++) { srcFiles[i].delete(); } } } /** * Take the web fragment and put it inside a copy of the * web.xml file from the webAppSourceDirectory. * * You can specify the insertion point by specifying * the string in the insertionMarker configuration entry. * * If you dont specify the insertionMarker, then the fragment * will be inserted at the end of the file just before the * </webapp> * @throws Exception */ public void mergeWebXml () throws Exception { if (mergeFragment) { //open the src web.xml File webXml = new File (webAppSourceDirectory+"/WEB-INF/web.xml"); if (!webXml.exists()) { getLog().info(webAppSourceDirectory+"/WEB-INF/web.xml does not exist, cannot merge with generated fragment"); return; } File fragmentWebXml = new File(webXmlFragment); if (!fragmentWebXml.exists()) { getLog().info("No fragment web.xml file generated"); } File mergedWebXml = new File(fragmentWebXml.getParentFile(), "web.xml"); BufferedReader webXmlReader = new BufferedReader(new FileReader(webXml)); PrintWriter mergedWebXmlWriter = new PrintWriter(new FileWriter(mergedWebXml)); //read up to the insertion marker or the </webapp> if there is no marker boolean atInsertPoint = false; boolean atEOF = false; String marker = (insertionMarker==null||insertionMarker.equals("")?END_OF_WEBAPP:insertionMarker); while (!atInsertPoint && !atEOF) { String line = webXmlReader.readLine(); if (line==null) atEOF=true; else if (line.indexOf(marker)>=0) { atInsertPoint=true; } else { mergedWebXmlWriter.println(line); } } //put in the generated fragment BufferedReader fragmentWebXmlReader = new BufferedReader(new FileReader(fragmentWebXml)); IO.copy(fragmentWebXmlReader, mergedWebXmlWriter); // if we inserted just before the </web-app>, put it back in if (marker.equals(END_OF_WEBAPP)) mergedWebXmlWriter.println(END_OF_WEBAPP); // copy in the rest of the original web.xml file IO.copy(webXmlReader, mergedWebXmlWriter); webXmlReader.close(); mergedWebXmlWriter.close(); fragmentWebXmlReader.close(); } } private void prepare () throws Exception { //For some reason JspC doesn't like it if the dir doesn't //already exist and refuses to create the web.xml fragment File generatedSourceDirectoryFile = new File (generatedClasses); if (!generatedSourceDirectoryFile.exists()) generatedSourceDirectoryFile.mkdirs(); } /** * Set up the execution classpath for Jasper. * * Put everything in the classesDirectory and all * of the dependencies on the classpath. * * @param urls a list to which to add the urls of the dependencies * @throws Exception */ private void setUpClassPath (List urls) throws Exception { String classesDir = classesDirectory.getCanonicalPath(); classesDir = classesDir + (classesDir.endsWith(File.pathSeparator)?"":File.separator); urls.add(new File(classesDir).toURL()); if (getLog().isDebugEnabled()) getLog().debug("Adding to classpath classes dir: "+classesDir); for ( Iterator iter = project.getArtifacts().iterator(); iter.hasNext(); ) { Artifact artifact = (Artifact) iter.next(); // Include runtime and compile time libraries if (!Artifact.SCOPE_TEST.equals( artifact.getScope()) ) { String filePath = artifact.getFile().getCanonicalPath(); if (getLog().isDebugEnabled()) getLog().debug("Adding to classpath dependency file: "+filePath); urls.add(artifact.getFile().toURL()); } } } }

Other Jetty examples (source code examples)

Here is a short list of links related to this Jetty JspcMojo.java source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.