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