[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.
|