⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlserialization.java

📁 MacroWeka扩展了著名数据挖掘工具weka
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
                  
                  // in ignore list?
                  if (    (m_Properties.isIgnored(memberName))
                       || (m_Properties.isIgnored(getPath(node) + "." + memberName))
                       || (m_Properties.isIgnored(o, getPath(node) + "." + memberName)) )
                     continue;

                  // is it allowed?
                  if (!m_Properties.isAllowed(o, memberName))
                     continue;
                  
                  desc   = (PropertyDescriptor) memberlist.get(memberName);
                  method = desc.getReadMethod();
                  member = method.invoke(o, (Object[]) null);
                  invokeWriteToXML(node, member, memberName);
               }
            }
         }
      }
      
      return node;
   }
   
   /**
    * either invokes a custom method to write a specific property/class or the standard
    * method <code>writeToXML(Element,Object,String)</code>
    * 
    * @param parent the parent XML node
    * @param o the object's content will be added as children to the given parent node
    * @param name the name of the object
    * @return the node that was created
    * @throws Exception if invocation or turning into XML fails
    * @see #m_CustomReadMethods
    */
   protected Element invokeWriteToXML(Element parent, Object o, String name) throws Exception {
      Method         method;
      Class[]        methodClasses;
      Object[]       methodArgs;
      boolean        array;
      Element        node;
      boolean        useDefault;
      
      node       = null;
      method     = null;
      useDefault = false;
      
      m_CurrentNode = parent;
      
      // default, if null
      if (o == null)
         useDefault = true;
      
      try {
         if (!useDefault) {
            array = o.getClass().isArray();
           
            // display name?
            if (m_CustomMethods.write().contains(name))
               method = (Method) m_CustomMethods.write().get(o.getClass());
            else
            // class?
            if ( (!array) && (m_CustomMethods.write().contains(o.getClass())) )
               method = (Method) m_CustomMethods.write().get(o.getClass());
            else
               method = null;
            
            useDefault = (method == null);
         }

         // custom
         if (!useDefault) {
             methodClasses    = new Class[3];
             methodClasses[0] = Element.class;
             methodClasses[1] = Object.class;
             methodClasses[2] = String.class;
             methodArgs       = new Object[3];
             methodArgs[0]    = parent;
             methodArgs[1]    = o;
             methodArgs[2]    = name;
             node = (Element) method.invoke(this, methodArgs);
         }
         // standard
         else {
            node = writeToXML(parent, o, name);
         }
      }
      catch (Exception e) {
         if (DEBUG)
            e.printStackTrace();
         
         if (m_CurrentNode != null) {
           System.out.println("Happened near: " + getPath(m_CurrentNode));
           // print it only once!
           m_CurrentNode = null;
         }
         System.out.println("PROBLEM (write): " + name);

         throw (Exception) e.fillInStackTrace();
      }
      
      return node;
   }
   
   /**
    * enables derived classes to due some pre-processing on the objects, that's
    * about to be serialized. Right now it only returns the object.
    * 
    * @param o the object that is serialized into XML
    * @return the possibly altered object
    * @throws Exception if post-processing fails
    */
   protected Object writePreProcess(Object o) throws Exception {
     return o;
   }
   
   /**
    * enables derived classes to add other properties to the DOM tree, e.g.
    * ones that do not apply to the get/set convention of beans. only implemented
    * with empty method body.
    * 
    * @param o the object that is serialized into XML
    * @throws Exception if post-processing fails
    */
   protected void writePostProcess(Object o) throws Exception {
   }
   
   /**
    * extracts all accesible properties from the given object
    * 
    * @param o the object to turn into an XML representation
    * @return the generated DOM document 
    * @throws Exception if XML generation fails 
    */
   public XMLDocument toXML(Object o) throws Exception {
      clear();
      invokeWriteToXML(null, writePreProcess(o), VAL_ROOT);
      writePostProcess(o);
      return m_Document;
   }
   
   /**
    * returns a descriptor for a given objet by providing the name
    * 
    * @param o the object the get the descriptor for
    * @param name the display name of the descriptor
    * @return the Descriptor, if found, otherwise <code>null</code>
    * @throws Exception if introsepction fails 
    */
   protected PropertyDescriptor getDescriptorByName(Object o, String name) throws Exception {
      PropertyDescriptor      result;
      PropertyDescriptor[]    desc;
      int                     i;
      
      result = null;
      
      desc   = Introspector.getBeanInfo(o.getClass()).getPropertyDescriptors();
      for (i = 0; i < desc.length; i++) {
         if (desc[i].getDisplayName().equals(name)) {
            result = desc[i];
            break;
         }
      }
      
      return result;
   }
   
   /**
    * returns the associated class for the given name
    * 
    * @param name the name of the class to return a Class object for
    * @return the class if  it could be retrieved
    * @throws Exception if it class retrieval fails
    */
   protected Class determineClass(String name) throws Exception {
      Class       result;
      
      if (name.equals(Boolean.TYPE.getName()))
         result = Boolean.TYPE;
      else
      if (name.equals(Byte.TYPE.getName()))
         result = Byte.TYPE;
      else
      if (name.equals(Character.TYPE.getName()))
         result = Character.TYPE;
      else
      if (name.equals(Double.TYPE.getName()))
         result = Double.TYPE;
      else
      if (name.equals(Float.TYPE.getName()))
         result = Float.TYPE;
      else
      if (name.equals(Integer.TYPE.getName()))
         result = Integer.TYPE;
      else
      if (name.equals(Long.TYPE.getName()))
         result = Long.TYPE;
      else
      if (name.equals(Short.TYPE.getName()))
         result = Short.TYPE;
      else
         result = Class.forName(name);
      
      return result;
   }
   
   /**
    * returns an Object representing the primitive described by the given node.
    * Here we use a trick to return an object even though its a primitive: by 
    * creating a primitive array with reflection of length 1, setting the 
    * primtive value as real object and then returning the "object" at 
    * position 1 of the array.
    * 
    * @param node the node to return the value as "primitive" object
    * @return the primitive as "pseudo" object
    * @throws Exception if the instantiation of the array fails or any of the
    *         String conversions fails
    */
   protected Object getPrimitive(Element node) throws Exception {
      Object            result;
      Object            tmpResult;
      Class             cls;
      
      cls       = determineClass(node.getAttribute(ATT_CLASS));
      tmpResult = Array.newInstance(cls, 1);
      
      if (cls == Boolean.TYPE)
         Array.set(tmpResult, 0, new Boolean(XMLDocument.getContent(node)));
      else
      if (cls == Byte.TYPE)
         Array.set(tmpResult, 0, new Byte(XMLDocument.getContent(node)));
      else
      if (cls == Character.TYPE)
         Array.set(tmpResult, 0, new Character(XMLDocument.getContent(node).charAt(0)));
      else
      if (cls == Double.TYPE)
         Array.set(tmpResult, 0, new Double(XMLDocument.getContent(node)));
      else
      if (cls == Float.TYPE)
         Array.set(tmpResult, 0, new Float(XMLDocument.getContent(node)));
      else
      if (cls == Integer.TYPE)
         Array.set(tmpResult, 0, new Integer(XMLDocument.getContent(node)));
      else
      if (cls == Long.TYPE)
         Array.set(tmpResult, 0, new Long(XMLDocument.getContent(node)));
      else
      if (cls == Short.TYPE)
         Array.set(tmpResult, 0, new Short(XMLDocument.getContent(node)));
      else
         throw new Exception("Cannot get primitive for class '" + cls.getName() + "'!");
      
      result = Array.get(tmpResult, 0);
      
      return result;
   }
   
   /**
    * builds the primitive from the given DOM node. 
    * 
    * @param parent the parent object to get the properties for
    * @param node the associated XML node
    * @return the primitive created from the XML description
    * @throws Exception if instantiation fails 
    */
   public boolean readBooleanFromXML(Element node) throws Exception {
     // for debugging only
     if (DEBUG)
        trace(new Throwable(), node.getAttribute(ATT_NAME));
     
     m_CurrentNode = node;
     
     return ((Boolean) getPrimitive(node)).booleanValue();
   }
   
   /**
    * builds the primitive from the given DOM node. 
    * 
    * @param parent the parent object to get the properties for
    * @param node the associated XML node
    * @return the primitive created from the XML description
    * @throws Exception if instantiation fails 
    */
   public byte readByteFromXML(Element node) throws Exception {
     // for debugging only
     if (DEBUG)
        trace(new Throwable(), node.getAttribute(ATT_NAME));
     
     m_CurrentNode = node;
     
     return ((Byte) getPrimitive(node)).byteValue();
   }
   
   /**
    * builds the primitive from the given DOM node. 
    * 
    * @param parent the parent object to get the properties for
    * @param node the associated XML node
    * @return the primitive created from the XML description
    * @throws Exception if instantiation fails 
    */
   public char readCharFromXML(Element node) throws Exception {
     // for debugging only
     if (DEBUG)
        trace(new Throwable(), node.getAttribute(ATT_NAME));
     
     m_CurrentNode = node;
     
     return ((Character) getPrimitive(node)).charValue();
   }
   
   /**
    * builds the primitive from the given DOM node. 
    * 
    * @param parent the parent object to get the properties for
    * @param node the associated XML node
    * @return the primitive created from the XML description
    * @throws Exception if instantiation fails 
    */
   public double readDoubleFromXML(Element node) throws Exception {
     // for debugging only
     if (DEBUG)
        trace(new Throwable(), node.getAttribute(ATT_NAME));
     
     m_CurrentNode = node;
     
     return ((Double) getPrimitive(node)).doubleValue();
   }
   
   /**
    * builds the primitive from the given DOM node. 
    * 
    * @param parent the parent object to get the properties for
    * @param node the associated XML node
    * @return the primitive created from the XML description
    * @throws Exception if instantiation fails 
    */
   public float readFloatFromXML(Element node) throws Exception {
     // for debugging only
     if (DEBUG)
        trace(new Throwable(), node.getAttribute(ATT_NAME));
     
     m_CurrentNode = node;
     
     return ((Float) getPrimitive(node)).floatValue();
   }
   
   /**
    * builds the primitive from the given DOM node. 
    * 
    * @param parent the parent object to get the properties for
    * @param node the associated XML node
    * @return the primitive created from the XML description
    * @throws Exception if instantiation fails 
    */
   public int readIntFromXML(Element node) throws Exception {
     // for debugging only
     if (DEBUG)
        trace(new Throwable(), node.getAttribute(ATT_NAME));
     
     m_CurrentNode = node;
     
     return ((Integer) getPrimitive(node)).intValue();
   }
   
   /**
    * builds the primitive from the given DOM node. 
    * 
    * @param parent the parent object to get the properties for
    * @param node the associated XML node
    * @return the primitive created from the XML description
    * @throws Exception if instantiation fails 
    */
   public long readLongFromXML(Element node) throws Exception {
     // for debugging only
     if (DEBUG)
        trace(new Throwable(), node.getAttribute(ATT_NAME));
     
     m_CurrentNode = node;
     
     return ((Long) getPrimitive(node)).longValue();
   }
   
   /**
    * builds the primitive from the given DOM node. 
    * 
    * @param parent the parent object to get the properties for
    * @param node the associated XML node
    * @return the primitive created from the XML description
    * @throws Exception if instantiation fails 
    */
   public short readShortFromXML(Element node) throws Exception {
     // for debugging only
     if (DEBUG)
        trace(new Throwable(), node.getAttribute(ATT_NAME));
     
     m_CurrentNode = node;
     
     return ((Short) getPrimitive(node)).shortValue();
   }
   
   /**
    * adds the specific node to the object via a set method
    * 
    * @param o            the object to set a property
    * @param name         the name of the object for which to set a property
    *                     (only for information reasons)
    * @param child        the value of the property to add
    * @throws Exception   if something goes wrong
    */
   public Object readFromXML(Object o, String name, Element child) throws Exception {
      Object               result;
      int                  i;
      Hashtable            descriptors;
      PropertyDescriptor   descriptor;
      String               methodName;
      Method               method;
      Class[]              methodClasses;
      Object[]             methodArgs;
      Object               tmpResult;
      Object[]             tmpResultArray;
      Class                paramClass;
     
      result      = o;
      descriptors = getDescriptors(result);
      methodName  = child.getAttribute(ATT_NAME);

      // in ignore list?
      if (m_Properties.isIgnored(getPath(child)))
         return result;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -