Initial code drop of yang model driven configuration system
[controller.git] / opendaylight / config / yang-jmx-generator-plugin / src / main / java / org / opendaylight / controller / config / yangjmxgenerator / plugin / ftl / FtlFilePersister.java
diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/FtlFilePersister.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/FtlFilePersister.java
new file mode 100644 (file)
index 0000000..00cc8ca
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator;
+import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.AnnotationsDirective;
+import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.ConstructorsDirective;
+import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.FieldsDirectiveProg;
+import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.HeaderDirective;
+import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.JavadocDirective;
+import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.MethodsDirective;
+import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.ModuleFieldsDirective;
+import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.TypeDeclarationDirective;
+import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.UnimplementedExceptionDirective;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import freemarker.template.TemplateException;
+
+public class FtlFilePersister {
+    private static final Logger logger = LoggerFactory
+            .getLogger(FtlFilePersister.class);
+
+    private static final Pattern TRAILING_WHITESPACES = Pattern.compile(" +$", Pattern.MULTILINE);
+
+    @VisibleForTesting
+    public Map<FtlTemplate, String> serializeFtls(
+            Collection<? extends FtlTemplate> ftlFiles) {
+        Map<FtlTemplate, String> result = new HashMap<>();
+        for (FtlTemplate ftlFile : ftlFiles) {
+
+            try (Writer writer = new StringWriter()) {
+                Template template = getCfg().getTemplate(
+                        ftlFile.getFtlTempleteLocation());
+                try {
+                    template.process(ftlFile, writer);
+                } catch (TemplateException e) {
+                    throw new IllegalStateException(
+                            "Template error while generating " + ftlFile, e);
+                }
+                String fileContent = writer.toString();
+                // remove trailing spaces
+                fileContent = TRAILING_WHITESPACES.matcher(fileContent).replaceAll("");
+                result.put(ftlFile, fileContent);
+            } catch (IOException e) {
+                throw new IllegalStateException(
+                        "Exception while processing template", e);
+            }
+        }
+
+        return result;
+    }
+
+    public List<File> persist(Collection<? extends FtlTemplate> ftlFiles,
+            File dstFolder, boolean overwrite) throws IOException {
+        Map<FtlTemplate, String> ftlFileStringMap = serializeFtls(ftlFiles);
+        List<File> result = new ArrayList<>();
+        for (Entry<FtlTemplate, String> entry : ftlFileStringMap.entrySet()) {
+            FtlTemplate ftlFile = entry.getKey();
+            File targetFile = new File(dstFolder, ftlFile.getRelativeFile()
+                    .getPath());
+            File pathToFile = targetFile.getParentFile();
+            if (pathToFile.exists() == false) {
+                pathToFile.mkdirs();
+            }
+            if (targetFile.exists() && overwrite == false) {
+                logger.info("Skipping {} since it already exists", targetFile);
+            } else {
+                try (Writer fileWriter = new FileWriter(targetFile)) {
+                    fileWriter.write(entry.getValue());
+                }
+                logger.info("{}: File {} generated successfully",
+                        JMXGenerator.class.getCanonicalName(), targetFile);
+                result.add(targetFile);
+            }
+        }
+        return result;
+    }
+
+    private Configuration getCfg() {
+        Configuration cfg = new Configuration();
+        cfg.setClassForTemplateLoading(getClass(), "/freeMarker/");
+        cfg.setSharedVariable("javadocD", new JavadocDirective());
+        cfg.setSharedVariable("annotationsD", new AnnotationsDirective());
+        cfg.setSharedVariable("typeDeclarationD",
+                new TypeDeclarationDirective());
+        cfg.setSharedVariable("constructorsD", new ConstructorsDirective());
+        cfg.setSharedVariable("fieldsD", new FieldsDirectiveProg());
+        cfg.setSharedVariable("moduleFieldsD", new ModuleFieldsDirective());
+        cfg.setSharedVariable("methodsD", new MethodsDirective());
+        cfg.setSharedVariable("headerD", new HeaderDirective());
+        cfg.setSharedVariable("unimplementedExceptionD",
+                new UnimplementedExceptionDirective());
+        return cfg;
+    }
+
+}