[Prosperapi-commits] SF.net SVN: prosperapi: [17] trunk/data/src/main/java/src/prosper/data
Brought to you by:
jonrssll
From: <pro...@li...> - 2008-02-22 19:21:43
|
Revision: 17 http://prosperapi.svn.sourceforge.net/prosperapi/?rev=17&view=rev Author: rateladder Date: 2008-02-22 11:21:46 -0800 (Fri, 22 Feb 2008) Log Message: ----------- Refactored parser and made an XML to CSV utility Modified Paths: -------------- trunk/data/src/main/java/src/prosper/data/DataObject.java trunk/data/src/main/java/src/prosper/data/Database.java Added Paths: ----------- trunk/data/src/main/java/src/prosper/data/ProsperXMLtoCSV.java trunk/data/src/main/java/src/prosper/data/XMLHandler.java trunk/data/src/main/java/src/prosper/data/XMLParser.java Modified: trunk/data/src/main/java/src/prosper/data/DataObject.java =================================================================== --- trunk/data/src/main/java/src/prosper/data/DataObject.java 2007-12-08 20:15:39 UTC (rev 16) +++ trunk/data/src/main/java/src/prosper/data/DataObject.java 2008-02-22 19:21:46 UTC (rev 17) @@ -1,6 +1,7 @@ package prosper.data; -import java.util.HashMap; +import java.util.Iterator; +import java.util.TreeMap; /** * Bean for holding Type and Data of a single row @@ -16,14 +17,14 @@ /** * Data: Name/Value pairs */ - private HashMap<String, String> m_Data; + private TreeMap<String, String> m_Data; /** * Bean for holding Type and Data of a single row */ public DataObject() { - m_Data = new HashMap<String, String>(); + m_Data = new TreeMap<String, String>(); } /** @@ -61,4 +62,9 @@ { return m_Data.get(key); } + + public Iterator<String> keys() + { + return m_Data.keySet().iterator(); + } } Modified: trunk/data/src/main/java/src/prosper/data/Database.java =================================================================== --- trunk/data/src/main/java/src/prosper/data/Database.java 2007-12-08 20:15:39 UTC (rev 16) +++ trunk/data/src/main/java/src/prosper/data/Database.java 2008-02-22 19:21:46 UTC (rev 17) @@ -28,7 +28,7 @@ * @author unit * */ -public class Database +public class Database implements XMLHandler { /** * Database Type i.e. SqlServer2005 @@ -149,9 +149,9 @@ { m_Connection = DriverManager.getConnection(dest); m_Connection.setAutoCommit(true); - - //digest XML file and insert data into database - digestData(data); + + XMLParser parser = new XMLParser(this); + parser.digestData(data); } finally { Added: trunk/data/src/main/java/src/prosper/data/ProsperXMLtoCSV.java =================================================================== --- trunk/data/src/main/java/src/prosper/data/ProsperXMLtoCSV.java (rev 0) +++ trunk/data/src/main/java/src/prosper/data/ProsperXMLtoCSV.java 2008-02-22 19:21:46 UTC (rev 17) @@ -0,0 +1,146 @@ +package prosper.data; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.util.Iterator; + +public class ProsperXMLtoCSV implements XMLHandler +{ + private File m_XmlLocation; + private File m_DestDir; + private boolean m_InObject; + private BufferedWriter m_CSVFile; + private int m_RowsConverted; + + public ProsperXMLtoCSV(File xmlLocation, File destDir) + { + m_XmlLocation = xmlLocation; + m_DestDir = destDir; + } + + /** + * @param args + */ + public static void main(String[] args) + { + if (args.length!=1 && args.length!=2) + { + System.err.println("The XmlFilePath must exist and be a readable Prosper XML File"); + System.err.println("The optional CSV destination directory must exist and a writable folder"); + System.err.println("Usage: ProsperXMLtoCSV XMLFilePath [CSV Destination Directory]"); + return; + } + File xmlLocation = new File(args[0]); + File destDir = new File((args.length==1) ? "." : args[1]); + if (!xmlLocation.exists() || !xmlLocation.isFile() || !xmlLocation.canRead()) + { + System.err.println("The XmlFilePath must exist and be a readable Prosper XML File"); + System.err.println("The optional CSV destination directory must exist and a writable folder"); + System.err.println("Usage: ProsperXMLtoCSV XMLFilePath [CSV Destination Directory]"); + return; + } + if (!destDir.exists() || !destDir.isDirectory()) + { + System.err.println("The XmlFilePath must exist and be a readable Prosper XML File"); + System.err.println("The optional CSV destination directory must exist and a writable folder"); + System.err.println("Usage: ProsperXMLtoCSV XMLFilePath [CSV Destination Directory]"); + return; + } + try + { + ProsperXMLtoCSV pxtc = new ProsperXMLtoCSV(xmlLocation,destDir); + pxtc.parseXMLtoCSV(); + } + catch (Exception e) + { + System.err.println("An Error occured parsing the XML file or writing the CSV files"); + e.printStackTrace(System.err); + System.err.println(); + System.err.println("The XmlFilePath must exist and be a readable Prosper XML File"); + System.err.println("The optional CSV destination directory must exist and a writable folder"); + System.err.println("Usage: ProsperXMLtoCSV XMLFilePath [CSV Destination Directory]"); + } + } + + public void parseXMLtoCSV() throws Exception + { + m_InObject = false; + XMLParser xmlParser = new XMLParser(this); + xmlParser.digestData(m_XmlLocation); + } + + public void preData() throws Exception + { + //do Nothing + } + + public void preNewDataObject(String name) throws Exception + { + //do Nothing + } + + public void addDataObject(DataObject dataObject) throws Exception + { + if (!m_InObject) + { + System.err.println("Starting conversion of "+dataObject.getName().substring(0,dataObject.getName().indexOf("/"))); + m_CSVFile = new BufferedWriter(new FileWriter(new File(m_DestDir,dataObject.getName().substring(0,dataObject.getName().indexOf("/"))+".CSV"))); + boolean comma = false; + for (Iterator<String> i = dataObject.keys(); i.hasNext(); ) + { + String key = i.next(); + if (!comma) + { + comma = true; + } + else + { + m_CSVFile.write(","); + } + m_CSVFile.write(delineateString(key)); + } + m_CSVFile.write("\n"); + m_InObject = true; + m_RowsConverted = 0; + } + boolean comma = false; + for (Iterator<String> i = dataObject.keys(); i.hasNext(); ) + { + String key = i.next(); + if (!comma) + { + comma = true; + } + else + { + m_CSVFile.write(","); + } + m_CSVFile.write(delineateString(dataObject.getValue(key))); + } + m_CSVFile.write("\n"); + if ((++m_RowsConverted)%10000==0) + { + System.err.println(dataObject.getName().substring(0,dataObject.getName().indexOf("/"))+ " rows converted: "+m_RowsConverted); + } + + } + + private String delineateString(String value) + { + return "\""+value.replaceAll("\"", "\"\"")+"\""; + } + + public void postDataObject(String path) throws Exception + { + System.err.println(path.substring(0,path.indexOf("/"))+ " rows converted: "+m_RowsConverted+"\n"); + m_CSVFile.close(); + m_InObject = false; + } + + public void postData() throws Exception + { + //do Nothing + } + +} Added: trunk/data/src/main/java/src/prosper/data/XMLHandler.java =================================================================== --- trunk/data/src/main/java/src/prosper/data/XMLHandler.java (rev 0) +++ trunk/data/src/main/java/src/prosper/data/XMLHandler.java 2008-02-22 19:21:46 UTC (rev 17) @@ -0,0 +1,37 @@ +package prosper.data; + +public interface XMLHandler +{ + /** + * Pre Data. + * @throws Exception + */ + public void preData() throws Exception; + + /** + * Pre New Data Object Type + * @param name DataObject Name in the pattern 'Objects/Object' + * @throws Exception when error + */ + public void preNewDataObject(String name) throws Exception; + + /** + * Complete New Data Object + * @param dataObject the DataObject to insert + * @throws Exception when errors + */ + public void addDataObject(DataObject dataObject) throws Exception; + + /** + * After all Data Objects of a type + * @param path full xml path: ProsperDataExport/\\p{Alnum}+ + * @throws Exception when sql errors + */ + public void postDataObject(String path) throws Exception; + + /** + * After XML Parsing + * @throws Exception when errors + */ + public void postData() throws Exception; +} Added: trunk/data/src/main/java/src/prosper/data/XMLParser.java =================================================================== --- trunk/data/src/main/java/src/prosper/data/XMLParser.java (rev 0) +++ trunk/data/src/main/java/src/prosper/data/XMLParser.java 2008-02-22 19:21:46 UTC (rev 17) @@ -0,0 +1,48 @@ +package prosper.data; + +import java.io.File; +import java.io.IOException; + +import org.apache.commons.digester.Digester; +import org.apache.commons.digester.PathCallParamRule; +import org.apache.commons.digester.RegexRules; +import org.xml.sax.SAXException; + +public class XMLParser +{ + private XMLHandler m_Handler; + public XMLParser(XMLHandler handler) + { + m_Handler = handler; + } + + public void digestData(File data) throws IOException, SAXException + { + Digester digester = new Digester(); + digester.setRules(new RegexRules(new JavaMatcher())); + digester.push(m_Handler); + + //create a DataObject, call setName with the xml path, call addDataObject on this Database + digester.addObjectCreate("ProsperDataExport/\\p{Alnum}+/\\p{Alnum}+","prosper.data.DataObject"); + digester.addSetNext("ProsperDataExport/\\p{Alnum}+/\\p{Alnum}+", "addDataObject"); + digester.addCallMethod("ProsperDataExport/\\p{Alnum}+/\\p{Alnum}+", "setName", 1); + PathCallParamRule pathRule = new PathCallParamRule(0); + digester.addRule("ProsperDataExport/\\p{Alnum}+/\\p{Alnum}+", pathRule); + + //call addData on DataObject with the xmlPath to the datakey and the datavalue + digester.addCallMethod("ProsperDataExport/\\p{Alnum}+/\\p{Alnum}+/\\p{Alnum}+", "addData", 2); + pathRule = new PathCallParamRule(0); + digester.addRule("ProsperDataExport/\\p{Alnum}+/\\p{Alnum}+/\\p{Alnum}+", pathRule); + digester.addCallParam("ProsperDataExport/\\p{Alnum}+/\\p{Alnum}+/\\p{Alnum}+",1); + + //call postDataObject with full xml path on close of data type tag + digester.addCallMethod("ProsperDataExport/\\p{Alnum}+", "postDataObject", 1); + pathRule = new PathCallParamRule(0); + digester.addRule("ProsperDataExport/\\p{Alnum}+", pathRule); + + //call postData on close of ProsperDataExportTag + digester.addCallMethod("ProsperDataExport", "postData"); + + digester.parse(data); + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |