00cc8caa665b93e5b71323bf36e1d44d6b02fd17
[controller.git] / opendaylight / config / yang-jmx-generator-plugin / src / main / java / org / opendaylight / controller / config / yangjmxgenerator / plugin / ftl / FtlFilePersister.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl;
9
10 import java.io.File;
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;
19 import java.util.Map;
20 import java.util.Map.Entry;
21 import java.util.regex.Matcher;
22 import java.util.regex.Pattern;
23
24 import org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator;
25 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.AnnotationsDirective;
26 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.ConstructorsDirective;
27 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.FieldsDirectiveProg;
28 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.HeaderDirective;
29 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.JavadocDirective;
30 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.MethodsDirective;
31 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.ModuleFieldsDirective;
32 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.TypeDeclarationDirective;
33 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.UnimplementedExceptionDirective;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 import com.google.common.annotations.VisibleForTesting;
38
39 import freemarker.template.Configuration;
40 import freemarker.template.Template;
41 import freemarker.template.TemplateException;
42
43 public class FtlFilePersister {
44     private static final Logger logger = LoggerFactory
45             .getLogger(FtlFilePersister.class);
46
47     private static final Pattern TRAILING_WHITESPACES = Pattern.compile(" +$", Pattern.MULTILINE);
48
49     @VisibleForTesting
50     public Map<FtlTemplate, String> serializeFtls(
51             Collection<? extends FtlTemplate> ftlFiles) {
52         Map<FtlTemplate, String> result = new HashMap<>();
53         for (FtlTemplate ftlFile : ftlFiles) {
54
55             try (Writer writer = new StringWriter()) {
56                 Template template = getCfg().getTemplate(
57                         ftlFile.getFtlTempleteLocation());
58                 try {
59                     template.process(ftlFile, writer);
60                 } catch (TemplateException e) {
61                     throw new IllegalStateException(
62                             "Template error while generating " + ftlFile, e);
63                 }
64                 String fileContent = writer.toString();
65                 // remove trailing spaces
66                 fileContent = TRAILING_WHITESPACES.matcher(fileContent).replaceAll("");
67                 result.put(ftlFile, fileContent);
68             } catch (IOException e) {
69                 throw new IllegalStateException(
70                         "Exception while processing template", e);
71             }
72         }
73
74         return result;
75     }
76
77     public List<File> persist(Collection<? extends FtlTemplate> ftlFiles,
78             File dstFolder, boolean overwrite) throws IOException {
79         Map<FtlTemplate, String> ftlFileStringMap = serializeFtls(ftlFiles);
80         List<File> result = new ArrayList<>();
81         for (Entry<FtlTemplate, String> entry : ftlFileStringMap.entrySet()) {
82             FtlTemplate ftlFile = entry.getKey();
83             File targetFile = new File(dstFolder, ftlFile.getRelativeFile()
84                     .getPath());
85             File pathToFile = targetFile.getParentFile();
86             if (pathToFile.exists() == false) {
87                 pathToFile.mkdirs();
88             }
89             if (targetFile.exists() && overwrite == false) {
90                 logger.info("Skipping {} since it already exists", targetFile);
91             } else {
92                 try (Writer fileWriter = new FileWriter(targetFile)) {
93                     fileWriter.write(entry.getValue());
94                 }
95                 logger.info("{}: File {} generated successfully",
96                         JMXGenerator.class.getCanonicalName(), targetFile);
97                 result.add(targetFile);
98             }
99         }
100         return result;
101     }
102
103     private Configuration getCfg() {
104         Configuration cfg = new Configuration();
105         cfg.setClassForTemplateLoading(getClass(), "/freeMarker/");
106         cfg.setSharedVariable("javadocD", new JavadocDirective());
107         cfg.setSharedVariable("annotationsD", new AnnotationsDirective());
108         cfg.setSharedVariable("typeDeclarationD",
109                 new TypeDeclarationDirective());
110         cfg.setSharedVariable("constructorsD", new ConstructorsDirective());
111         cfg.setSharedVariable("fieldsD", new FieldsDirectiveProg());
112         cfg.setSharedVariable("moduleFieldsD", new ModuleFieldsDirective());
113         cfg.setSharedVariable("methodsD", new MethodsDirective());
114         cfg.setSharedVariable("headerD", new HeaderDirective());
115         cfg.setSharedVariable("unimplementedExceptionD",
116                 new UnimplementedExceptionDirective());
117         return cfg;
118     }
119
120 }