001
002package gudusoft.gsqlparser.dlineage.util;
003
004import gudusoft.gsqlparser.util.Logger;
005import gudusoft.gsqlparser.util.LoggerFactory;
006import gudusoft.gsqlparser.util.SQLUtil;
007
008import javax.xml.bind.JAXBContext;
009import javax.xml.bind.Marshaller;
010import javax.xml.bind.Unmarshaller;
011import java.io.*;
012import java.util.UUID;
013import java.util.zip.ZipEntry;
014import java.util.zip.ZipInputStream;
015import java.util.zip.ZipOutputStream;
016
017@SuppressWarnings("unchecked")
018public class XML2Model {
019    private static final Logger logger = LoggerFactory.getLogger(XML2Model.class);
020    public static <T> T loadXML(Class<T> t, String xml) {
021        StringReader reader = null;
022        try {
023            JAXBContext context = JAXBContext.newInstance(t);
024            Unmarshaller unmarshaller = context.createUnmarshaller();
025            reader = new StringReader(xml);
026            return (T) unmarshaller.unmarshal(reader);
027        } catch (Exception e) {
028            logger.error("load java object from xml failed.", e);
029            return null;
030        } finally {
031            if (reader != null) {
032                reader.close();
033            }
034        }
035    }
036
037    public static <T> T loadXML(Class<T> t, File file) {
038        ZipInputStream zis = null;
039        BufferedReader reader = null;
040        FileInputStream fis = null;
041        try {
042            JAXBContext context = JAXBContext.newInstance(t);
043            Unmarshaller unmarshaller = context.createUnmarshaller();
044            if (isZipFile(file)) {
045                zis = new ZipInputStream(new FileInputStream(file));
046                zis.getNextEntry();
047                reader = new BufferedReader(new InputStreamReader(zis, "UTF-8"));
048            } else {
049                fis = new FileInputStream(file);
050                reader = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
051            }
052            return (T) unmarshaller.unmarshal(reader);
053        } catch (Exception e) {
054            logger.error("load java object from xml failed.", e);
055            return null;
056        } finally {
057            if (reader != null) {
058                try {
059                    reader.close();
060                } catch (IOException e) {
061                    logger.error("Close reader failed.", e);
062                }
063            }
064            if (zis != null) {
065                try {
066                    zis.close();
067                } catch (IOException e) {
068                    logger.error("Close ZipInputStream failed.", e);
069                }
070            }
071            if (fis != null) {
072                try {
073                    fis.close();
074                } catch (IOException e) {
075                    logger.error("Close FileInputStream failed.", e);
076                }
077            }
078        }
079    }
080
081    private static boolean isZipFile(File file) {
082        FileInputStream fis = null;
083        try {
084            fis = new FileInputStream(file);
085            byte[] header = new byte[4];
086            int read = fis.read(header);
087            if (read >= 4) {
088                return header[0] == 0x50 && header[1] == 0x4B && header[2] == 0x03 && header[3] == 0x04;
089            }
090        } catch (IOException e) {
091            logger.error("Check zip file failed.", e);
092        } finally {
093            if (fis != null) {
094                try {
095                    fis.close();
096                } catch (IOException e) {
097                    logger.error("Close FileInputStream failed.", e);
098                }
099            }
100        }
101        return false;
102    }
103
104    public static <T> String saveXML(T t) throws Exception {
105        File tempFile = null;
106        try {
107            JAXBContext context = JAXBContext.newInstance(t.getClass());
108            Marshaller marshaller = context.createMarshaller();
109            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
110            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
111            tempFile = File.createTempFile(UUID.randomUUID().toString(), null);
112            FileWriter writer = new FileWriter(tempFile);
113            marshaller.marshal(t, writer);
114            writer.close();
115            String xml = SQLUtil.readFile(tempFile);
116            return xml;
117        } catch (Exception e) {
118            throw e;
119        } finally {
120            if (tempFile != null && tempFile.exists()) {
121                tempFile.delete();
122            }
123        }
124    }
125
126    public static <T> void saveXML(T t, File file) throws Exception {
127        BufferedWriter writer = null;
128        ZipOutputStream zos = null;
129        try {
130            JAXBContext context = JAXBContext.newInstance(t.getClass());
131            Marshaller marshaller = context.createMarshaller();
132            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
133            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
134            zos = new ZipOutputStream(new FileOutputStream(file));
135            zos.setLevel(2);
136            zos.putNextEntry(new ZipEntry("data"));
137            writer = new BufferedWriter(new OutputStreamWriter(zos, "UTF-8"));
138            marshaller.marshal(t, writer);
139        } catch (Exception e) {
140            throw e;
141        } finally {
142            if (writer != null) {
143                try {
144                    writer.close();
145                } catch (IOException e) {
146                    logger.error("Close writer failed.", e);
147                }
148            }
149
150            if (zos != null) {
151                try {
152                    zos.close();
153                } catch (IOException e) {
154                    logger.error("Close ZipOutputStream failed.", e);
155                }
156            }
157        }
158    }
159}