001: // THIS SOFTWARE IS PROVIDED BY SOFTARIS PTY.LTD. AND OTHER METABOSS
002: // CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
003: // BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
004: // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SOFTARIS PTY.LTD.
005: // OR OTHER METABOSS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
006: // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
007: // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
008: // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
009: // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
010: // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
011: // EVEN IF SOFTARIS PTY.LTD. OR OTHER METABOSS CONTRIBUTORS ARE ADVISED OF THE
012: // POSSIBILITY OF SUCH DAMAGE.
013: //
014: // Copyright 2000-2005 © Softaris Pty.Ltd. All Rights Reserved.
015: package com.metaboss.sdlctools.services.jdktools.impl;
016:
017: import java.io.IOException;
018: import java.io.PrintWriter;
019: import java.io.StringWriter;
020: import java.util.HashMap;
021: import java.util.Map;
022:
023: import javax.naming.Context;
024: import javax.naming.InitialContext;
025: import javax.naming.NamingException;
026:
027: import com.metaboss.enterprise.bs.BSException;
028: import com.metaboss.enterprise.bs.BSNamingAndDirectoryServiceInvocationException;
029: import com.metaboss.javatemplate.JavaTemplate;
030: import com.metaboss.javatemplate.JavaTemplateContext;
031: import com.metaboss.javatemplate.JavaTemplateContextMapImpl;
032: import com.metaboss.javatemplate.JavaTemplateException;
033: import com.metaboss.sdlctools.services.jdktools.BSJavaCompiler;
034: import com.metaboss.sdlctools.services.jdktools.BSJavaTemplateProcessor;
035: import com.metaboss.sdlctools.services.jdktools.CompilationResult;
036: import com.metaboss.sdlctools.services.jdktools.MergeResult;
037: import com.metaboss.sdlctools.services.jdktools.SourceType;
038: import com.metaboss.util.JarClassLoader;
039:
040: /** This class implements template merging functionality based on Java template */
041: public class BSJavaTemplateProcessorImpl implements
042: BSJavaTemplateProcessor {
043: /** Thread safe store of template classes used before */
044: private Map mClassLoaders = new HashMap(); // Clas loades with already compiled templates
045:
046: /* Merges given template with given set of properties. */
047: public MergeResult mergeTemplate(String pSourceTemplate,
048: String pSourceTemplateName, String pTemplateJavaClassName,
049: java.util.Map pContextMap) throws BSException {
050: // Find out if we have already compiled and loaded this template before
051: JarClassLoader lClassLoaderForTemplate = (JarClassLoader) mClassLoaders
052: .get(pSourceTemplateName);
053: if (lClassLoaderForTemplate == null) {
054: try {
055: // Compile and store compiled class in the class loader
056: Context ctx = new InitialContext();
057: BSJavaCompiler lJavaCompiler = (BSJavaCompiler) ctx
058: .lookup(BSJavaCompiler.COMPONENT_URL);
059: CompilationResult lRes = lJavaCompiler.compileSource(
060: pTemplateJavaClassName, pSourceTemplate,
061: SourceType.METABOSS_DEVTIME);
062: if (!lRes.isSuccessful())
063: throw new BSException(
064: "Java template source compilation error. Template class name : "
065: + pTemplateJavaClassName + ";\r\n"
066: + lRes.getCompilerPrintout());
067: // Note. We need to maje sure that MetaBossCore.jar is available, because it has
068: // JavaTemplate stuff in it. Strictly speaking it should be done by loading the Jar or
069: // better still nominating the URL to it (had JarClassLoader allowed for it to happen)
070: // At the moment we have no choice, but create the class loader with the JavaTemplate loader being the parent loader.
071: lClassLoaderForTemplate = new JarClassLoader(
072: JavaTemplate.class.getClassLoader());
073: lClassLoaderForTemplate.addJar(lRes.getResultJar());
074: mClassLoaders.put(pSourceTemplateName,
075: lClassLoaderForTemplate);
076: } catch (IOException e) {
077: throw new BSException(
078: "Java template source processing error. Template class name : "
079: + pTemplateJavaClassName, e);
080: } catch (NamingException e) {
081: throw new BSNamingAndDirectoryServiceInvocationException(
082: e);
083: }
084: }
085:
086: try {
087: JavaTemplate lTemplateInstance = (JavaTemplate) lClassLoaderForTemplate
088: .loadClass(pTemplateJavaClassName).newInstance();
089: StringWriter lStringWriter = null;
090: PrintWriter lPrintWriter = null;
091: try {
092: JavaTemplateContext lContext = new JavaTemplateContextMapImpl(
093: pContextMap);
094: lStringWriter = new StringWriter();
095: lPrintWriter = new PrintWriter(lStringWriter);
096: lTemplateInstance.mergeTemplate(lPrintWriter, lContext);
097: lPrintWriter.flush();
098: return MergeResult.createMergeSuccess(lStringWriter
099: .toString());
100: } catch (JavaTemplateException e) {
101: return MergeResult.createMergeFailure(e.toString());
102: } finally {
103: lPrintWriter.close();
104: try {
105: lStringWriter.close();
106: } catch (IOException e) {
107: // Ignore
108: }
109: }
110: } catch (ClassNotFoundException e) {
111: throw new BSException(
112: "Java template loading error. Template name : "
113: + pSourceTemplateName
114: + ". Template Java class name : "
115: + pTemplateJavaClassName, e);
116: } catch (IllegalAccessException e) {
117: throw new BSException(
118: "Java template loading error. Template name : "
119: + pSourceTemplateName
120: + ". Template Java class name : "
121: + pTemplateJavaClassName, e);
122: } catch (InstantiationException e) {
123: throw new BSException(
124: "Java template loading error. Template name : "
125: + pSourceTemplateName
126: + ". Template Java class name : "
127: + pTemplateJavaClassName, e);
128: }
129: }
130: }
|