| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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.apache.cocoon.bean; |
| |
| import java.io.File; |
| |
| import org.apache.cocoon.components.CocoonComponentManager; |
| import org.apache.cocoon.components.language.generator.CompiledComponent; |
| import org.apache.cocoon.components.language.generator.ProgramGenerator; |
| import org.apache.cocoon.environment.Environment; |
| import org.apache.cocoon.environment.commandline.LinkSamplingEnvironment; |
| import org.apache.cocoon.util.IOUtils; |
| import org.apache.commons.cli.CommandLine; |
| import org.apache.commons.cli.HelpFormatter; |
| import org.apache.commons.cli.Option; |
| import org.apache.commons.cli.Options; |
| import org.apache.commons.cli.PosixParser; |
| import org.apache.excalibur.source.Source; |
| import org.apache.excalibur.source.SourceResolver; |
| |
| |
| /** |
| * This is simple Wrapper like CocoonWrapper and can only precompile all XSP in |
| * the context-directory. |
| * |
| * @version $Id$ $Date: 2005/01/16 17:17:34 $ |
| */ |
| public class XSPPrecompileWrapper extends CocoonWrapper { |
| private SourceResolver sourceResolver; |
| private static Options options; |
| protected static final String HELP_OPT = "h"; |
| protected static final String LOG_KIT_OPT = "k"; |
| protected static final String CONTEXT_DIR_OPT = "c"; |
| protected static final String WORK_DIR_OPT = "w"; |
| protected static final String CONFIG_FILE_OPT = "C"; |
| protected static final String LOG_KIT_LONG = "logKitconfig"; |
| protected static final String CONTEXT_DIR_LONG = "contextDir"; |
| protected static final String WORK_DIR_LONG = "workDir"; |
| protected static final String HELP_LONG = "help"; |
| protected static final String CONFIG_FILE_LONG = "configFile"; |
| |
| /** |
| * Allow subclasses to recursively precompile XSPs. |
| */ |
| public void precompile() throws Exception { |
| recursivelyPrecompile(context, context); |
| } |
| |
| /** |
| * Recurse the directory hierarchy and process the XSP's. |
| * |
| * @param contextDir |
| * a <code>File</code> value for the context directory |
| * @param file |
| * a <code>File</code> value for a single XSP file or a |
| * directory to scan recursively |
| */ |
| private void recursivelyPrecompile(File contextDir, File file) throws Exception { |
| if (file.isDirectory()) { |
| String entries[] = file.list(); |
| for (int i = 0; i < entries.length; i++) { |
| recursivelyPrecompile(contextDir, new File(file, entries[i])); |
| } |
| } else if (file.getName().toLowerCase().endsWith(".xsp")) { |
| String contextFilePath = IOUtils.getContextFilePath(contextDir |
| .getCanonicalPath(), file.getCanonicalPath()); |
| this.processXSP(contextFilePath); |
| } |
| } |
| |
| /** |
| * Process a single XSP file |
| * |
| * @param uri |
| * a <code>String</code> pointing to an xsp URI |
| * @exception Exception |
| * if an error occurs |
| */ |
| protected void processXSP(String uri) throws Exception { |
| String markupLanguage = "xsp"; |
| String programmingLanguage = "java"; |
| Environment env = new LinkSamplingEnvironment("/", context, null, |
| null, null, cliContext, log); |
| precompile(uri, env, markupLanguage, programmingLanguage); |
| } |
| |
| /** |
| * Process a single XMAP file |
| * |
| * @param uri |
| * a <code>String</code> pointing to an xmap URI |
| * @exception Exception |
| * if an error occurs |
| */ |
| protected void processXMAP(String uri) throws Exception { |
| String markupLanguage = "sitemap"; |
| String programmingLanguage = "java"; |
| Environment env = new LinkSamplingEnvironment("/", context, null, |
| null, null, cliContext, log); |
| precompile(uri, env, markupLanguage, programmingLanguage); |
| } |
| |
| /** |
| * Process the given <code>Environment</code> to generate Java code for |
| * specified XSP files. |
| * |
| * @param fileName |
| * a <code>String</code> value |
| * @param environment |
| * an <code>Environment</code> value |
| * @exception Exception |
| * if an error occurs |
| */ |
| public void precompile(String fileName, Environment environment, |
| String markupLanguage, String programmingLanguage) throws Exception { |
| |
| ProgramGenerator programGenerator = null; |
| Source source = null; |
| Object key = CocoonComponentManager.startProcessing(environment); |
| CocoonComponentManager.enterEnvironment(environment, |
| getComponentManager(), cocoon); |
| try { |
| if (log.isDebugEnabled()) { |
| log.debug("XSP generation begin:" + fileName); |
| } |
| System.out.println("Compiling " + fileName); |
| |
| programGenerator = (ProgramGenerator) getComponentManager().lookup( |
| ProgramGenerator.ROLE); |
| source = sourceResolver.resolveURI(fileName); |
| CompiledComponent xsp = programGenerator.load( |
| getComponentManager(), source, markupLanguage, |
| programmingLanguage, environment); |
| System.out.println("[XSP generated] " + xsp); |
| if (log.isDebugEnabled()) { |
| log.debug("XSP generation complete:" + xsp); |
| |
| } |
| } finally { |
| sourceResolver.release(source); |
| getComponentManager().release(programGenerator); |
| |
| CocoonComponentManager.leaveEnvironment(); |
| CocoonComponentManager.endProcessing(environment, key); |
| } |
| } |
| |
| public static void main(String[] args) throws Exception { |
| |
| XSPPrecompileWrapper.setOptions(); |
| CommandLine line = new PosixParser().parse(options, args); |
| XSPPrecompileWrapper wrapper = new XSPPrecompileWrapper(); |
| if (line.hasOption(HELP_OPT)) { |
| printUsage(); |
| } |
| |
| if (line.hasOption(WORK_DIR_OPT)) { |
| String workDir = line.getOptionValue(WORK_DIR_OPT); |
| if (workDir.equals("")) { |
| System.exit(1); |
| } else { |
| wrapper.setWorkDir(line.getOptionValue(WORK_DIR_OPT)); |
| } |
| } |
| |
| if (line.hasOption(CONTEXT_DIR_OPT)) { |
| String contextDir = line.getOptionValue(CONTEXT_DIR_OPT); |
| if (contextDir.equals("")) { |
| |
| System.exit(1); |
| } else { |
| wrapper.setContextDir(contextDir); |
| } |
| } |
| if (line.hasOption(LOG_KIT_OPT)) { |
| wrapper.setLogKit(line.getOptionValue(LOG_KIT_OPT)); |
| } |
| |
| if (line.hasOption(CONFIG_FILE_OPT)) { |
| wrapper.setConfigFile(line.getOptionValue(CONFIG_FILE_OPT)); |
| } |
| wrapper.initialize(); |
| wrapper.precompile(); |
| wrapper.dispose(); |
| System.exit(0); |
| } |
| |
| private static void setOptions() { |
| options = new Options(); |
| |
| options.addOption(new Option(LOG_KIT_OPT, LOG_KIT_LONG, true, |
| "use given file for LogKit Management configuration")); |
| |
| options.addOption(new Option(CONTEXT_DIR_OPT, CONTEXT_DIR_LONG, true, |
| "use given dir as context")); |
| options.addOption(new Option(WORK_DIR_OPT, WORK_DIR_LONG, true, |
| "use given dir as working directory")); |
| |
| options.addOption(new Option(HELP_OPT, HELP_LONG, false, |
| "print this message and exit")); |
| |
| options.addOption(new Option(CONFIG_FILE_OPT, CONFIG_FILE_LONG, true, |
| "specify alternate location of the configuration" |
| + " file (default is ${contextDir}/cocoon.xconf)")); |
| } |
| |
| /** |
| * Print the usage message and exit |
| */ |
| private static void printUsage() { |
| HelpFormatter formatter = new HelpFormatter(); |
| |
| formatter.printHelp( |
| "java org.apache.cocoon.bean.XSPPrecompileWrapper [options] ", |
| |
| options); |
| System.exit(0); |
| } |
| |
| public void initialize() throws Exception { |
| super.initialize(); |
| sourceResolver = (SourceResolver) getComponentManager().lookup(SourceResolver.ROLE); |
| } |
| } |