User: mulder  
  Date: 00/07/03 17:10:04

  Added:       src/main/org/jboss/metadata/aggregate AggregateBean.java
                        AggregateContainer.java AggregateField.java
                        AggregateMetaData.java AggregateMethod.java
                        AggregateServer.java
  Log:
  Added new metadata classes to CVS.  Currently read-only (reads XML files
  written by EJX).  We plan to add GUI and write support for EJX.
  
  Revision  Changes    Path
  1.1                  jboss/src/main/org/jboss/metadata/aggregate/AggregateBean.java
  
  Index: AggregateBean.java
  ===================================================================
  package org.jboss.metadata.aggregate;
  
  import java.lang.reflect.*;
  import java.util.*;
  import org.jboss.metadata.*;
  
  public class AggregateBean extends AggregateMetaData implements BeanMetaData {
      private AggregateContainer container;
      private AggregateMethod[] methods;
      private AggregateMethod[] homeMethods;
      private AggregateField[] fields;
      private String name;
  
      public AggregateBean(String name) {
          this.name = name;
          methods = homeMethods = new AggregateMethod[0];
          container = new AggregateContainer();
          fields = new AggregateField[0];
      }
  
      public AggregateBean(String name, BeanMetaData[] plugins) {
          this(name);
          for(int i=0; i<plugins.length; i++)
              addPlugin(plugins[i]);
      }
  
      public void addPlugin(BeanMetaData plugin) {
          super.addPlugin(plugin);
          methods = mergeMethods(plugin.getMethods(), methods, plugin.getManager());
          homeMethods = mergeMethods(plugin.getHomeMethods(), homeMethods, 
plugin.getManager());
          fields = mergeFields(plugin.getFields(), fields, plugin.getManager());
          container.addPlugin(plugin.getContainer());
      }
  
      private static MethodMetaData getMethod(Set source, String name, Class[] args) {
          Iterator it = source.iterator();
          while(it.hasNext()) {
              MethodMetaData mmd = (MethodMetaData)it.next();
              if(mmd.getName().equals(name) &&
                 paramsMatch(mmd.getParameterTypes(), args))
                  return mmd;
          }
          throw new IllegalArgumentException();
      }
  
      private static FieldMetaData getField(Set source, String name) {
          Iterator it = source.iterator();
          while(it.hasNext()) {
              FieldMetaData fmd = (FieldMetaData)it.next();
              if(fmd.getName().equals(name))
                  return fmd;
          }
          throw new IllegalArgumentException();
      }
  
      private static AggregateMethod[] mergeMethods(Set incoming, AggregateMethod[] 
existing, MetaDataPlugin manager) {
          for(int i=0; i<existing.length; i++) {
              String name = existing[i].getName();
              Class[] args = existing[i].getParameterTypes();
              try {
                  MethodMetaData mmd = getMethod(incoming, name, args);
                  existing[i].addPlugin(mmd);
                  incoming.remove(mmd);
              } catch(IllegalArgumentException e) {
                  try {
                      Class cls = manager.getMethodClass();
                      Object instance = cls.newInstance();
                      Method m = cls.getMethod("setName", new Class[]{String.class});
                      m.invoke(instance, new Object[]{name});
                      m = cls.getMethod("setParameterTypes", new 
Class[]{Class[].class});
                      m.invoke(instance, new Object[]{args});
                      existing[i].addPlugin((MethodMetaData)instance);
                  } catch(Exception e2) {e2.printStackTrace();}
              }
          }
          Vector v = new Vector(Arrays.asList(existing));
          for(Iterator it = incoming.iterator(); it.hasNext();) {
              MethodMetaData mmd = (MethodMetaData)it.next();
              String name = mmd.getName();
              Class[] args = mmd.getParameterTypes();
              MethodMetaData[] list = new 
MethodMetaData[MetaDataFactory.getPluginCount()];
              for(int i=0; i<list.length; i++) {
                  Class cls = MetaDataFactory.getPlugin(i).getMethodClass();
                  if(cls.equals(mmd.getClass()))
                      list[i] = mmd;
                  else
                      try {
                          list[i] = (MethodMetaData)cls.newInstance();
                          Method m = cls.getMethod("setName", new 
Class[]{String.class});
                          m.invoke(list[i], new Object[]{name});
                          m = cls.getMethod("setParameterTypes", new 
Class[]{Class[].class});
                          m.invoke(list[i], new Object[]{args});
                      } catch(Exception e) {e.printStackTrace();}
              }
              v.addElement(new AggregateMethod(name, args, list));
          }
          if(v.size() > existing.length)
              return (AggregateMethod[])v.toArray(new AggregateMethod[v.size()]);
          else
              return existing;
      }
  
      private static AggregateField[] mergeFields(Set incoming, AggregateField[] 
existing, MetaDataPlugin manager) {
          for(int i=0; i<existing.length; i++) {
              String name = existing[i].getName();
              try {
                  FieldMetaData fmd = getField(incoming, name);
                  existing[i].addPlugin(fmd);
                  incoming.remove(fmd);
              } catch(IllegalArgumentException e) {
                  try {
                      Class cls = manager.getFieldClass();
                      Object instance = cls.newInstance();
                      Method m = cls.getMethod("setName", new Class[]{String.class});
                      m.invoke(instance, new Object[]{name});
                      existing[i].addPlugin((FieldMetaData)instance);
                  } catch(Exception e2) {e2.printStackTrace();}
              }
          }
          Vector v = new Vector(Arrays.asList(existing));
          for(Iterator it = incoming.iterator(); it.hasNext();) {
              FieldMetaData fmd = (FieldMetaData)it.next();
              String name = fmd.getName();
              FieldMetaData[] list = new 
FieldMetaData[MetaDataFactory.getPluginCount()];
              for(int i=0; i<list.length; i++) {
                  Class cls = MetaDataFactory.getPlugin(i).getFieldClass();
                  if(cls.equals(fmd.getClass()))
                      list[i] = fmd;
                  else
                      try {
                          list[i] = (FieldMetaData)cls.newInstance();
                          Method m = cls.getMethod("setName", new 
Class[]{String.class});
                          m.invoke(list[i], new Object[]{name});
                      } catch(Exception e) {e.printStackTrace();}
              }
              v.addElement(new AggregateField(name, list));
          }
          if(v.size() > existing.length)
              return (AggregateField[])v.toArray(new AggregateField[v.size()]);
          else
              return existing;
      }
  
      public MethodMetaData getMethod(String name, Class[] args) {
          for(int i=0; i<methods.length; i++)
              if(methods[i].getName().equals(name) &&
                 paramsMatch(methods[i].getParameterTypes(), args))
                  return methods[i];
          throw new IllegalArgumentException("Method not found");
      }
  
      public MethodMetaData getHomeMethod(String name, Class[] args) {
          for(int i=0; i<homeMethods.length; i++)
              if(homeMethods[i].getName().equals(name) &&
                 paramsMatch(homeMethods[i].getParameterTypes(), args))
                  return methods[i];
          throw new IllegalArgumentException("Method not found");
      }
  
      public FieldMetaData getField(String name) {
          for(int i=0; i<fields.length; i++)
              if(fields[i].getName().equals(name))
                  return fields[i];
          throw new IllegalArgumentException("Field not found");
      }
  
      public Set getMethods() {
          return new HashSet(Arrays.asList(methods));
      }
  
      public Set getHomeMethods() {
          return new HashSet(Arrays.asList(homeMethods));
      }
  
      public Set getFields() {
          return new HashSet(Arrays.asList(fields));
      }
  
      public String getName() {
          return name;
      }
  
      public ContainerMetaData getContainer() {
          return container;
      }
  
      private static boolean paramsMatch(Class[] one, Class[] two) {
          if(one.length != two.length)
              return false;
          for(int i=0; i<one.length; i++)
              if(!one[i].equals(two[i]))
                  return false;
          return true;
      }
  }
  
  
  1.1                  
