001 package EVolve.util.xmlutils; 002 003 import EVolve.Scene; 004 import EVolve.util.xmlutils.datastructures.XMLWriteOrder; 005 006 import java.io.*; 007 import java.util.*; 008 import java.lang.reflect.Field; 009 010 /** 011 * User: Wei Wang 012 * Date: Jun 4, 2003 013 * Time: 1:15:03 PM 014 */ 015 016 public class XMLWriter { 017 private final String header = "<?xml version=\"1.0\" standalone=\"yes\"?>"; 018 private FileWriter output; 019 private String xmlFName; 020 021 public XMLWriter() { 022 023 } 024 025 public void initialWriter(String xmlFName, boolean append) { 026 this.xmlFName = xmlFName; 027 028 try { 029 output = new FileWriter(this.xmlFName, append); 030 output.write(header+"\n"); 031 } catch (IOException e) { 032 Scene.showErrorMessage("Failed to initialize XML writer, reason:"+e.getMessage()+"."); 033 } 034 } 035 036 public void writeObject(Object data, String order[]) { 037 try { 038 String wrapTag = data.getClass().getName(); 039 output.write(generateTag(wrapTag.substring(wrapTag.lastIndexOf('.')+1),false)); 040 output.write("\n"); 041 Field[] fields = data.getClass().getFields(); 042 for (int i=0; i<order.length; i++) { 043 if (fields[i].getType().getName().indexOf("String") == -1) { 044 XMLWriteOrder orders = new XMLWriteOrder(); 045 try { 046 writeObjects(fields[i].getName(),(ArrayList)fields[i].get(data),orders.getOrder(fields[i].getName())); 047 } catch (IllegalAccessException e) { 048 Scene.showErrorMessage("Internal error in XMLWriter.writeObject(...)"); 049 } 050 } else { 051 String buf = generateTag(order[i],false); 052 for (int j=0; j<fields.length; j++) { 053 if (fields[i].getName().equals(order[i])) { 054 try { 055 String value = (String)fields[i].get(data); 056 if ((value!=null)&&(value.length()!=0)) 057 buf+=value.toString(); 058 break; 059 } catch (IllegalAccessException e) {} 060 } 061 } 062 output.write(buf+generateTag(order[i],true)+"\n"); 063 } 064 } 065 output.write(generateTag(wrapTag.substring(wrapTag.lastIndexOf('.')+1),true)); 066 output.write("\n"); 067 } catch (IOException e) { 068 Scene.showErrorMessage("IO Error!"); 069 } 070 } 071 072 public void writeObjects(String category, ArrayList data, String order[]) { 073 for (int i=0; i<data.size(); i++) { 074 writeObject(data.get(i),order); 075 } 076 } 077 078 public void writeTag(String tagName, boolean isEnd) { 079 try { 080 output.write(generateTag(tagName,isEnd)+"\n"); 081 } catch (IOException e) {} 082 } 083 084 public void finalizeWriter() { 085 try { 086 output.flush(); 087 output.close(); 088 } catch (IOException e) {} 089 } 090 091 public String generateTag(String tagName, boolean end) { 092 return !end ? "<"+tagName+">" : "</"+tagName+">"; 093 } 094 }