*/
package org.opendaylight.yangtools.sal.binding.generator.util;
-import javassist.CtClass;
-import javassist.CtMethod;
-import javassist.ClassPool;
-
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+import javassist.ClassClassPath;
import javassist.ClassPath;
+import javassist.ClassPool;
+import javassist.CtClass;
import javassist.CtField;
+import javassist.CtMethod;
+import javassist.LoaderClassPath;
import javassist.Modifier;
import javassist.NotFoundException;
-import javassist.LoaderClassPath;
-import javassist.ClassClassPath;
-
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
import org.eclipse.xtext.xbase.lib.Conversions;
import org.eclipse.xtext.xbase.lib.Exceptions;
import com.google.common.base.Preconditions;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.WeakHashMap;
-import java.util.Collections;
-
public class JavassistUtils {
-
private static final Logger LOG = LoggerFactory.getLogger(JavassistUtils.class);
- private final Map<ClassLoader, LoaderClassPath> loaderClassPaths = Collections
- .synchronizedMap(new WeakHashMap<ClassLoader, LoaderClassPath>());
- private ClassPool classPool;
+ private final Map<ClassLoader, ClassPath> loaderClassPaths = new WeakHashMap<>();
private final Lock lock = new ReentrantLock();
+ private final ClassPool classPool;
- public JavassistUtils(ClassPool pool) {
- classPool = pool;
+ public JavassistUtils(final ClassPool pool) {
+ classPool = Preconditions.checkNotNull(pool);
}
public Lock getLock() {
}
}
- public void implementMethodsFrom(CtClass target, CtClass source, MethodGenerator function1) {
+ public void implementMethodsFrom(final CtClass target, final CtClass source, final MethodGenerator function1) {
try {
for (CtMethod method : source.getMethods()) {
if (method.getDeclaringClass() == source) {
}
}
- public CtClass createClass(String fqn, ClassGenerator cls) {
+ public CtClass createClass(final String fqn, final ClassGenerator cls) {
CtClass target = classPool.makeClass(fqn);
cls.process(target);
return target;
}
- public CtClass createClass(String fqn, CtClass superInterface, ClassGenerator cls) {
+ public CtClass createClass(final String fqn, final CtClass superInterface, final ClassGenerator cls) {
CtClass target = classPool.makeClass(fqn);
implementsType(target, superInterface);
cls.process(target);
}
}
- public void appendClassLoaderIfMissing(ClassLoader loader) {
- if (loaderClassPaths.containsKey(loader)) {
- return;
+ public synchronized void appendClassLoaderIfMissing(final ClassLoader loader) {
+ // FIXME: this works as long as the ClassPool is not shared between instances of this class
+ // How is synchronization across multiple instances done? The ClassPool itself just
+ // keeps on adding the loaders and does not check for duplicates!
+ if (!loaderClassPaths.containsKey(loader)) {
+ final ClassPath ctLoader = new LoaderClassPath(loader);
+ classPool.appendClassPath(ctLoader);
+ loaderClassPaths.put(loader, ctLoader);
}
- ClassPath ctLoader = new LoaderClassPath(loader);
- classPool.appendClassPath(ctLoader);
}
- public void ensureClassLoader(Class<?> child) {
+ public void ensureClassLoader(final Class<?> child) {
appendClassLoaderIfMissing(child.getClassLoader());
}
}
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
-public class YangSchemaUtils {
-
+public final class YangSchemaUtils {
public static final String AUGMENT_IDENTIFIER = "augment-identifier";
-
- public YangSchemaUtils() {
+ private YangSchemaUtils() {
throw new UnsupportedOperationException("Helper class. Instantiation is prohibited");
}
-
- public static QName getAugmentationQName(AugmentationSchema augmentation) {
+ public static QName getAugmentationQName(final AugmentationSchema augmentation) {
checkNotNull(augmentation, "Augmentation must not be null.");
QName identifier = getAugmentationIdentifier(augmentation);
if(identifier != null) {
namespace = ((NamespaceRevisionAware) augmentation).getNamespace();
revision = ((NamespaceRevisionAware) augmentation).getRevision();
}
- if(namespace == null || revision == null)
- for(DataSchemaNode child : augmentation.getChildNodes()) {
- // Derive QName from child nodes
- if(!child.isAugmenting()) {
- namespace = child.getQName().getNamespace();
- revision = child.getQName().getRevision();
- break;
+ if(namespace == null || revision == null) {
+ for(DataSchemaNode child : augmentation.getChildNodes()) {
+ // Derive QName from child nodes
+ if(!child.isAugmenting()) {
+ namespace = child.getQName().getNamespace();
+ revision = child.getQName().getRevision();
+ break;
+ }
}
}
checkState(namespace != null, "Augmentation namespace must not be null");
return QName.create(namespace,revision, "foo_augment");
}
- public static QName getAugmentationIdentifier(AugmentationSchema augmentation) {
+ public static QName getAugmentationIdentifier(final AugmentationSchema augmentation) {
for(UnknownSchemaNode extension : augmentation.getUnknownSchemaNodes()) {
if(AUGMENT_IDENTIFIER.equals(extension.getNodeType().getLocalName())) {
return extension.getQName();
return null;
}
-
- public static TypeDefinition<?> findTypeDefinition(SchemaContext context, SchemaPath path) {
+ public static TypeDefinition<?> findTypeDefinition(final SchemaContext context, final SchemaPath path) {
List<QName> arguments = path.getPath();
QName first = arguments.get(0);
QName typeQName = arguments.get(arguments.size() -1);