Java tutorial
/* * 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; import com.google.common.base.Optional; import com.google.common.collect.Lists; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry; import org.opendaylight.controller.config.yangjmxgenerator.RuntimeBeanEntry; import org.opendaylight.controller.config.yangjmxgenerator.ServiceInterfaceEntry; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.FtlTemplate; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.GeneralClassTemplate; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.GeneralInterfaceTemplate; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.RuntimeRegistratorFtlTemplate; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.StubFactoryTemplate; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.TemplateFactory; import org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory.AbsFactoryGeneratedObjectFactory; import org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory.AbsModuleGeneratedObjectFactory; import org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory.ConcreteModuleGeneratedObjectFactory; import org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory.GenericGeneratedObjectFactory; import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.FullyQualifiedName; import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.GeneratedObject; import org.opendaylight.controller.config.yangjmxgenerator.plugin.util.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; final class CodeWriter { private static final Logger LOG = LoggerFactory.getLogger(CodeWriter.class); private static final Optional<String> COPYRIGHT = StringUtil.loadCopyright(); public File writeSie(final ServiceInterfaceEntry sie, final File outputBaseDir) { try { GeneralInterfaceTemplate generalInterfaceTemplate = TemplateFactory.serviceInterfaceFromSie(sie); GeneratedObject go = new GenericGeneratedObjectFactory().toGeneratedObject(generalInterfaceTemplate, COPYRIGHT); return go.persist(outputBaseDir).get().getValue(); } catch (Exception e) { String message = "An error occurred during Service interface generating, sie:" + sie.getTypeName() + ", " + sie.getFullyQualifiedName(); LOG.error(message, e); throw new RuntimeException(message, e); } } public List<File> writeMbe(final ModuleMXBeanEntry mbe, final File targetBaseDir, final File mainBaseDir) { try { List<File> generatedFiles = Lists.newArrayList(); Map<GeneratedObject, Boolean /*overwrite*/> gos = new HashMap<>(); // generate mx interface and abstract factory // TOs Map<String, GeneralClassTemplate> tosFromMbe = TemplateFactory.tOsFromMbe(mbe); for (GeneralClassTemplate template : tosFromMbe.values()) { gos.put(new GenericGeneratedObjectFactory().toGeneratedObject(template, COPYRIGHT), true); } // MXBean interface GeneralInterfaceTemplate ifcTemplate = TemplateFactory.mXBeanInterfaceTemplateFromMbe(mbe); gos.put(new GenericGeneratedObjectFactory().toGeneratedObject(ifcTemplate, COPYRIGHT), true); // generate abstract factory gos.put(new AbsFactoryGeneratedObjectFactory().toGeneratedObject(mbe, COPYRIGHT), true); // generate abstract module gos.put(new AbsModuleGeneratedObjectFactory().toGeneratedObject(mbe, COPYRIGHT), true); // generate concrete factory StubFactoryTemplate concreteFactory = TemplateFactory.stubFactoryTemplateFromMbe(mbe); gos.put(new GenericGeneratedObjectFactory().toGeneratedObject(concreteFactory, COPYRIGHT), false); // generate concrete module gos.put(new ConcreteModuleGeneratedObjectFactory().toGeneratedObject(mbe, COPYRIGHT, Optional.<String>absent()), false); // write runtime bean MXBeans and registrators List<FtlTemplate> allFtlFiles = getRuntimeBeanFtlTemplates(mbe.getRuntimeBeans()); for (FtlTemplate template : allFtlFiles) { gos.put(new GenericGeneratedObjectFactory().toGeneratedObject(template, COPYRIGHT), true); } generatedFiles.addAll(persistGeneratedObjects(targetBaseDir, mainBaseDir, gos)); // purge nulls for (Iterator<File> it = generatedFiles.iterator(); it.hasNext();) { if (it.next() == null) { it.remove(); } } return generatedFiles; } catch (Exception e) { String message = "An error occurred during Module generating, mbe:" + mbe.getJavaNamePrefix(); LOG.error(message, e); throw new RuntimeException(message, e); } } private static List<File> persistGeneratedObjects(final File targetBaseDir, final File mainBaseDir, final Map<GeneratedObject, Boolean> gos) throws IOException { List<File> generatedFiles = new ArrayList<>(); for (Entry<GeneratedObject, Boolean> entry : gos.entrySet()) { boolean overwrite = entry.getValue(); File dst; if (overwrite) { dst = targetBaseDir; } else { dst = mainBaseDir; } Optional<Entry<FullyQualifiedName, File>> maybePersistEntry = entry.getKey().persist(dst, overwrite); if (maybePersistEntry.isPresent()) { generatedFiles.add(maybePersistEntry.get().getValue()); } } return generatedFiles; } private static List<FtlTemplate> getRuntimeBeanFtlTemplates(final Collection<RuntimeBeanEntry> runtimeBeans) { if (runtimeBeans.isEmpty()) { return Collections.emptyList(); } List<FtlTemplate> allFtlFiles = new ArrayList<>(); { // registrators Map<String, FtlTemplate> registratorNamesToFtls = RuntimeRegistratorFtlTemplate .create(RuntimeRegistratorFtlTemplate.findRoot(runtimeBeans)); allFtlFiles.addAll(registratorNamesToFtls.values()); } { // TOs, MXBean interfaces for (RuntimeBeanEntry runtimeBeanEntry : runtimeBeans) { Collection<FtlTemplate> ftlFiles = TemplateFactory.getTOAndMXInterfaceFtlFiles(runtimeBeanEntry) .values(); allFtlFiles.addAll(ftlFiles); } } return allFtlFiles; } }