From eb37a6515a279cce4d4cfda6ebf0eac576daec61 Mon Sep 17 00:00:00 2001 From: Jeremy Schroeder Date: Sun, 20 Oct 2013 21:28:15 -0400 Subject: [PATCH] Add PropertyParser --- .../java/net/aufdemrand/denizen/Denizen.java | 23 ++++- .../objects/properties/PropertyParser.java | 98 ++++++++++++++++++- 2 files changed, 117 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/aufdemrand/denizen/Denizen.java b/src/main/java/net/aufdemrand/denizen/Denizen.java index ac498e1b3a..aebac1759c 100644 --- a/src/main/java/net/aufdemrand/denizen/Denizen.java +++ b/src/main/java/net/aufdemrand/denizen/Denizen.java @@ -15,6 +15,7 @@ import net.aufdemrand.denizen.npc.traits.*; import net.aufdemrand.denizen.objects.*; import net.aufdemrand.denizen.objects.notable.NotableManager; +import net.aufdemrand.denizen.objects.properties.PropertyParser; import net.aufdemrand.denizen.scripts.*; import net.aufdemrand.denizen.scripts.commands.CommandRegistry; import net.aufdemrand.denizen.scripts.containers.core.ItemScriptHelper; @@ -103,6 +104,17 @@ public TriggerRegistry getTriggerRegistry() { } + /* + * Denizen Property Parser + */ + private PropertyParser propertyParser; + + private PropertyParser getPropertyParser() { + return propertyParser; + } + + + /* * Denizen Managers */ @@ -236,8 +248,6 @@ public void onEnable() { // Register CommandHandler with Citizens Depends.citizens.registerCommandClass(CommandHandler.class); - dB.echoDebug(DebugElement.Footer); - try { // Initialize the ObjectFetcher ObjectFetcher.registerWithObjectFetcher(dItem.class); // i@ @@ -268,8 +278,15 @@ public void onEnable() { // Initialize non-standard dMaterials dMaterial._initialize(); - // Fire the 'on Server Start' world event + // Initialize Property Parser + propertyParser = new PropertyParser(); + + dB.echoDebug(DebugElement.Footer); + + // TODO: Figure out why we need this ScriptHelper.reloadScripts(); + + // Fire the 'on Server Start' world event ws_helper.serverStartEvent(); } diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/PropertyParser.java b/src/main/java/net/aufdemrand/denizen/objects/properties/PropertyParser.java index 63b9eabf83..8668797f75 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/PropertyParser.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/PropertyParser.java @@ -1,9 +1,105 @@ package net.aufdemrand.denizen.objects.properties; -// TODO: Whatever this is! +import net.aufdemrand.denizen.objects.dEntity; +import net.aufdemrand.denizen.objects.dItem; +import net.aufdemrand.denizen.objects.dObject; +import net.aufdemrand.denizen.utilities.debugging.dB; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.*; public class PropertyParser { + public static String NONE = ""; + + // Keep track of which Property belongs to which dObject + static Map, List> properties + = new HashMap, List>(); + + // Keep track of the static 'describes' and 'getFrom' methods for each Property + static Map describes = new WeakHashMap(); + static Map getFrom = new WeakHashMap(); + + + public PropertyParser() { + // register core dEntity properties + registerProperty(EntityProfession.class, dEntity.class); + registerProperty(EntityAge.class, dEntity.class); + registerProperty(EntityFramed.class, dEntity.class); + registerProperty(EntityInfected.class, dEntity.class); + + // register core dItem properties + registerProperty(ItemColor.class, dItem.class); + + } + + public void registerProperty(Class property, Class object) { + // Add property to the dObject's Properties list + List prop_list; + + // Get current properties list, or make a new one + if (properties.containsKey(object)) + prop_list = properties.get(object); + else prop_list = new ArrayList(); + + // Add this property to the list + prop_list.add(property); + + // Put the list back into the Map + properties.put(object, prop_list); + + // Cache methods used for fetching new properties + try { + describes.put(property, property.getMethod("describes", dObject.class)); + getFrom.put(property, property.getMethod("getFrom", dObject.class)); + + } catch (NoSuchMethodException e) { + dB.echoError("Unable to register property '" + property.getSimpleName() + "'!"); + } + + } + + public static String getPropertiesString(dObject object) { + StringBuilder prop_string = new StringBuilder(); + + // Iterate through each property associated with the dObject type, invoke 'describes' + // and if 'true', add property string from the property to the prop_string. + try { + for (Class property : properties.get(object.getClass())) { + if ((Boolean) describes.get(property).invoke(null, object)) + prop_string.append(((Property) getFrom.get(property).invoke(null, object)).getPropertyString()); + } + + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + // Return the list of properties + return prop_string.toString(); + } + + public static List getProperties(dObject object) { + List props = new ArrayList(); + + try { + for (Class property : properties.get(object.getClass())) { + if ((Boolean) describes.get(property).invoke(null, object)) + props.add((Property) getFrom.get(property).invoke(null, object)); + } + + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + return props; + + } + }