jboss/src/main/org/jboss/metadata/aggregate/AggregateContainer.java
  
  Index: AggregateContainer.java
  ===================================================================
  package org.jboss.metadata.aggregate;
  
  import org.jboss.metadata.*;
  import java.util.*;
  
  public class AggregateContainer extends AggregateMetaData implements 
ContainerMetaData {
      public AggregateContainer() {
          super();
      }
  
      public AggregateContainer(ContainerMetaData[] plugins) {
          super(plugins);
      }
  }
  
  
  1.1                  jboss/src/main/org/jboss/metadata/aggregate/AggregateField.java
  
  Index: AggregateField.java
  ===================================================================
  package org.jboss.metadata.aggregate;
  
  import org.jboss.metadata.*;
  
  public class AggregateField extends AggregateMetaData implements FieldMetaData {
      private String name;
  
      public AggregateField(String name) {
          this.name = name;
      }
  
      public AggregateField(String name, FieldMetaData[] plugins) {
          super(plugins);
          this.name = name;
      }
  
      public void addPlugin(FieldMetaData plugin) {
          super.addPlugin(plugin);
      }
  
      public String getName() {
          return name;
      }
  }
  
  
  1.1                  
jboss/src/main/org/jboss/metadata/aggregate/AggregateMetaData.java
  
  Index: AggregateMetaData.java
  ===================================================================
  package org.jboss.metadata.aggregate;
  
  import org.jboss.metadata.*;
  import java.util.*;
  
  public class AggregateMetaData implements MetaData {
      MetaData[] plugins;
  
      public AggregateMetaData() {
          plugins = new MetaData[0];
      }
  
      public AggregateMetaData(MetaData[] plugins) {
          this.plugins = plugins;
          validate();
      }
  
      protected void addPlugin(MetaData plugin) {
          for(int i=0; i<plugins.length; i++) {
              if(plugins[i].getManager().equals(plugin.getManager())) {
                  plugins[i] = plugin;
                  return;
              }
          }
          LinkedList list = new LinkedList(Arrays.asList(plugins));
          list.add(plugin);
          plugins = (MetaData[])list.toArray(new MetaData[list.size()]);
          validate();
      }
  
      public boolean hasProperty(String name) {
          for(int i=0; i<plugins.length; i++)
              if(plugins[i].hasProperty(name))
                  return true;
          return false;
      }
  
      public Object getProperty(String name) {
          for(int i=0; i<plugins.length; i++)
              if(plugins[i].hasProperty(name))
                  return plugins[i].getProperty(name);
          throw new IllegalArgumentException("No such property '"+name+"'");
      }
  
      public void setProperty(String name, Object value) {
          for(int i=0; i<plugins.length; i++)
              if(plugins[i].hasProperty(name)) {
                  plugins[i].setProperty(name, value);
                  return;
              }
          throw new IllegalArgumentException("No such property '"+name+"'");
      }
  
      public String[] getPropertyNames() {
          String[][] names = new String[plugins.length][];
          int total = 0;
          for(int i=0; i<plugins.length; i++) {
              names[i] = plugins[i].getPropertyNames();
              total += names[i].length;
          }
          String[] result = new String[total];
          total = 0;
          for(int i=0; i<names.length; i++)
              for(int j=0; j<names[i].length; j++)
                  result[total++] = names[i][j];
          return result;
      }
  
      public MetaDataPlugin getManager() {
          return null;
      }
  
      public void clear() {
          for(int i=0; i<plugins.length; i++)
              plugins[i].clear();
      }
  
      public boolean containsKey(Object key) {
          for(int i=0; i<plugins.length; i++)
              if(plugins[i].containsKey(key))
                  return true;
          return false;
      }
  
      public boolean containsValue(Object value) {
          for(int i=0; i<plugins.length; i++)
              if(plugins[i].containsValue(value))
                  return true;
          return false;
      }
  
      public Set entrySet() {
          HashSet set = new HashSet();
          for(int i=0; i<plugins.length; i++)
              set.addAll(plugins[i].entrySet());
          return set;
      }
  
      public Object get(Object key) {
          return getProperty((String)key);
      }
  
      public boolean isEmpty() {
          return plugins.length > 0;
      }
  
      public Set keySet() {
          HashSet set = new HashSet();
          for(int i=0; i<plugins.length; i++)
              set.addAll(plugins[i].keySet());
          return set;
      }
  
      public Object put(Object key, Object value) {
          for(int i=0; i<plugins.length; i++)
              if(plugins[i].containsKey(key))
                  return plugins[i].put(key, value);
          throw new IllegalArgumentException("No such property '"+key+"'");
      }
  
      public void putAll(Map stuff) {
          Iterator it = stuff.keySet().iterator();
          while(it.hasNext()) {
              Object key = it.next();
              setProperty((String)key, stuff.get(key));
          }
      }
  
      public Object remove(Object key) {
          for(int i=0; i<plugins.length; i++)
              if(plugins[i].containsKey(key))
                  return plugins[i].remove(key);
          throw new IllegalArgumentException("No such property '"+key+"'");
      }
  
      public int size() {
          int total = 0;
          for(int i=0; i<plugins.length; i++)
              total += plugins[i].size();
          return total;
      }
  
      public Collection values() {
          return new AbstractCollection() {
              public int size() {
                  return AggregateMetaData.this.size();
              }
  
              public Iterator iterator() {
                  return new AggregateIterator();
              }
          };
      }
  
      private void validate() {
          HashSet set = new HashSet();
          for(int i=0; i<plugins.length; i++) {
              String[] names = plugins[i].getPropertyNames();
              for(int j=0; j<names.length; j++)
                  if(!set.add(names[j]))
                      throw new IllegalArgumentException("Found two properties named 
'"+names[j]+"'!");
          }
      }
  
      class AggregateIterator implements Iterator {
          int pos = 0;
          Iterator current;
  
          public boolean hasNext() {
              while((current == null || !current.hasNext())
                    && pos < plugins.length)
                  current = plugins[pos++].values().iterator();
              return current != null && current.hasNext();
          }
  
          public Object next() {
              if(current == null || !current.hasNext()) hasNext();
              if(current == null) throw new NoSuchElementException();
              return current.next();
          }
  
          public void remove() {
              if(current != null)
                  current.remove();
              else throw new IllegalStateException();
          }
      }
  }
  
  
  1.1                  jboss/src/main/org/jboss/metadata/aggregate/AggregateMethod.java
  
  Index: AggregateMethod.java
  ===================================================================
  package org.jboss.metadata.aggregate;
  
  import org.jboss.metadata.*;
  import java.util.*;
  
  public class AggregateMethod extends AggregateMetaData implements MethodMetaData {
      private String name;
      private Class[] params;
  
      public AggregateMethod(String name, Class[] paramTypes) {
          this.name = name;
          params = paramTypes;
      }
  
      public AggregateMethod(String name, Class[] paramTypes, MethodMetaData[] 
plugins) {
          super(plugins);
          this.name = name;
          params = paramTypes;
      }
  
      public void addPlugin(MethodMetaData plugin) {
          super.addPlugin(plugin);
      }
  
      public String getName() {
          return name;
      }
  
      public Class[] getParameterTypes() {
          return params;
      }
  }
  
  
  1.1                  jboss/src/main/org/jboss/metadata/aggregate/AggregateServer.java
  
  Index: AggregateServer.java
  ===================================================================
  package org.jboss.metadata.aggregate;
  
  import java.lang.reflect.*;
  import java.util.*;
  import org.jboss.metadata.*;
  
  public class AggregateServer extends AggregateMetaData implements ServerMetaData {
      private AggregateBean[] beans;
  
      public AggregateServer() {
          super();
          beans = new AggregateBean[0];
      }
  
      public AggregateServer(ServerMetaData[] plugins) {
          this();
          for(int i=0; i<plugins.length; i++)
              addPlugin(plugins[i]);
      }
  
      public void addPlugin(ServerMetaData plugin) {
          super.addPlugin(plugin);
          Set incoming = plugin.getBeans();
          for(int i=0; i<beans.length; i++) {
              String name = beans[i].getName();
              try {
                  BeanMetaData bmd = plugin.getBean(name);
                  beans[i].addPlugin(bmd);
                  incoming.remove(bmd);
              } catch(IllegalArgumentException e) {
                  try {
                      Class cls = plugin.getManager().getBeanClass();
                      Object instance = cls.getConstructor(new 
Class[]{String.class}).newInstance(new Object[]{name});
                      beans[i].addPlugin((BeanMetaData)instance);
                  } catch(Exception e2) {e.printStackTrace();}
              }
          }
          Vector v = new Vector(Arrays.asList(beans));
          for(Iterator it = incoming.iterator(); it.hasNext();) {
              BeanMetaData bmd = (BeanMetaData)it.next();
              String name = bmd.getName();
              BeanMetaData[] list = new BeanMetaData[MetaDataFactory.getPluginCount()];
              for(int i=0; i<list.length; i++) {
                  Class cls = MetaDataFactory.getPlugin(i).getBeanClass();
                  if(cls.equals(bmd.getClass()))
                      list[i] = bmd;
                  else
                      try {
                          list[i] = (BeanMetaData)cls.newInstance();
                          Method m = cls.getMethod("setName", new 
Class[]{String.class});
                          m.invoke(list[i], new Object[]{name});
                      } catch(Exception e) {e.printStackTrace();}
              }
              v.addElement(new AggregateBean(name, list));
          }
          if(v.size() > beans.length)
              beans = (AggregateBean[])v.toArray(new AggregateBean[v.size()]);
      }
  
      public BeanMetaData getBean(String name) {
          for(int i=0; i<beans.length; i++)
              if(beans[i].getName().equals(name))
                  return beans[i];
          throw new IllegalArgumentException("Can't find bean '"+name+"'");
      }
  
      public Set getBeans() {
          return new HashSet(Arrays.asList(beans));
      }
  }
  
  

Reply via email to