1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 package de.awtools.homegen.worker;
27
28 import java.io.File;
29 import java.io.FileOutputStream;
30 import java.io.OutputStreamWriter;
31 import java.io.StringWriter;
32 import java.io.Writer;
33 import java.util.ArrayList;
34 import java.util.LinkedList;
35 import java.util.List;
36
37 import org.apache.commons.io.IOUtils;
38 import org.apache.commons.lang.StringUtils;
39 import org.apache.commons.lang.Validate;
40 import org.apache.commons.logging.Log;
41 import org.apache.commons.logging.LogFactory;
42 import org.apache.velocity.Template;
43 import org.apache.velocity.VelocityContext;
44 import org.apache.velocity.app.Velocity;
45
46 import de.awtools.basic.file.AWToolsFileUtils;
47 import de.awtools.homegen.DirectoryHolder;
48 import de.awtools.homegen.TransformerException;
49 import de.awtools.homegen.config.GHConfiguration;
50 import de.awtools.homegen.directory.FileType;
51 import de.awtools.homegen.directory.FileWorker;
52 import de.awtools.homegen.directory.GHDirectory;
53 import de.awtools.homegen.directory.GHFile;
54 import de.awtools.homegen.directory.file.FileBuilder;
55 import de.awtools.homegen.directory.snippet.SnippetHtmlFile;
56 import de.awtools.homegen.directory.utils.GHFileUtils;
57 import de.awtools.homegen.navigation.Navigation;
58 import de.awtools.homegen.velocity.ContextFactory;
59 import de.awtools.homegen.velocity.VelocityUtils;
60
61
62
63
64
65
66
67 public final class SnippetToPageWorker implements FileWorker {
68
69
70 private static Log log = LogFactory.getLog(SnippetToPageWorker.class);
71
72
73 private final GHConfiguration configuration;
74
75
76 private final DirectoryHolder directoryHolder;
77
78
79 private final VelocityContext velocityContext;
80
81
82 private final List<GHFile> modifiedFiles;
83
84
85 private final boolean force;
86
87 private GHFile targetFile;
88
89 private final FileBuilder fileBuilder = new FileBuilder();
90
91
92
93
94
95
96
97
98
99
100 public SnippetToPageWorker(final GHConfiguration _config,
101 final DirectoryHolder _directoryHolder,
102 final VelocityContext _velocityContext,
103 final List<GHFile> _modifiedFiles, final boolean _force) {
104
105 configuration = _config;
106 directoryHolder = _directoryHolder;
107 velocityContext = _velocityContext;
108 modifiedFiles = _modifiedFiles;
109 force = _force;
110 }
111
112 @Override
113 public boolean accept(final GHFile file) {
114 targetFile = directoryHolder.getTargetWwwDirectory().findFile(file,
115 "html");
116
117 boolean fileIsNewer = true;
118 if (!force) {
119 fileIsNewer = file.isNewer(targetFile);
120 }
121
122 boolean accept = (fileIsNewer
123 && file.getFileType().equals(FileType.XML)
124 && !file.getName().equals("leftcontent.xml") && !file.getName()
125 .equals("rightcontent.xml"));
126
127 if (accept) {
128 if (log.isInfoEnabled()) {
129 log.info("Second transformation of file '"
130 + file.getNameAndPath() + "' at level '"
131 + file.getLevelFromRoot() + "'.");
132 }
133
134 configuration.getStatusChannel().sendStatus(
135 "Second transformation of file '" + file.getNameAndPath()
136 + "'.");
137 } else {
138 configuration.getStatusChannel().sendStatus(
139 "Second transformation of file '" + file.getNameAndPath()
140 + "' canceled.");
141 }
142
143 return accept;
144 }
145
146 @Override
147 public void apply(final GHFile file) {
148 generateHtmlFile((SnippetHtmlFile) file);
149 }
150
151
152
153
154
155
156
157
158 private void generateHtmlFile(final SnippetHtmlFile snippetHtmlFile) {
159
160 StringBuilder title = new StringBuilder();
161 Navigation navigation = (Navigation) velocityContext.get("navigation");
162 title.append(navigation.getHeader().getTitle());
163 if (!StringUtils.isBlank(snippetHtmlFile.getTitle())) {
164 title.append(" - ");
165 title.append(snippetHtmlFile.getTitle());
166 }
167
168 ArrayList<String> cssFiles = new ArrayList<String>();
169 for (String file : snippetHtmlFile.getCSSFiles()) {
170 cssFiles.add(file);
171 }
172
173
174 velocityContext.put(ContextFactory.ROOT_DIR,
175 AWToolsFileUtils.pathToRoot(snippetHtmlFile.getLevelFromRoot()));
176 velocityContext.put("centerContent",
177 snippetHtmlFile.getBody(configuration.getEncoding()));
178 velocityContext.put("headline", navigation.getHeader().getHeadline());
179 velocityContext.put("cssNavigations", navigation.getHeader()
180 .getCssFiles());
181 velocityContext.put("cssImports", cssFiles);
182 velocityContext.put("title", title.toString());
183
184 if (log.isDebugEnabled()) {
185 log.debug(">>> BODY >>> "
186 + snippetHtmlFile.getBody(configuration.getEncoding()));
187 log.debug(snippetHtmlFile.getBody(configuration.getEncoding()));
188 }
189
190
191
192
193
194 String leftMenu = VelocityUtils.toString(velocityContext,
195 configuration.getVelocityTemplatePath() + "/menuLinks.vm",
196 configuration.getEncoding());
197 velocityContext.put("leftmenu", leftMenu);
198
199
200
201
202
203 String header = VelocityUtils.toString(velocityContext,
204 configuration.getVelocityTemplatePath() + "/header.vm",
205 configuration.getEncoding());
206 velocityContext.put("header", header);
207
208 String headerNavigation = VelocityUtils.toString(velocityContext,
209 configuration.getVelocityTemplatePath() + "/headernavigation.vm",
210 configuration.getEncoding());
211 velocityContext.put("headernavigation", headerNavigation);
212
213 setContent(velocityContext, "leftContent",
214 snippetHtmlFile.getDirectory(), "leftcontent.xml");
215 setContent(velocityContext, "rightContent",
216 snippetHtmlFile.getDirectory(), "rightcontent.xml");
217
218 addFrameToContent(snippetHtmlFile);
219 }
220
221
222
223
224
225
226 private void addFrameToContent(final SnippetHtmlFile snippetHtmlFile) {
227 Writer writer = null;
228 try {
229 String htmlFileName = StringUtils.replace(
230 snippetHtmlFile.getNameAndPath(), ".xml", ".html");
231
232 GHDirectory htmlDirectory = GHFileUtils.createPath(
233 snippetHtmlFile.getDirectoryPath(),
234 directoryHolder.getTargetWwwDirectory(), fileBuilder);
235
236 File htmlFile = new File(directoryHolder.getTargetWwwDirectory()
237 .getFile().getAbsoluteFile()
238 + "/" + htmlFileName);
239
240 FileOutputStream fos = new FileOutputStream(htmlFile);
241 writer = new OutputStreamWriter(fos, configuration.getEncoding());
242
243 GHFile htmlGHFile = fileBuilder.buildFile(htmlFile, htmlDirectory,
244 "/" + htmlFile.getName());
245
246 if (htmlDirectory.findFile(htmlGHFile) == null) {
247 htmlDirectory.addFile(htmlGHFile);
248 }
249 modifiedFiles.add(htmlGHFile);
250
251 Template template = Velocity.getTemplate(
252 configuration.getVelocityTemplatePath() + "/frame.vm",
253 configuration.getEncoding());
254 template.merge(velocityContext, writer);
255
256 if (log.isDebugEnabled()) {
257 StringWriter sw = new StringWriter();
258 template.merge(velocityContext, sw);
259 log.debug(">>> KONTEXT >>> " + htmlFileName);
260 log.debug(velocityContext.get("centerContent"));
261 log.debug(sw.getBuffer().toString());
262 }
263 } catch (Exception ex) {
264 throw new TransformerException(ex);
265 } finally {
266 IOUtils.closeQuietly(writer);
267 }
268 }
269
270
271
272
273
274
275
276
277
278
279
280 private void setContent(final VelocityContext context,
281 final String contextKey, final GHDirectory path,
282 final String fileName) {
283
284 Validate.isTrue(!(StringUtils.isBlank(fileName)));
285 List<SnippetHtmlFile> files = findSameFileNames(path, fileName);
286
287 if (log.isDebugEnabled()) {
288 log.debug("Base......:"
289 + directoryHolder.getTargetWwwPrepDirectory().getFile()
290 .getAbsolutePath());
291 log.debug("Pfad......:" + path);
292 log.debug("FileName..:" + fileName);
293 }
294
295 StringBuffer buf = new StringBuffer();
296 for (SnippetHtmlFile snippetHtmlFile : files) {
297 buf.append(snippetHtmlFile.getBody(configuration.getEncoding()));
298 }
299
300 context.put(contextKey, buf);
301 }
302
303
304
305
306
307
308
309
310
311 private List<SnippetHtmlFile> findSameFileNames(final GHDirectory path,
312 final String fileName) {
313
314 List<SnippetHtmlFile> results = new LinkedList<SnippetHtmlFile>();
315
316 for (GHFile ghFile : path.getFiles()) {
317 SnippetHtmlFile snippetHtmlFile = (SnippetHtmlFile) ghFile;
318
319
320 String findMeFileName = snippetHtmlFile.getName();
321 if (snippetHtmlFile.getName().startsWith("/")) {
322 findMeFileName = StringUtils.removeStart(
323 snippetHtmlFile.getName(), "/");
324 }
325
326 if (findMeFileName.equals(fileName)) {
327 results.add(snippetHtmlFile);
328 break;
329 }
330 }
331
332 if (path.getParent() != null) {
333 results.addAll(findSameFileNames(path.getParent(), fileName));
334 }
335
336 return results;
337 }
338
339 }