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    }