1 25 package org.snipsnap.util; 26 27 import org.dom4j.DocumentHelper; 28 import org.dom4j.Element; 29 import org.dom4j.io.OutputFormat; 30 import org.dom4j.io.XMLWriter; 31 import org.snipsnap.config.Configuration; 32 import org.snipsnap.snip.storage.Serializer; 33 import org.snipsnap.snip.storage.SnipDataSerializer; 34 35 import java.io.File ; 36 import java.io.FileInputStream ; 37 import java.io.IOException ; 38 import java.io.OutputStream ; 39 import java.sql.Connection ; 40 import java.sql.DriverManager ; 41 import java.sql.PreparedStatement ; 42 import java.sql.ResultSet ; 43 import java.sql.ResultSetMetaData ; 44 import java.sql.SQLException ; 45 import java.sql.Timestamp ; 46 import java.util.HashMap ; 47 import java.util.Iterator ; 48 import java.util.Map ; 49 import java.util.Properties ; 50 51 public class JDBCDatabaseExport { 52 private final static Map DBSER = new HashMap (); 53 54 static { 55 DBSER.put("name", SnipDataSerializer.SNIP_NAME); 56 DBSER.put("applicationOid",SnipDataSerializer.SNIP_APPLICATION); 57 DBSER.put("content", SnipDataSerializer.SNIP_CONTENT); 58 DBSER.put("cTime", SnipDataSerializer.SNIP_CTIME); 59 DBSER.put("mTime", SnipDataSerializer.SNIP_MTIME); 60 DBSER.put("cUser", SnipDataSerializer.SNIP_CUSER); 61 DBSER.put("mUser", SnipDataSerializer.SNIP_MUSER); 62 DBSER.put("oUser", SnipDataSerializer.SNIP_OUSER); 63 DBSER.put("backLinks", SnipDataSerializer.SNIP_BACKLINKS); 64 DBSER.put("snipLinks", SnipDataSerializer.SNIP_SNIPLINKS); 65 DBSER.put("labels", SnipDataSerializer.SNIP_LABELS); 66 DBSER.put("attachments", SnipDataSerializer.SNIP_ATTACHMENTS); 67 DBSER.put("viewCount", SnipDataSerializer.SNIP_VIEWCOUNT); 68 DBSER.put("permissions", SnipDataSerializer.SNIP_PERMISSIONS); 69 DBSER.put("version", SnipDataSerializer.SNIP_VERSION); 70 71 DBSER.put("parentSnip", SnipDataSerializer.SNIP_PARENT); 72 DBSER.put("commentSnip", SnipDataSerializer.SNIP_COMMENTED); 73 } 74 public static void main(String [] args) { 75 Properties configData = new Properties (); 76 try { 77 configData.load(new FileInputStream (args[0])); 78 } catch (IOException e) { 79 System.err.println("JDBCDatabaseExport: missing configuration file: " + e.getMessage()); 80 System.exit(1); 81 } 82 83 export(configData, args[1], new File (args[0]).getParent()); 84 System.exit(0); 85 } 86 87 private static String replaceTokens(String value, String webInf) { 88 if (value != null) { 89 int idx = value.indexOf("%WEBINF%"); 90 if (idx != -1) { 91 StringBuffer replaced = new StringBuffer (); 92 if (idx > 0) { 93 replaced.append(value.substring(0, idx)); 94 } 95 replaced.append(webInf); 96 int endIdx = idx + "%WEBINF%".length(); 97 if (endIdx < value.length()) { 98 replaced.append(value.substring(endIdx)); 99 } 100 return replaced.toString(); 101 } 102 } 103 104 return value; 105 } 106 107 public static void export(Properties config, String appOid, String webInf) { 108 Iterator configIt = config.keySet().iterator(); 109 while(configIt.hasNext()) { 110 String key = (String )configIt.next(); 111 String value = config.getProperty(key); 112 config.setProperty(key, replaceTokens(value, webInf)); 113 } 114 115 try { 116 Class.forName(config.getProperty(Configuration.APP_JDBC_DRIVER)); 117 Properties jdbcInfo = new Properties (); 118 jdbcInfo.setProperty("user", config.getProperty(Configuration.APP_JDBC_USER)); 119 jdbcInfo.setProperty("password", config.getProperty(Configuration.APP_JDBC_PASSWORD)); 120 Connection connection = DriverManager.getConnection(config.getProperty(Configuration.APP_JDBC_URL), jdbcInfo); 121 store(System.out, appOid, connection); 122 } catch (Exception e) { 123 System.err.println("JDBCDatabaseExport: can't connect to database: " + e); 124 e.printStackTrace(); 125 } 126 } 127 128 132 public static void store(OutputStream out, String appOid, Connection connection) { 133 try { 134 OutputFormat outputFormat = new OutputFormat(); 135 outputFormat.setEncoding("UTF-8"); 136 outputFormat.setNewlines(true); 137 138 XMLWriter xmlWriter = new XMLWriter(out, outputFormat); 139 xmlWriter.startDocument(); 140 Element root = DocumentHelper.createElement("snipspace"); 141 xmlWriter.writeOpen(root); 142 143 storeSnips(xmlWriter, appOid, connection); 145 146 xmlWriter.writeClose(root); 147 xmlWriter.endDocument(); 148 xmlWriter.flush(); 149 xmlWriter.close(); 150 } catch (Exception e) { 151 System.err.println("JDBCDatabaseExport: error while writing document: " + e.getMessage()); 152 } 153 } 154 155 private static void storeSnips(XMLWriter xmlWriter, String appOid, Connection connection) { 156 try { 157 ResultSet results = readTable("Snip", appOid, connection); 158 serializeSnips(xmlWriter, results, connection, new SnipDataSerializer()); 159 } catch (Exception e) { 160 System.err.println("JDBCDabaseExport: error serializing snips: " + e.getMessage()); 161 e.printStackTrace(); 162 } 163 } 164 165 168 private static ResultSet readTable(String table, String appOid, Connection connection) throws SQLException { 169 PreparedStatement prepStmt = connection.prepareStatement("SELECT * FROM " + table + " WHERE applicationOid='"+appOid+"'"); 170 return prepStmt.executeQuery(); 171 } 172 173 176 private static void serializeSnips(XMLWriter xmlWriter, ResultSet results, Connection connection, Serializer serializer) throws IOException , SQLException { 177 ResultSetMetaData meta = results.getMetaData(); 178 179 while (results.next()) { 180 Map elementMap = serializeData(results, meta); 182 Element snipElement = serializer.serialize(elementMap); 184 188 xmlWriter.write(snipElement); 189 } 190 } 191 192 private static Map serializeData(ResultSet results, ResultSetMetaData meta) throws SQLException { 193 Map elementMap = new HashMap (); 194 int size = meta.getColumnCount(); 195 196 for (int i = 1; i <= size; i++) { 197 Object object = results.getObject(i); 198 String name = meta.getColumnName(i); 199 if (null != object) { 200 if (object instanceof Timestamp ) { 201 Timestamp time = (Timestamp ) object; 202 elementMap.put(DBSER.get(name), "" + time.getTime()); 203 } else { 204 elementMap.put(DBSER.get(name), object); 205 } 206 } 207 } 208 return elementMap; 209 } 210 } 211 | Popular Tags |