package org.tynamo.descriptor; import java.io.Serializable; import java.lang.reflect.InvocationTargetException; import java.util.Hashtable; import java.util.Map; import org.apache.commons.beanutils.BeanUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.tynamo.descriptor.extension.DescriptorExtension; public class TynamoDescriptor implements Descriptor, Serializable { protected static final Logger LOGGER = LoggerFactory.getLogger(TynamoDescriptor.class); protected Class beanType; private boolean nonVisual; Map<String, DescriptorExtension> extensions = new Hashtable<String, DescriptorExtension>(); /** * @param dto */ public TynamoDescriptor(TynamoDescriptor dto) { try { BeanUtils.copyProperties(this, dto); } catch (IllegalAccessException e) { LOGGER.error(e.getMessage(), e); } catch (InvocationTargetException e) { LOGGER.error(e.getMessage(), e); } catch (Exception e) { LOGGER.error(e.toString(), e); } } public TynamoDescriptor(Descriptor descriptor) { try { BeanUtils.copyProperties(this, descriptor); copyExtensionsFrom(descriptor); } catch (IllegalAccessException e) { LOGGER.error(e.getMessage(), e); } catch (InvocationTargetException e) { LOGGER.error(e.getMessage(), e); } catch (Exception e) { LOGGER.error(e.toString(), e); } } public TynamoDescriptor(Class beanType) { this.beanType = beanType; } @Override public Object clone() { return new TynamoDescriptor(this); } public void copyFrom(Descriptor descriptor) { try { BeanUtils.copyProperties(this, descriptor); copyExtensionsFrom(descriptor); } catch (IllegalAccessException e) { LOGGER.error(e.getMessage(), e); } catch (InvocationTargetException e) { LOGGER.error(e.getMessage(), e); } catch (Exception e) { LOGGER.error(e.toString(), e); } } public void copyExtensionsFrom(Descriptor descriptor) { Map<String, DescriptorExtension> exts = descriptor.getExtensions(); for (Map.Entry<String, DescriptorExtension> entry : exts.entrySet()) { String key = entry.getKey(); DescriptorExtension value = entry.getValue(); try { this.addExtension(key, (DescriptorExtension) BeanUtils.cloneBean(value)); } catch (Exception e) { //@todo fix clone methods. } } } public boolean isNonVisual() { return nonVisual; } public void setNonVisual(boolean nonVisual) { this.nonVisual = nonVisual; } /** * @deprecated: Use getBeanType instead */ @Deprecated public Class getType() { return getBeanType(); } /** * Returns the type of bean this descriptor provides metadata for. */ public Class getBeanType() { return beanType; } public void setBeanType(Class beanType) { this.beanType = beanType; } /** * Keye is property name preceded by package name */ public boolean supportsExtension(String keye) { return getExtension(keye) != null; } public boolean supportsExtension(Class extensionType) { return supportsExtension(extensionType.getName()); } /** * Keye is property name preceded by package name */ public DescriptorExtension getExtension(String key) { return extensions.get(key); } /** * Key is property name preceded by package name */ public void addExtension(String key, DescriptorExtension extension) { extensions.put(key, extension); } public void addExtension(Class extensionType, DescriptorExtension extension) { addExtension(extensionType.getName(), extension); } /** * Key is property name preceded by package name */ public void removeExtension(String key) { extensions.remove(key); } public void removeExtension(Class extensionType) { removeExtension(extensionType.getName()); } public <E extends DescriptorExtension> E getExtension(Class<E> extensionType) { return (E) extensions.get(extensionType.getName()); } /** * This getter method is here just to allow clone(), copyFrom() and * BeanUtils.copyProperties(this, descriptor); to work correctly */ public Map<String, DescriptorExtension> getExtensions() { return extensions; } /** * This setter method is here just to allow clone(), copyFrom() and * BeanUtils.copyProperties(this, descriptor); to work correctly */ public void setExtensions(Map<String, DescriptorExtension> extensions) { this.extensions = extensions; } }