package multimonster.common.media; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Date; import java.util.Hashtable; import multimonster.common.media.Duration; import multimonster.common.media.MetaData; /** * A MetaDataAccess is concrete implementation of the IMetaData interface. It * combines IMetaData interfaces. In Order to add a new MetaDataProperty to this * class simply add a private static field like : private static Object[] * titleProperty = new Object[] { "Title", String.class }; to this class . A * Reflection based algorithm checks all fiels in an static initializer. * Therefor the property is available in the getKeys() and getValueTypes() * methods; * * * * @author Frank M�ller * */ public class MetaDataAccess implements IMetaData { private static Object[] titleProperty = new Object[] { "Title", String.class }; private static Object[] languageProperty = new Object[] { "Language", String.class }; private static Object[] durationProperty = new Object[] { "Duration", Duration.class }; private static Object[] dateProperty = new Object[] { "DateOfRelease", Date.class }; private static Object[] outlineProperty = new Object[] { "Outline", String.class }; private static Object[] coloredProperty = new Object[] { "Colored", Boolean.class }; private static Object[] ageRestrictionProperty = new Object[] { "AgeRestriction", Integer.class }; private static Object[] numOfFramesProperty = new Object[] { "NumberOfFrames", Integer.class }; private static String[] keys; private static Class[] types; private Hashtable values = new Hashtable(); /** * initializes the keys and types fields with MetaDataProperties using * reflection */ static { ArrayList tempkeys = new ArrayList(); ArrayList temptypes = new ArrayList(); Class c = MetaDataAccess.class; Field[] fields = c.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { if (Modifier.isStatic(fields[i].getModifiers())) { Class typeClass = fields[i].getType(); if (typeClass == Object[].class) { try { Object[] property = (Object[]) fields[i] .get(MetaDataAccess.class); tempkeys.add(property[0]); temptypes.add(property[1]); } catch (Exception e) { e.printStackTrace(); } } } } keys = new String[tempkeys.size()]; types = new Class[tempkeys.size()]; for (int lfv = 0; lfv < tempkeys.size(); lfv++) { keys[lfv] = (String) tempkeys.get(lfv); types[lfv] = (Class) temptypes.get(lfv); } } /** * Wraps a MetaDataObject in an MetaDataAccess Object * * @param metaData */ public MetaDataAccess(MetaData metaData) { //TODO remove Constructor this.setValue((String) titleProperty[0], metaData.getTitle()); this.setValue((String) languageProperty[0], metaData.getLanguage()); this.setValue((String) durationProperty[0], metaData.getDuration()); this.setValue((String) dateProperty[0], metaData.getDateOfRelease()); this.setValue((String) outlineProperty[0], metaData.getOutline()); this.setValue((String) coloredProperty[0], new Boolean(metaData .isColored())); this.setValue((String) ageRestrictionProperty[0], new Integer(metaData .getAgeRestriction())); this.setValue((String) numOfFramesProperty[0], new Integer(metaData .getNumOfFrames())); } /** * Constuct a empty MetaDataObject */ public MetaDataAccess() { } /** * @inheritDoc */ public String[] getKeys() { return keys; } /** * @inheritDoc */ public Class[] getValueTypes() { return types; } /** * @inheritDoc */ public Object getValue(String key) { boolean keyfound = false; for (int lfv = 0; lfv < keys.length; lfv++) { if (keys[lfv].equals(key)) { keyfound = true; break; } } if (!keyfound) { throw new IllegalStateException("Key " + key + " not allowed"); } return values.get(key); } /** * @inheritDoc */ public void setValue(String key, Object value) { boolean keyfound = false; int index = 0; for (int lfv = 0; lfv < keys.length; lfv++) { if (keys[lfv].equals(key)) { keyfound = true; index = lfv; break; } } if (!keyfound) { throw new IllegalStateException("Key " + key + " not allowed"); } if (value.getClass().isInstance((Class) types[index])) { throw new IllegalStateException("Value type " + value.getClass() + " not allowed. Must be " + types[index]); } this.values.put(key, value); } }