X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fconfig%2Fyang-jmx-generator-plugin%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfig%2Fyangjmxgenerator%2Fplugin%2Fftl%2FFtlFilePersister.java;fp=opendaylight%2Fconfig%2Fyang-jmx-generator-plugin%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfig%2Fyangjmxgenerator%2Fplugin%2Fftl%2FFtlFilePersister.java;h=00cc8caa665b93e5b71323bf36e1d44d6b02fd17;hb=9fb64948564e252018f9b1e13e7cea2c92f991aa;hp=0000000000000000000000000000000000000000;hpb=1742b3894614be478c333a1043ced8ef1bc5dc84;p=controller.git 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 index 0000000000..00cc8caa66 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/FtlFilePersister.java @@ -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 serializeFtls( + Collection ftlFiles) { + Map 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 persist(Collection ftlFiles, + File dstFolder, boolean overwrite) throws IOException { + Map ftlFileStringMap = serializeFtls(ftlFiles); + List result = new ArrayList<>(); + for (Entry 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; + } + +}