Merge "BUG-509: add missing copyright headers"
[controller.git] / opendaylight / config / yang-jmx-generator-plugin / src / main / java / org / opendaylight / controller / config / yangjmxgenerator / plugin / CodeWriter.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 com.google.common.base.Optional;
11 import com.google.common.collect.Lists;
12 import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry;
13 import org.opendaylight.controller.config.yangjmxgenerator.RuntimeBeanEntry;
14 import org.opendaylight.controller.config.yangjmxgenerator.ServiceInterfaceEntry;
15 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.FtlTemplate;
16 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.GeneralClassTemplate;
17 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.GeneralInterfaceTemplate;
18 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.RuntimeRegistratorFtlTemplate;
19 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.StubFactoryTemplate;
20 import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.TemplateFactory;
21 import org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory.AbsFactoryGeneratedObjectFactory;
22 import org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory.AbsModuleGeneratedObjectFactory;
23 import org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory.ConcreteModuleGeneratedObjectFactory;
24 import org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory.GenericGeneratedObjectFactory;
25 import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.FullyQualifiedName;
26 import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.GeneratedObject;
27 import org.opendaylight.controller.config.yangjmxgenerator.plugin.util.StringUtil;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 import java.io.File;
32 import java.io.IOException;
33 import java.util.ArrayList;
34 import java.util.Collection;
35 import java.util.Collections;
36 import java.util.HashMap;
37 import java.util.Iterator;
38 import java.util.List;
39 import java.util.Map;
40 import java.util.Map.Entry;
41
42 final class CodeWriter {
43
44     private static final Logger logger = LoggerFactory.getLogger(CodeWriter.class);
45     private static final Optional<String> copyright = StringUtil.loadCopyright();
46
47     public File writeSie(ServiceInterfaceEntry sie, File outputBaseDir) {
48         try {
49             GeneralInterfaceTemplate generalInterfaceTemplate = TemplateFactory.serviceInterfaceFromSie(sie);
50             GeneratedObject go = new GenericGeneratedObjectFactory().toGeneratedObject(generalInterfaceTemplate, copyright);
51             return go.persist(outputBaseDir).get().getValue();
52         } catch (Exception e) {
53             String message = "An error occurred during Service interface generating, sie:"
54                     + sie.getTypeName() + ", " + sie.getFullyQualifiedName();
55             logger.error(message, e);
56             throw new RuntimeException(message, e);
57         }
58     }
59
60     public List<File> writeMbe(ModuleMXBeanEntry mbe, File targetBaseDir,
61                                File mainBaseDir) {
62         try {
63             List<File> generatedFiles = Lists.newArrayList();
64
65
66             Map<GeneratedObject, Boolean /*overwrite*/> gos = new HashMap<>();
67
68             // generate mx interface and abstract factory
69
70             // TOs
71             Map<String,GeneralClassTemplate> tosFromMbe = TemplateFactory.tOsFromMbe(mbe);
72             for(GeneralClassTemplate template: tosFromMbe.values()) {
73                 gos.put(new GenericGeneratedObjectFactory().toGeneratedObject(template, copyright), true);
74             }
75
76             // MXBean interface
77             GeneralInterfaceTemplate ifcTemplate = TemplateFactory.mXBeanInterfaceTemplateFromMbe(mbe);
78             gos.put(new GenericGeneratedObjectFactory().toGeneratedObject(ifcTemplate, copyright), true);
79
80
81             // generate abstract factory
82             gos.put(new AbsFactoryGeneratedObjectFactory().toGeneratedObject(mbe, copyright), true);
83
84             // generate abstract module
85             gos.put(new AbsModuleGeneratedObjectFactory().toGeneratedObject(mbe, copyright), true);
86
87             // generate concrete factory
88             StubFactoryTemplate concreteFactory = TemplateFactory.stubFactoryTemplateFromMbe(mbe);
89             gos.put(new GenericGeneratedObjectFactory().toGeneratedObject(concreteFactory, copyright), false);
90
91
92             // generate concrete module
93
94             gos.put(new ConcreteModuleGeneratedObjectFactory().toGeneratedObject(mbe, copyright, Optional.<String>absent()), false);
95
96             // write runtime bean MXBeans and registrators
97             List<FtlTemplate> allFtlFiles = getRuntimeBeanFtlTemplates(mbe.getRuntimeBeans());
98             for(FtlTemplate template: allFtlFiles) {
99                 gos.put(new GenericGeneratedObjectFactory().toGeneratedObject(template, copyright), true);
100             }
101
102             generatedFiles.addAll(persistGeneratedObjects(targetBaseDir, mainBaseDir, gos));
103
104             // purge nulls
105             for (Iterator<File> it = generatedFiles.iterator(); it.hasNext(); ) {
106                 if (it.next() == null) {
107                     it.remove();
108                 }
109             }
110
111             return generatedFiles;
112
113         } catch (Exception e) {
114             String message = "An error occurred during Module generating, mbe:"
115                     + mbe.getJavaNamePrefix();
116             logger.error(message, e);
117             throw new RuntimeException(message, e);
118         }
119     }
120
121     private List<File> persistGeneratedObjects(File targetBaseDir, File mainBaseDir, Map<GeneratedObject, Boolean> gos) throws IOException {
122         List<File> generatedFiles = new ArrayList<>();
123         for (Entry<GeneratedObject, Boolean> entry : gos.entrySet()) {
124             boolean overwrite = entry.getValue();
125             File dst;
126             if (overwrite) {
127                 dst = targetBaseDir;
128             } else {
129                 dst = mainBaseDir;
130             }
131             Optional<Entry<FullyQualifiedName, File>> maybePersistEntry = entry.getKey().persist(dst, overwrite);
132
133             if (maybePersistEntry.isPresent()) {
134                 generatedFiles.add(maybePersistEntry.get().getValue());
135             }
136         }
137         return generatedFiles;
138     }
139
140     private List<FtlTemplate> getRuntimeBeanFtlTemplates(Collection<RuntimeBeanEntry> runtimeBeans) {
141         if (runtimeBeans.isEmpty()) {
142             return Collections.emptyList();
143         }
144         List<FtlTemplate> allFtlFiles = new ArrayList<>();
145         { // registrators
146             Map<String, FtlTemplate> registratorNamesToFtls = RuntimeRegistratorFtlTemplate
147                     .create(RuntimeRegistratorFtlTemplate.findRoot(runtimeBeans));
148
149             allFtlFiles.addAll(registratorNamesToFtls.values());
150         }
151         { // TOs, MXBean interfaces
152             for (RuntimeBeanEntry runtimeBeanEntry : runtimeBeans) {
153                 Collection<FtlTemplate> ftlFiles = TemplateFactory
154                         .getTOAndMXInterfaceFtlFiles(runtimeBeanEntry)
155                         .values();
156                 allFtlFiles.addAll(ftlFiles);
157             }
158         }
159         return allFtlFiles;
160     }
161 }