View Javadoc

1   /*
2    * $Id: SnippetTransformer.java 2993 2011-11-24 19:51:48Z andrewinkler $
3    * ============================================================================
4    * Project gluehloch-homepage-core
5    * Copyright (c) 2004-2011 by Andre Winkler. All rights reserved.
6    * ============================================================================
7    *          GNU LESSER GENERAL PUBLIC LICENSE
8    *  TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
9    *
10   *  This library is free software; you can redistribute it and/or
11   *  modify it under the terms of the GNU Lesser General Public
12   *  License as published by the Free Software Foundation; either
13   *  version 2.1 of the License, or (at your option) any later version.
14   *
15   *  This library is distributed in the hope that it will be useful,
16   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18   *  Lesser General Public License for more details.
19   *
20   *  You should have received a copy of the GNU Lesser General Public
21   *  License along with this library; if not, write to the Free Software
22   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23   *
24   */
25  
26  package de.awtools.homegen;
27  
28  import java.io.File;
29  
30  import org.apache.commons.lang.Validate;
31  import org.dom4j.DocumentException;
32  import org.slf4j.Logger;
33  
34  import de.awtools.basic.LoggerFactory;
35  import de.awtools.basic.file.AWToolsFileUtils;
36  import de.awtools.xml.XSLTransformer;
37  import de.awtools.homegen.config.GHConfiguration;
38  import de.awtools.homegen.directory.FileType;
39  import de.awtools.homegen.directory.FileWorker;
40  import de.awtools.homegen.directory.GHDirectory;
41  import de.awtools.homegen.directory.GHFile;
42  import de.awtools.homegen.directory.file.FileBuilder;
43  import de.awtools.homegen.directory.utils.GHFileUtils;
44  import de.awtools.homegen.velocity.ContextFactory;
45  import de.awtools.homegen.xml.HomepageURIResolver;
46  
47  /**
48   * Transformiert die 'XML'-Sourcen in XML/HTML-Schnipsel. D.h. alle Dateien
49   * unter <code>PROJECT_HOME</code>/www mit der Endung *.xml werden durch die 
50   * XSL Transformation geschickt. Das Ergebnis landet als sogenanntes HTML
51   * Dokument nach <code>PROJECT_HOME/www-prep</code>. Das Ergebnis behält den
52   * Dateinamen.
53   *
54   * @version $LastChangedRevision: 2993 $ $LastChangedDate: 2011-11-24 20:51:48 +0100 (Thu, 24 Nov 2011) $
55   * @author by Andre Winkler, $LastChangedBy: andrewinkler $
56   *
57   * @since 1.2
58   */
59  public class SnippetTransformer implements Transformer {
60  
61      /** Der private Logger der Klasse. */
62      private static Logger log = LoggerFactory.make();
63  
64      /** Die zu verwendende Konfiguration. */
65      private final GHConfiguration configuration;
66  
67      /** Verwaltet die eingescannten Verzeichnisse. */
68      private final DirectoryHolder directoryHolder;
69  
70      /** Das Zielverzeichnis der Transformation. */
71      private final GHDirectory target;
72  
73      /** Das Sourceverzeichnis der Transformation. */
74      private final GHDirectory source;
75  
76      /**
77       * Generierung soll erfolgen, auch wenn kein neuer Stand der zu
78       * transformierenden Datei vorhanden ist. 
79       */
80      private final boolean force;
81  
82      /**
83       * Konstruktor.
84       * 
85       * @param _config Die Konfiguration.
86       * @param _directoryHolder Die eingescannten Verzeichnisse.
87       * @param _force Generierung
88       */
89      public SnippetTransformer(final GHConfiguration _config,
90              final DirectoryHolder _directoryHolder, final boolean _force) {
91  
92          configuration = _config;
93          directoryHolder = _directoryHolder;
94          target = directoryHolder.getTargetWwwPrepDirectory();
95          source = directoryHolder.getSourceDirectory();
96          force = _force;
97      }
98  
99      // ------------------------------------------------------------------------
100 
101     /**
102      * Startet die Transformation der XML Homepage Dateien.
103      */
104     @Override
105     public final void run() {
106         Validate.notNull(configuration.getStyle());
107 
108         if (log.isInfoEnabled()) {
109             log.info("Source ....: " + source);
110             log.info("Target ....: " + target);
111         }
112 
113         directoryHolder.getSourceDirectory().apply(
114                 new SnippetTransformerFileWorker());
115     }
116 
117     // ------------------------------------------------------------------------
118 
119     private final class SnippetTransformerFileWorker implements FileWorker {
120 
121         private final XSLTransformer transe = new XSLTransformer();
122 
123         private GHFile targetFile;
124 
125         SnippetTransformerFileWorker() {
126             transe.setEncoding(configuration.getEncoding());
127             transe.setMethod("xml");
128             transe.setOmitXmlDeclaration("no");
129             transe.setStyle(configuration.getStyle());
130             transe.setUriResolver(new HomepageURIResolver(configuration.getCssFramework()));
131         }
132 
133         /* (non-Javadoc)
134          * @see de.awtools.homegen.directory.FileWorker#apply(de.awtools.homegen.directory.GHFile)
135          */
136         @Override
137         public void apply(final GHFile file) {
138             String wwwRootDir = AWToolsFileUtils
139                     .pathToRoot(file.getLevelFromRoot());
140 
141             //			String sourceFileName = file.getFile().getAbsolutePath();
142             //			StringBuilder targetFileName = new StringBuilder(getTarget()
143             //					.getFile().getAbsolutePath()).append("/").append(
144             //					file.getNameAndPath());
145 
146             if (targetFile == null) {
147                 FileBuilder fileBuilder = new FileBuilder();
148                 GHDirectory targetDir = GHFileUtils.createPath(
149                         file.getDirectoryPath(), target, fileBuilder);
150                 File targetFileFile = new File(targetDir.getFile(),
151                         file.getName());
152                 targetFile = fileBuilder.buildFile(targetFileFile, targetDir,
153                         file.getName());
154                 targetDir.addFile(targetFile);
155             }
156 
157             AWToolsFileUtils.createFilePath(target.getFile().getAbsolutePath(),
158                     file.getNameAndPath());
159 
160             transe.addParameter(ContextFactory.ROOT_DIR, wwwRootDir);
161             transe.setSource(file.getFile());
162             transe.setTarget(targetFile.getFile());
163             try {
164                 transe.run();
165             } catch (Exception ex) {
166                 if (ex.getCause() instanceof DocumentException) {
167                     DocumentException dex = (DocumentException) ex.getCause();
168                     log.error("DocumentException: " + dex.getMessage());
169                 }
170                 throw new RuntimeException("Fatal error: file='"
171                         + file.getFile() + "'.", ex);
172             }
173         }
174 
175         /* (non-Javadoc)
176          * @see de.awtools.homegen.directory.FileWorker#accept(de.awtools.homegen.directory.GHFile)
177          */
178         @Override
179         public boolean accept(final GHFile file) {
180             targetFile = target.findFile(file);
181             boolean fileIsNewer = true;
182             if (!force) {
183                 // true if the File exists and has been modified more recently than the reference File
184                 fileIsNewer = file.isNewer(targetFile);
185             }
186             boolean accept = (fileIsNewer && file.getFileType().equals(
187                     FileType.XML));
188 
189             if (accept) {
190                 configuration.getStatusChannel().sendStatus(
191                         "Transforming file '" + file + "'.");
192             } else {
193                 StringBuilder sb = new StringBuilder("Ignoring file '");
194                 sb.append(file).append("'.");
195                 if (!fileIsNewer) {
196                     sb.append(" Source file is not changed.");
197                 }
198                 configuration.getStatusChannel().sendStatus(sb.toString());
199             }
200             return accept;
201         }
202 
203     }
204 
205 }