2b84ed1d4515c22773fd27c617b708a2b4b53264
[controller.git] / opendaylight / config / yang-jmx-generator-plugin / src / main / java / org / opendaylight / controller / config / yangjmxgenerator / plugin / FreeMarkerCodeWriterImpl.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;
9
10 import java.io.File;
11 import java.util.ArrayList;
12 import java.util.Collection;
13 import java.util.Iterator;
14 import java.util.List;
15 import java.util.Map;
16
17 import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry;
18 import org.opendaylight.controller.config.yangjmxgenerator.RuntimeBeanEntry;
19 import org.opendaylight.controller.config.yangjmxgenerator.ServiceInterfaceEntry;
20 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.FtlFilePersister;
21 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.FtlTemplate;
22 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.RuntimeRegistratorFtlTemplate;
23 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.TemplateFactory;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 import com.google.common.collect.Lists;
28
29 final class FreeMarkerCodeWriterImpl implements CodeWriter {
30
31     private static final Logger logger = LoggerFactory
32             .getLogger(FreeMarkerCodeWriterImpl.class);
33
34     private final FtlFilePersister ftlFilePersister = new FtlFilePersister();
35
36     public FreeMarkerCodeWriterImpl() {
37     }
38
39     @Override
40     public File writeSie(ServiceInterfaceEntry sie, File outputBaseDir) {
41         try {
42             Collection<FtlTemplate> values = TemplateFactory.getFtlTemplates(
43                     sie).values();
44             return ftlFilePersister.persist(values, outputBaseDir, true).get(0);
45         } catch (Exception e) {
46             String message = "An error occurred during Service interface generating, sie:"
47                     + sie.getTypeName() + ", " + sie.getFullyQualifiedName();
48             logger.error(message, e);
49             throw new RuntimeException(message, e);
50         }
51     }
52
53     @Override
54     public List<File> writeMbe(ModuleMXBeanEntry mbe, File targetBaseDir,
55             File mainBaseDir, File resourceBaseDir) {
56         try {
57             List<File> generatedFiles = Lists.newArrayList();
58
59             generatedFiles.addAll(ftlFilePersister.persist(TemplateFactory
60                     .getFtlTemplates(mbe).values(), targetBaseDir, true));
61             generatedFiles.addAll(ftlFilePersister.persist(TemplateFactory
62                     .getFtlStubTemplates(mbe).values(), mainBaseDir, false));
63
64             // write runtime bean MXBeans and registrators
65             Collection<RuntimeBeanEntry> runtimeBeans = mbe.getRuntimeBeans();
66             if (runtimeBeans.size() > 0) {
67                 List<FtlTemplate> allFtlFiles = new ArrayList<>();
68                 { // registrators
69                     Map<String, FtlTemplate> registratorNamesToFtls = RuntimeRegistratorFtlTemplate
70                             .create(RuntimeRegistratorFtlTemplate.findRoot(runtimeBeans));
71
72                     allFtlFiles.addAll(registratorNamesToFtls.values());
73                 }
74                 { // TOs, MXBean interfaces
75                     for (RuntimeBeanEntry runtimeBeanEntry : runtimeBeans) {
76                         Collection<FtlTemplate> ftlFiles = TemplateFactory
77                                 .getTOAndMXInterfaceFtlFiles(runtimeBeanEntry)
78                                 .values();
79                         allFtlFiles.addAll(ftlFiles);
80                     }
81                 }
82                 boolean overwrite = true;
83
84                 FtlFilePersister ftlFilePersister = new FtlFilePersister();
85                 List<File> persisted = ftlFilePersister.persist(allFtlFiles,
86                         targetBaseDir, overwrite);
87                 // FIXME: check for intersection
88                 generatedFiles.addAll(persisted);
89             }
90
91             // purge nulls
92             for (Iterator<File> it = generatedFiles.iterator(); it.hasNext();) {
93                 if (it.next() == null) {
94                     it.remove();
95                 }
96             }
97
98             return generatedFiles;
99
100         } catch (Exception e) {
101             String message = "An error occurred during Module generating, mbe:"
102                     + mbe.getJavaNamePrefix();
103             logger.error(message, e);
104             throw new RuntimeException(message, e);
105         }
106     }
107
108 }