tim@345: package de.intevation.gnv.artifacts;
tim@345: 
sascha@779: import de.intevation.artifactdatabase.Config;
sascha@779: import de.intevation.artifactdatabase.DefaultCallMeta;
sascha@779: import de.intevation.artifactdatabase.DefaultPreferredLocale;
sascha@779: import de.intevation.artifactdatabase.FactoryBootstrap;
sascha@779: 
sascha@779: import de.intevation.artifacts.Artifact;
sascha@779: import de.intevation.artifacts.ArtifactFactory;
sascha@779: import de.intevation.artifacts.CallContext;
sascha@779: import de.intevation.artifacts.CallMeta;
sascha@779: import de.intevation.artifacts.PreferredLocale;
sascha@779: 
sascha@779: import de.intevation.gnv.utils.ArtifactXMLUtilities;
sascha@779: 
tim@345: import java.io.ByteArrayInputStream;
tim@345: import java.io.File;
tim@345: import java.io.FileNotFoundException;
tim@345: import java.io.FileOutputStream;
tim@345: import java.io.IOException;
tim@345: 
tim@345: import javax.xml.parsers.DocumentBuilder;
tim@345: import javax.xml.parsers.DocumentBuilderFactory;
tim@345: import javax.xml.parsers.ParserConfigurationException;
tim@345: 
tim@345: import junit.framework.TestCase;
tim@345: 
tim@345: import org.apache.log4j.BasicConfigurator;
tim@345: import org.apache.log4j.Logger;
tim@345: 
sascha@779: import org.w3c.dom.Document;
sascha@779: 
sascha@779: import org.xml.sax.SAXException;
tim@345: 
tim@345: /**
sascha@780:  * @author <a href="mailto:tim.englich@intevation.de">Tim Englich</a>
tim@345:  *
tim@345:  */
tim@345: public abstract class GNVArtifactsTestCaseBase extends TestCase {
tim@345: 
tim@345:     /**
tim@345:      * the logger, used to log exceptions and additonaly information
tim@345:      */
tim@345:     private static Logger log = null;
tim@345: 
tim@345:     static {
tim@345:         BasicConfigurator.configure();
tim@345:         log = Logger.getLogger(GNVArtifactsTestCaseBase.class);
tim@345:     }
sascha@778: 
tim@345:     private String configurationDir = "doc/conf";
tim@345: 
tim@345:     protected FactoryBootstrap bootstrap = null;
sascha@778: 
tim@345:     /**
tim@345:      * Constructor
tim@345:      */
tim@345:     public GNVArtifactsTestCaseBase() {
tim@345:     }
tim@345: 
tim@345:     /**
tim@345:      * Constructor
tim@345:      * @param name
tim@345:      */
tim@345:     public GNVArtifactsTestCaseBase(String name) {
tim@345:         super(name);
tim@345:     }
sascha@778: 
tim@345:     public abstract void testArtifact();
tim@345:     /**
tim@345:      * @see junit.framework.TestCase#setUp()
tim@345:      */
tim@345:     protected void setUp() throws Exception {
tim@345:         log.debug("GNVArtifactsTestCase.setUp");
tim@345:         super.setUp();
tim@345:         log.info(Config.CONFIG_DIR + " ==> " + configurationDir);
tim@345:         System.setProperty(Config.CONFIG_DIR, configurationDir);
tim@345:         log.info("Bootstrap wird initialisiert.");
tim@345:         bootstrap = new FactoryBootstrap();
tim@345:         bootstrap.boot();
tim@345:     }
sascha@778: 
tim@345:     protected void writeDocument2Log(Document document) {
tim@345:         log.debug(new ArtifactXMLUtilities().writeDocument2String(document));
tim@345:     }
tim@345: 
tim@345:     protected Document readDocument(String fileName) {
tim@345:         Document returnValue = null;
tim@345:         try {
tim@345:             DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
tim@345:                     .newInstance();
tim@466:             docBuilderFactory.setNamespaceAware(true);
tim@345:             DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
tim@345:             returnValue = docBuilder.parse(new File(fileName));
tim@345:         } catch (ParserConfigurationException e) {
tim@345:             log.error(e, e);
tim@345:         } catch (SAXException e) {
tim@345:             log.error(e, e);
tim@345:         } catch (IOException e) {
tim@345:             log.error(e, e);
tim@345:         }
tim@345:         return returnValue;
tim@345:     }
tim@345: 
tim@345:     protected void check4ExceptionReport(Document document) throws Exception {
tim@345:         document = new ArtifactXMLUtilities().reInitDocument(document);
tim@345:         String message = Config.getStringXPath(document,
tim@345:                 "/exceptionreport/exception");
tim@345:         if (message != null) {
tim@345:             throw new Exception(message);
tim@345:         }
tim@345:     }
sascha@778: 
tim@345:     /**
tim@345:      * @return
tim@345:      */
tim@485:     protected CallContext createCallContext(ArtifactFactory artifactFactory) {
tim@345:         CallMeta callMeta = new DefaultCallMeta(
tim@345:                 new PreferredLocale[] { new DefaultPreferredLocale("de_DE",
tim@345:                         1.0f) });
tim@485:         CallContext cc = new TestCallContext(bootstrap.getContext(), callMeta,artifactFactory);
tim@345:         return cc;
tim@345:     }
tim@345: 
tim@345:     /**
tim@345:      * @param artifact
tim@345:      * @param cc
tim@345:      * @param describeDocument TODO
tim@345:      * @throws Exception
tim@345:      */
tim@345:     protected void doNextStep(Artifact artifact, CallContext cc,
tim@345:                             String feedDocument, String advanceDocument, Document describeDocument)
tim@345:                                                                         throws Exception {
tim@345:         Document outputData = artifact.describe(describeDocument,cc);
tim@466: //      this.writeDocument2Log(outputData);
tim@345:         outputData = artifact.feed(this.readDocument(feedDocument), cc);
tim@345:         this.check4ExceptionReport(outputData);
tim@345:         outputData = artifact.advance(this.readDocument(advanceDocument), cc);
tim@345: //        this.writeDocument2Log(outputData);
tim@345:         this.check4ExceptionReport(outputData);
tim@345: 
tim@345:     }
sascha@778: 
tim@345:     protected void createFile(byte[] content, String fileName) {
tim@345:         try {
tim@345:             FileOutputStream fos = new FileOutputStream(new File(fileName));
tim@345:             ByteArrayInputStream bis = new ByteArrayInputStream(content);
tim@345:             byte[] buf = new byte[4096];
tim@345:             while (bis.read(buf) > 0) {
tim@345:                 fos.write(buf);
tim@345:             }
tim@345:             fos.flush();
tim@345:             fos.close();
tim@345:         } catch (FileNotFoundException e) {
tim@345:             log.error(e, e);
tim@345:         } catch (IOException e) {
tim@345:             log.error(e, e);
tim@345:         }
tim@345:     }
tim@345: 
tim@345:     /**
tim@345:      * @param artefactName
tim@345:      */
tim@345:     protected ArtifactFactory getArtifactFactory(String artefactName) {
tim@345:         log.debug("GNVArtifactsTestCase.getArtifactFactory");
tim@345:         ArtifactFactory[] artifactFactories = bootstrap.getArtifactFactories();
tim@345:         for (int i = 0; i < artifactFactories.length; i++) {
tim@345:             if (artifactFactories[i].getName().equals(artefactName)) {
tim@345:                 log.debug("ArtifactFactory wurde gefunden.");
tim@345:                 return artifactFactories[i];
tim@345:             }
tim@345:         }
tim@345:         return null;
tim@345:     }
tim@345: 
tim@595:     /**
tim@595:      * @param artifactFactory
tim@595:      * @return
tim@595:      */
tim@595:     protected Artifact createArtifact(ArtifactFactory artifactFactory) {
tim@595:         Document setupData = null;
tim@595:         Artifact artifact = artifactFactory.createArtifact(
sascha@778:                                             "" + System.currentTimeMillis(),
tim@595:                                             bootstrap.getContext(),
tim@595:                                             setupData);
tim@595:         assertNotNull(artifact);
tim@595:         log.debug("Artifact is available");
tim@595:         return artifact;
tim@595:     }
tim@345: 
tim@345: 
tim@345: }