All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.unidal.eunit.codegen.xsl.XslCodegenValve Maven / Gradle / Ivy

package org.unidal.eunit.codegen.xsl;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.URL;
import java.util.List;
import java.util.Map;

import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.URIResolver;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.unidal.eunit.codegen.XslCodegen;
import org.unidal.eunit.testfwk.spi.ICaseContext;
import org.unidal.eunit.testfwk.spi.task.IValve;
import org.unidal.eunit.testfwk.spi.task.IValveChain;
import org.unidal.helper.Files;

public class XslCodegenValve implements IValve {
   private final XslCodegen m_meta;

   private TransformerFactory m_factory;

   public XslCodegenValve(XslCodegen meta) {
      m_meta = meta;
   }

   private String evaluate(ICaseContext ctx, String xml, String template, Map parameters) {
      Transformer transformer = getTransformer(ctx, template);
      StringWriter writer = new StringWriter(64 * 1024);

      if (parameters != null) {
         for (Map.Entry e : parameters.entrySet()) {
            transformer.setParameter(e.getKey(), e.getValue());
         }
      }

      try {
         transformer.transform(new StreamSource(new StringReader(xml)), new StreamResult(writer));
      } catch (TransformerException e) {
         throw new RuntimeException(String.format("Error when evaluating template(%s)!", template), e);
      }

      return writer.toString();
   }

   @Override
   public void execute(ICaseContext ctx, IValveChain chain) throws Throwable {
      String xmlContent = getXmlSource(ctx, m_meta.source());
      List manifests = getManifest(ctx, xmlContent, m_meta.manifest(), m_meta.template());

      for (Manifest manifest : manifests) {
         String generated = evaluate(ctx, xmlContent, manifest.getTemplate(), manifest.getProperties());

         saveToFile(manifest, generated);
      }

      System.out.println(String.format("%s files generated!", manifests.size()));
      chain.executeNext(ctx);
   }

   private List getManifest(ICaseContext ctx, String contentXml, String manifestXsl, String templateXsl) {
      String content = evaluate(ctx, contentXml, manifestXsl, null);
      ManifestParser parser = new ManifestParser();
      List manifests = parser.parse(content);

      for (Manifest manifest : manifests) {
         if (manifest.getTemplate().length() == 0) {
            manifest.setTemplate(templateXsl);
         }
      }

      return manifests;
   }

   private InputStream getResourceFromClassPath(Class testClass, String source) {
      InputStream is = testClass.getResourceAsStream(source);

      if (is == null) {
         String path;

         if (source.startsWith("/")) {
            path = source;
         } else {
            String packageName = testClass.getPackage().getName();

            path = packageName.replace('.', '/') + '/' + source;
         }

         is = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
      }

      return is;
   }

   private Transformer getTransformer(final ICaseContext ctx, final String template) {
      if (m_factory == null) {
         TransformerFactory factory = TransformerFactory.newInstance();

         try {
            factory.setURIResolver(new URIResolver() {
               public Source resolve(String href, String base) throws TransformerException {
                  if (base == null) {
                     return getXslTemplate(ctx, href);
                  }

                  try {
                     URL uri = new URL(new URL(base), href);

                     return new StreamSource(uri.openStream(), uri.toString());
                  } catch (Exception e) {
                     // ignore it
                     e.printStackTrace();
                  }

                  // let the processor to resolve the URI itself
                  return null;
               }
            });
         } catch (Exception e) {
            throw new RuntimeException("Error when creating transformer factory!", e);
         }

         m_factory = factory;
      }

      try {
         Templates templates = m_factory.newTemplates(getXslTemplate(ctx, template));

         return templates.newTransformer();
      } catch (Exception e) {
         throw new RuntimeException(String.format("Fail to open XSL template(%s)!", template), e);
      }
   }

   private String getXmlSource(ICaseContext ctx, String sourceXml) throws IOException {
      Class testClass = ctx.getEunitClass().getType();
      InputStream is = getResourceFromClassPath(testClass, sourceXml);

      if (is == null) {
         throw new RuntimeException(String.format("Can't find XML file(%s)!", sourceXml));
      } else {
         return Files.forIO().readFrom(is, "utf-8");
      }
   }

   private Source getXslTemplate(ICaseContext ctx, String templateXsl) {
      Class testClass = ctx.getEunitClass().getType();
      InputStream is = testClass.getResourceAsStream(templateXsl);

      if (is == null) {
         is = getClass().getResourceAsStream(templateXsl);
      }

      if (is == null) {
         throw new RuntimeException(String.format("Can't find XSL template(%s)!", templateXsl));
      } else {
         return new StreamSource(is);
      }
   }

   private void saveToFile(Manifest manifest, String content) throws IOException {
      File file = new File(".", manifest.getPath()).getCanonicalFile();

      Files.forIO().writeTo(file, content);
      System.out.println(String.format("File %s generated.", file));
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy