package org.beanlet.impl; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicReference; import org.beanlet.BeanletMetaData; import org.beanlet.MetaData; import org.beanlet.common.*; import org.jargo.ComponentMetaData; public final class BeanletMetaDataImpl<T> extends AbstractMetaData implements BeanletMetaData<T> { private final ComponentMetaData<T> componentMetaData; private final AtomicReference<List<MetaData>> ref; public static BeanletMetaData<?> instance(ComponentMetaData<?> metaData) { @SuppressWarnings("unchecked") ComponentMetaData<Object> m = (ComponentMetaData<Object>) metaData; return new BeanletMetaDataImpl<Object>(m); } public BeanletMetaDataImpl(ComponentMetaData<T> componentMetaData) { super(componentMetaData.getType(), componentMetaData.getDescription()); this.componentMetaData = componentMetaData; this.ref = new AtomicReference<List<MetaData>>(); } public String getBeanletName() { return componentMetaData.getComponentName(); } public ClassLoader getClassLoader() { return componentMetaData.getComponentUnit().getClassLoader(); } public Class<T> getType() { Class<T> type = componentMetaData.getType(); return type; } public List<Class<?>> getInterfaces() { return componentMetaData.getInterfaces(); } public boolean isProxy() { return componentMetaData.isProxy(); } public boolean isVanilla() { return componentMetaData.isVanilla(); } public boolean isStatic() { return componentMetaData.isStatic(); } public List<MetaData> getMetaData() { List<MetaData> metaData = ref.get(); if (metaData == null) { metaData = new ArrayList<MetaData>(); for (org.jargo.MetaData m : componentMetaData.getMetaData()) { if (m instanceof MetaData) { metaData.add((MetaData) m); } } metaData = Collections.unmodifiableList(metaData); ref.set(metaData); } return metaData; } public boolean isMetaDataPresent(Class<? extends MetaData> metaDataType) { boolean present = false; for(MetaData m : getMetaData()) { if (metaDataType.isAssignableFrom(m.getClass())) { present = true; break; } } return present; } public <M extends MetaData> List<M> getMetaData(Class<M> metaDataType) { List<M> list = new ArrayList<M>(); for(MetaData m : getMetaData()) { if (metaDataType.isAssignableFrom(m.getClass())) { @SuppressWarnings("unchecked") M t = (M) m; list.add(t); } } return list; } }