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 }