From 42db0d636f67d30fdef7cfc9d4b4e61644f3ebc2 Mon Sep 17 00:00:00 2001 From: Harald Wolff Date: Tue, 6 Sep 2016 11:52:42 +0200 Subject: [PATCH] org.hwo.configuration neu --- .../configuration/ConfigurableAttribute.java | 8 + .../hwo/configuration/ConfigurableObject.java | 10 ++ .../configuration/ConfigurableObjects.java | 151 ++++++++++++++++++ .../configuration/ConfigurationTrigger.java | 10 ++ .../configuration/IConfigurableObject.java | 8 + 5 files changed, 187 insertions(+) create mode 100644 src/org/hwo/configuration/ConfigurableAttribute.java create mode 100644 src/org/hwo/configuration/ConfigurableObject.java create mode 100644 src/org/hwo/configuration/ConfigurableObjects.java create mode 100644 src/org/hwo/configuration/ConfigurationTrigger.java create mode 100644 src/org/hwo/configuration/IConfigurableObject.java diff --git a/src/org/hwo/configuration/ConfigurableAttribute.java b/src/org/hwo/configuration/ConfigurableAttribute.java new file mode 100644 index 0000000..66112af --- /dev/null +++ b/src/org/hwo/configuration/ConfigurableAttribute.java @@ -0,0 +1,8 @@ +package org.hwo.configuration; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface ConfigurableAttribute { +} diff --git a/src/org/hwo/configuration/ConfigurableObject.java b/src/org/hwo/configuration/ConfigurableObject.java new file mode 100644 index 0000000..4358fa1 --- /dev/null +++ b/src/org/hwo/configuration/ConfigurableObject.java @@ -0,0 +1,10 @@ +package org.hwo.configuration; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +public @interface ConfigurableObject { + +} diff --git a/src/org/hwo/configuration/ConfigurableObjects.java b/src/org/hwo/configuration/ConfigurableObjects.java new file mode 100644 index 0000000..b4a113c --- /dev/null +++ b/src/org/hwo/configuration/ConfigurableObjects.java @@ -0,0 +1,151 @@ +package org.hwo.configuration; + +import java.io.ObjectInputStream.GetField; +import java.lang.reflect.Field; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.LinkedList; +import java.util.StringTokenizer; + +public class ConfigurableObjects { + + public static Field[] getConfigurableAttributes(Class clazz){ + LinkedList cfl = new LinkedList(); + + if (clazz.getAnnotation(ConfigurableObject.class)!=null){ + Field[] fields = clazz.getDeclaredFields(); + for (Field f: fields){ + if (f.getAnnotation(ConfigurableAttribute.class)!=null){ + f.setAccessible(true); + cfl.add(f); + } + } + + if (clazz.getSuperclass()!=null){ + for (Field f:getConfigurableAttributes(clazz.getSuperclass())) + cfl.add(f); + } + + } + + return cfl.toArray(new Field[0]); + } + + public static Field[] getConfigurableAttributes(Object o){ + return getConfigurableAttributes(o.getClass()); + } + + public static String getValueAsString(Object value){ + String s = value.toString(); + + s = s.replaceAll("\\\\","\\\\\\\\"); + s = s.replaceAll("\\;", "\\\\;"); + s = s.replaceAll("\\|", "\\\\|"); + + return s; + } + + public static Object getValueFromString(String value,Class type) throws ClassCastException{ + if (type.equals(String.class)) + return new String(value); + if (type.equals(Integer.class)) + return Integer.parseInt(value); + if (type.equals(Float.class)) + return Float.parseFloat(value); + if (type.equals(Double.class)) + return Double.parseDouble(value); + if (type.equals(Boolean.class)) + return Boolean.parseBoolean(value); + + if (type.isEnum()){ + for (Object e:type.getEnumConstants()){ + if (e.toString().equals(value)) + return e; + } + } + + + + + throw new ClassCastException(); + } + + public static String getConfiguration(Object o){ + if (IConfigurableObject.class.isInstance(o)) + return ((IConfigurableObject)o).getConfiguration(); + + Field[] fields = getConfigurableAttributes(o); + Hashtable values = new Hashtable(); + + for (Field f: fields){ + try { + String sv = getValueAsString(f.get(o)); + if (sv != null){ + values.put(f.getName(), sv); + } + + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + StringBuilder sb = new StringBuilder(); + + Enumeration keys = values.keys(); + while (keys.hasMoreElements()){ + String name = keys.nextElement(); + sb.append(String.format("%s=%s", name, values.get(name))); + if (keys.hasMoreElements()) + sb.append(";"); + } + return sb.toString(); + } + + public static void setConfiguration(Object o,String configuration){ + + StringTokenizer st = new StringTokenizer(configuration, ";"); + LinkedList l = new LinkedList(); + + while (st.hasMoreTokens()){ + String t = st.nextToken(); + if ((l.peekLast()!=null)&&(l.peekLast().endsWith("\\"))){ + String last = l.removeLast(); + l.add(last.substring(0, last.length()-1) + ";" + t); + } else { + l.addFirst(t); + } + } + + Hashtable hash = new Hashtable(); + + for (int n=0;n