X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fconfig%2Fyang-jmx-generator-plugin%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfig%2Fyangjmxgenerator%2Fplugin%2Fgofactory%2FAbsFactoryGeneratedObjectFactory.groovy;fp=opendaylight%2Fconfig%2Fyang-jmx-generator-plugin%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfig%2Fyangjmxgenerator%2Fplugin%2Fgofactory%2FAbsFactoryGeneratedObjectFactory.groovy;h=baff88c8f30e178f13df04dae60cd5d78f87cf4c;hp=0000000000000000000000000000000000000000;hb=cd0a18d48f5e8b6ff208b6633e05ee003979218e;hpb=ef6bd770f1366f84fdbc7ab19fa649953b36197b diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/AbsFactoryGeneratedObjectFactory.groovy b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/AbsFactoryGeneratedObjectFactory.groovy new file mode 100644 index 0000000000..baff88c8f3 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/AbsFactoryGeneratedObjectFactory.groovy @@ -0,0 +1,168 @@ +/* + * 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.gofactory +import com.google.common.base.Optional +import org.opendaylight.controller.config.api.DependencyResolver +import org.opendaylight.controller.config.api.DynamicMBeanWithInstance +import org.opendaylight.controller.config.api.ModuleIdentifier +import org.opendaylight.controller.config.api.annotations.AbstractServiceInterface +import org.opendaylight.controller.config.api.annotations.Description +import org.opendaylight.controller.config.spi.Module +import org.opendaylight.controller.config.spi.ModuleFactory +import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.AbstractFactoryTemplate +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.TemplateFactory +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Annotation +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Field +import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.* +import org.opendaylight.yangtools.yang.common.QName +import org.osgi.framework.BundleContext + +public class AbsFactoryGeneratedObjectFactory { + + public GeneratedObject toGeneratedObject(ModuleMXBeanEntry mbe, Optional copyright) { + FullyQualifiedName absFactoryFQN = new FullyQualifiedName(mbe.packageName, mbe.abstractFactoryName) + FullyQualifiedName moduleFQN = new FullyQualifiedName(mbe.packageName, mbe.stubModuleName) + Optional classJavaDoc = Optional.fromNullable(mbe.getNullableDescription()) + + AbstractFactoryTemplate abstractFactoryTemplate = TemplateFactory.abstractFactoryTemplateFromMbe(mbe) + Optional header = abstractFactoryTemplate.headerString; + List providedServices = mbe.providedServices.keySet().collect { + FullyQualifiedName.fromString(it) + } + + + return toGeneratedObject(absFactoryFQN, copyright, + header, classJavaDoc, mbe.yangModuleQName, + mbe.globallyUniqueName, + providedServices, + moduleFQN, + abstractFactoryTemplate.fields) + } + + public GeneratedObject toGeneratedObject(FullyQualifiedName absFactoryFQN, Optional copyright, + Optional header, Optional classJavaDoc, QName yangModuleQName, + String globallyUniqueName, + List providedServices, + FullyQualifiedName moduleFQN, + List moduleFields) { + JavaFileInputBuilder b = new JavaFileInputBuilder() + Annotation moduleQNameAnnotation = Annotation.createModuleQNameANnotation(yangModuleQName) + b.addClassAnnotation(moduleQNameAnnotation) + + b.setFqn(absFactoryFQN) + b.setTypeName(TypeName.absClassType) + + b.setCopyright(copyright); + b.setHeader(header); + b.setClassJavaDoc(classJavaDoc); + b.addImplementsFQN(new FullyQualifiedName(ModuleFactory)) + if (classJavaDoc.isPresent()) { + b.addClassAnnotation("@${Description.canonicalName}(value=\"${classJavaDoc.get()}\")") + } + + b.addToBody("public static final java.lang.String NAME = \"${globallyUniqueName}\";") + b.addToBody("private static final java.util.Set> serviceIfcs;") + + b.addToBody("@Override\n public final String getImplementationName() { \n return NAME; \n}") + + b.addToBody(getServiceIfcsInitialization(providedServices)) + + // createModule + b.addToBody(""" + @Override + public ${Module.canonicalName} createModule(String instanceName, ${DependencyResolver.canonicalName} dependencyResolver, ${BundleContext.canonicalName} bundleContext) { + return instantiateModule(instanceName, dependencyResolver, bundleContext); + } + """) + + b.addToBody(getCreateModule(moduleFQN, moduleFields)) + + b.addToBody(""" + public ${moduleFQN} instantiateModule(String instanceName, ${DependencyResolver.canonicalName} dependencyResolver, ${moduleFQN} oldModule, ${AutoCloseable.canonicalName} oldInstance, ${BundleContext.canonicalName} bundleContext) { + return new ${moduleFQN}(new ${ModuleIdentifier.canonicalName}(NAME, instanceName), dependencyResolver, oldModule, oldInstance); + } + """) + + b.addToBody(""" + public ${moduleFQN} instantiateModule(String instanceName, ${DependencyResolver.canonicalName} dependencyResolver, ${BundleContext.canonicalName} bundleContext) { + return new ${moduleFQN}(new ${ModuleIdentifier.canonicalName}(NAME, instanceName), dependencyResolver); + } + """) + + b.addToBody(""" + public ${moduleFQN} handleChangedClass(${DynamicMBeanWithInstance.canonicalName} old) throws Exception { + throw new UnsupportedOperationException("Class reloading is not supported"); + } + """) + + b.addToBody(""" + @Override + public java.util.Set<${moduleFQN}> getDefaultModules(org.opendaylight.controller.config.api.DependencyResolverFactory dependencyResolverFactory, ${BundleContext.canonicalName} bundleContext) { + return new java.util.HashSet<${moduleFQN}>(); + } + """) + + return new GeneratedObjectBuilder(b.build()).toGeneratedObject() + } + + private static String getCreateModule(FullyQualifiedName moduleFQN, List moduleFields) { + String result = """ + @Override + public ${Module.canonicalName} createModule(String instanceName, ${DependencyResolver.canonicalName} dependencyResolver, ${DynamicMBeanWithInstance.canonicalName} old, ${BundleContext.canonicalName} bundleContext) throws Exception { + ${moduleFQN} oldModule = null; + try { + oldModule = (${moduleFQN}) old.getModule(); + } catch(Exception e) { + return handleChangedClass(old); + } + ${moduleFQN} module = instantiateModule(instanceName, dependencyResolver, oldModule, old.getInstance(), bundleContext); + """ + result += moduleFields.collect{"module.set${it.name}(oldModule.get${it.name}());"}.join("\n") + result += """ + return module; + } + """ + return result + } + + private static String getServiceIfcsInitialization(List providedServices) { + String generic = "Class" + + String result = """static { + java.util.Set<${generic}> serviceIfcs2 = new java.util.HashSet<${generic}>(); + """ + result += providedServices.collect{"serviceIfcs2.add(${it}.class);"}.join("\n") + result += """serviceIfcs = java.util.Collections.unmodifiableSet(serviceIfcs2); + } + """ + + // add isModuleImplementingServiceInterface and getImplementedServiceIntefaces methods + + result += """ + @Override + public final boolean isModuleImplementingServiceInterface(Class serviceInterface) { + for (Class ifc: serviceIfcs) { + if (serviceInterface.isAssignableFrom(ifc)){ + return true; + } + } + return false; + } + + @Override + public java.util.Set> getImplementedServiceIntefaces() { + return serviceIfcs; + } + """ + + return result + } + +}