package org.terasology.entitySystem.metadata; import com.google.common.collect.Maps; import org.terasology.entitySystem.Component; import java.lang.reflect.InvocationTargetException; import java.util.Locale; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; /** * @author Immortius <immortius@gmail.com> */ public final class ComponentMetadata<T extends Component> { private static final Logger logger = Logger.getLogger(ComponentMetadata.class.getName()); private Map<String, FieldMetadata> fields = Maps.newHashMap(); private Class<T> clazz; public ComponentMetadata(Class<T> componentClass) { this.clazz = componentClass; } public Class<T> getType() { return clazz; } public void addField(FieldMetadata fieldInfo) { fields.put(fieldInfo.getName().toLowerCase(Locale.ENGLISH), fieldInfo); } public FieldMetadata getField(String name) { return fields.get(name.toLowerCase(Locale.ENGLISH)); } public Iterable<? extends FieldMetadata> iterateFields() { return fields.values(); } public T newInstance() { try { return clazz.newInstance(); } catch (InstantiationException e) { logger.log(Level.SEVERE, "Exception instantiating component type: " + clazz, e); } catch (IllegalAccessException e) { logger.log(Level.SEVERE, "Exception instantiating component type: " + clazz, e); } return null; } public T clone(T component) { try { T result = clazz.newInstance(); for (FieldMetadata field : fields.values()) { field.setValue(result, field.copy(field.getValue(component))); } return result; } catch (InstantiationException e) { logger.log(Level.SEVERE, "Exception during serializing component type: " + clazz, e); } catch (IllegalAccessException e) { logger.log(Level.SEVERE, "Exception during serializing component type: " + clazz, e); } catch (InvocationTargetException e) { logger.log(Level.SEVERE, "Exception during serializing component type: " + clazz, e); } return null; } }