2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl;
11 import java.io.FileWriter;
12 import java.io.IOException;
13 import java.io.StringWriter;
14 import java.io.Writer;
15 import java.util.ArrayList;
16 import java.util.Collection;
17 import java.util.HashMap;
18 import java.util.List;
20 import java.util.Map.Entry;
21 import java.util.regex.Pattern;
23 import org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator;
24 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.AnnotationsDirective;
25 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.ConstructorsDirective;
26 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.FieldsDirectiveProg;
27 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.HeaderDirective;
28 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.JavadocDirective;
29 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.MethodsDirective;
30 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.ModuleFieldsDirective;
31 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.TypeDeclarationDirective;
32 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.UnimplementedExceptionDirective;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
36 import com.google.common.annotations.VisibleForTesting;
38 import freemarker.template.Configuration;
39 import freemarker.template.Template;
40 import freemarker.template.TemplateException;
42 public class FtlFilePersister {
43 private static final Logger logger = LoggerFactory
44 .getLogger(FtlFilePersister.class);
46 private static final Pattern TRAILING_WHITESPACES = Pattern.compile(" +$", Pattern.MULTILINE);
49 public Map<FtlTemplate, String> serializeFtls(
50 Collection<? extends FtlTemplate> ftlFiles) {
51 Map<FtlTemplate, String> result = new HashMap<>();
52 for (FtlTemplate ftlFile : ftlFiles) {
54 try (Writer writer = new StringWriter()) {
55 Template template = getCfg().getTemplate(
56 ftlFile.getFtlTempleteLocation());
58 template.process(ftlFile, writer);
59 } catch (TemplateException e) {
60 throw new IllegalStateException(
61 "Template error while generating " + ftlFile, e);
63 String fileContent = writer.toString();
64 // remove trailing spaces
65 fileContent = TRAILING_WHITESPACES.matcher(fileContent).replaceAll("");
66 result.put(ftlFile, fileContent);
67 } catch (IOException e) {
68 throw new IllegalStateException(
69 "Exception while processing template", e);
76 public List<File> persist(Collection<? extends FtlTemplate> ftlFiles,
77 File dstFolder, boolean overwrite) throws IOException {
78 Map<FtlTemplate, String> ftlFileStringMap = serializeFtls(ftlFiles);
79 List<File> result = new ArrayList<>();
80 for (Entry<FtlTemplate, String> entry : ftlFileStringMap.entrySet()) {
81 FtlTemplate ftlFile = entry.getKey();
82 File targetFile = new File(dstFolder, ftlFile.getRelativeFile()
84 File pathToFile = targetFile.getParentFile();
85 if (pathToFile.exists() == false) {
88 if (targetFile.exists() && overwrite == false) {
89 logger.info("Skipping {} since it already exists", targetFile);
91 try (Writer fileWriter = new FileWriter(targetFile)) {
92 fileWriter.write(entry.getValue());
94 logger.info("{}: File {} generated successfully",
95 JMXGenerator.class.getCanonicalName(), targetFile);
96 result.add(targetFile);
102 private Configuration getCfg() {
103 Configuration cfg = new Configuration();
104 cfg.setClassForTemplateLoading(getClass(), "/freeMarker/");
105 cfg.setSharedVariable("javadocD", new JavadocDirective());
106 cfg.setSharedVariable("annotationsD", new AnnotationsDirective());
107 cfg.setSharedVariable("typeDeclarationD",
108 new TypeDeclarationDirective());
109 cfg.setSharedVariable("constructorsD", new ConstructorsDirective());
110 cfg.setSharedVariable("fieldsD", new FieldsDirectiveProg());
111 cfg.setSharedVariable("moduleFieldsD", new ModuleFieldsDirective());
112 cfg.setSharedVariable("methodsD", new MethodsDirective());
113 cfg.setSharedVariable("headerD", new HeaderDirective());
114 cfg.setSharedVariable("unimplementedExceptionD",
115 new UnimplementedExceptionDirective());