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}