You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by jp...@apache.org on 2014/08/15 07:37:29 UTC

svn commit: r1618100 - in /jena/Experimental/jena-csv: ./ src/main/java/org/apache/jena/propertytable/graph/ src/main/java/org/apache/jena/propertytable/impl/ src/main/java/org/apache/jena/propertytable/lang/ src/main/java/org/apache/jena/propertytable...

Author: jpz6311whu
Date: Fri Aug 15 05:37:29 2014
New Revision: 1618100

URL: http://svn.apache.org/r1618100
Log:
JENA-625, prepare for jena-csv 1.0 release:
1. modify dependency from SNAPSHOT to release
2. refactor the package layout
3. move LangCSV from jena-arq module to jena-csv
4. modify jena-csv version to 1.0

Added:
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphCSV.java
      - copied, changed from r1611872, jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/GraphCSV.java
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphPropertyTable.java
      - copied, changed from r1611872, jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/GraphPropertyTable.java
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTable.java
      - copied, changed from r1611872, jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/QueryIterPropertyTable.java
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTableRow.java
      - copied, changed from r1611872, jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/QueryIterPropertyTableRow.java
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/RowMatch.java
      - copied, changed from r1611872, jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/RowMatch.java
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/StageGeneratorPropertyTable.java
      - copied, changed from r1613800, jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/StageGeneratorPropertyTable.java
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/lang/
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/lang/LangCSV.java   (with props)
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/util/
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/util/IRILib.java   (with props)
    jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/graph/
    jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/graph/GraphCSVTest.java
      - copied, changed from r1617106, jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/impl/GraphCSVTest.java
    jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/lang/
    jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/lang/TestLangCSV.java   (with props)
Removed:
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/GraphCSV.java
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/GraphPropertyTable.java
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/QueryIterPropertyTable.java
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/QueryIterPropertyTableRow.java
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/RowMatch.java
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/StageGeneratorPropertyTable.java
    jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/impl/GraphCSVTest.java
Modified:
    jena/Experimental/jena-csv/pom.xml
    jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableBuilder.java
    jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/TS_PropertyTable.java

Modified: jena/Experimental/jena-csv/pom.xml
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-csv/pom.xml?rev=1618100&r1=1618099&r2=1618100&view=diff
==============================================================================
--- jena/Experimental/jena-csv/pom.xml (original)
+++ jena/Experimental/jena-csv/pom.xml Fri Aug 15 05:37:29 2014
@@ -22,21 +22,30 @@
   <artifactId>jena-csv</artifactId>
   <packaging>jar</packaging>
   <name>Apache Jena - Data Tables for SPARQL</name>
-  <version>0.1-SNAPSHOT</version>
+  <version>1.0</version>
 
   <parent>
     <groupId>org.apache.jena</groupId>
     <artifactId>jena-parent</artifactId>
-    <version>10-SNAPSHOT</version>
+    <version>10</version>
     <relativePath>../jena-parent</relativePath>
   </parent>
-
+  
+    <!-- Need if the parent is a snapshot -->
+  <repositories>
+    <repository>
+      <id>apache.snapshots</id>
+      <name>Apache Snapshot Repository</name>
+      <url>http://repository.apache.org/snapshots</url>
+      <releases>
+	<enabled>false</enabled>
+      </releases>
+    </repository>
+  </repositories>
+  
+  <description>jena-csv is for getting CSVs into a form that is amenable to Jena SPARQL processing, and doing so in a way that is not specific to CSV files. It includes getting the right architecture in place for regular table shaped data, using the core abstraction of PropertyTable.</description> 
+  
   <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-
-    <jdk.version>1.6</jdk.version>
-    <targetJdk>${jdk.version}</targetJdk> <!-- MPMD-86 workaround -->
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ssZ</maven.build.timestamp.format>
     <build.time.xsd>${maven.build.timestamp}</build.time.xsd>
   </properties>
@@ -47,7 +56,7 @@
     <dependency>
       <groupId>org.apache.jena</groupId>
       <artifactId>apache-jena-libs</artifactId>
-      <version>2.12.1-SNAPSHOT</version>
+      <version>2.12.0</version>
       <type>pom</type>
     </dependency>
     
@@ -62,7 +71,7 @@
     <dependency>
       <groupId>org.apache.jena</groupId>
       <artifactId>jena-arq</artifactId>
-      <version>2.12.1-SNAPSHOT</version>
+      <version>2.12.0</version>
       <type>jar</type>
       <classifier>tests</classifier>
       <scope>test</scope>

Copied: jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphCSV.java (from r1611872, jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/GraphCSV.java)
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphCSV.java?p2=jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphCSV.java&p1=jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/GraphCSV.java&r1=1611872&r2=1618100&rev=1618100&view=diff
==============================================================================
--- jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/GraphCSV.java (original)
+++ jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphCSV.java Fri Aug 15 05:37:29 2014
@@ -16,9 +16,10 @@
  * limitations under the License.
  */
 
-package org.apache.jena.propertytable.impl;
+package org.apache.jena.propertytable.graph;
 
 import org.apache.jena.propertytable.PropertyTable;
+import org.apache.jena.propertytable.impl.PropertyTableBuilder;
 
 
 public class GraphCSV extends GraphPropertyTable {

Copied: jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphPropertyTable.java (from r1611872, jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/GraphPropertyTable.java)
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphPropertyTable.java?p2=jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphPropertyTable.java&p1=jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/GraphPropertyTable.java&r1=1611872&r2=1618100&rev=1618100&view=diff
==============================================================================
--- jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/GraphPropertyTable.java (original)
+++ jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphPropertyTable.java Fri Aug 15 05:37:29 2014
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.jena.propertytable.impl;
+package org.apache.jena.propertytable.graph;
 
 import java.util.ArrayList;
 import java.util.Locale;

Copied: jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTable.java (from r1611872, jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/QueryIterPropertyTable.java)
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTable.java?p2=jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTable.java&p1=jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/QueryIterPropertyTable.java&r1=1611872&r2=1618100&rev=1618100&view=diff
==============================================================================
--- jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/QueryIterPropertyTable.java (original)
+++ jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTable.java Fri Aug 15 05:37:29 2014
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.jena.propertytable.impl;
+package org.apache.jena.propertytable.graph;
 
 import java.util.ArrayList;
 import java.util.Collection;

Copied: jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTableRow.java (from r1611872, jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/QueryIterPropertyTableRow.java)
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTableRow.java?p2=jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTableRow.java&p1=jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/QueryIterPropertyTableRow.java&r1=1611872&r2=1618100&rev=1618100&view=diff
==============================================================================
--- jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/QueryIterPropertyTableRow.java (original)
+++ jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTableRow.java Fri Aug 15 05:37:29 2014
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.jena.propertytable.impl;
+package org.apache.jena.propertytable.graph;
 
 import java.util.ArrayList;
 import java.util.List;

Copied: jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/RowMatch.java (from r1611872, jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/RowMatch.java)
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/RowMatch.java?p2=jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/RowMatch.java&p1=jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/RowMatch.java&r1=1611872&r2=1618100&rev=1618100&view=diff
==============================================================================
--- jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/RowMatch.java (original)
+++ jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/RowMatch.java Fri Aug 15 05:37:29 2014
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.jena.propertytable.impl;
+package org.apache.jena.propertytable.graph;
 
 import com.hp.hpl.jena.graph.Node;
 import com.hp.hpl.jena.sparql.core.BasicPattern;

Copied: jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/StageGeneratorPropertyTable.java (from r1613800, jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/StageGeneratorPropertyTable.java)
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/StageGeneratorPropertyTable.java?p2=jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/StageGeneratorPropertyTable.java&p1=jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/StageGeneratorPropertyTable.java&r1=1613800&r2=1618100&rev=1618100&view=diff
==============================================================================
--- jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/StageGeneratorPropertyTable.java (original)
+++ jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/graph/StageGeneratorPropertyTable.java Fri Aug 15 05:37:29 2014
@@ -16,7 +16,8 @@
  * limitations under the License.
  */
 
-package org.apache.jena.propertytable.impl;
+package org.apache.jena.propertytable.graph;
+
 
 import com.hp.hpl.jena.graph.Graph;
 import com.hp.hpl.jena.sparql.core.BasicPattern;

Modified: jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableBuilder.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableBuilder.java?rev=1618100&r1=1618099&r2=1618100&view=diff
==============================================================================
--- jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableBuilder.java (original)
+++ jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableBuilder.java Fri Aug 15 05:37:29 2014
@@ -27,7 +27,7 @@ import org.apache.jena.atlas.csv.CSVToke
 import org.apache.jena.atlas.io.IO;
 import org.apache.jena.propertytable.PropertyTable;
 import org.apache.jena.propertytable.Row;
-import org.apache.jena.riot.lang.LangCSV;
+import org.apache.jena.propertytable.lang.LangCSV;
 import org.apache.jena.riot.system.IRIResolver;
 
 import com.hp.hpl.jena.datatypes.xsd.XSDDatatype;

Added: jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/lang/LangCSV.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/lang/LangCSV.java?rev=1618100&view=auto
==============================================================================
--- jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/lang/LangCSV.java (added)
+++ jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/lang/LangCSV.java Fri Aug 15 05:37:29 2014
@@ -0,0 +1,225 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.propertytable.lang;
+
+import static org.apache.jena.riot.RDFLanguages.CSV;
+
+import java.io.InputStream;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.jena.atlas.csv.CSVParser;
+import org.apache.jena.atlas.web.ContentType;
+import org.apache.jena.propertytable.util.IRILib;
+import org.apache.jena.riot.Lang;
+import org.apache.jena.riot.RDFLanguages;
+import org.apache.jena.riot.RDFParserRegistry;
+import org.apache.jena.riot.ReaderRIOT;
+import org.apache.jena.riot.ReaderRIOTFactory;
+import org.apache.jena.riot.lang.LangRIOT;
+import org.apache.jena.riot.system.ErrorHandler;
+import org.apache.jena.riot.system.ErrorHandlerFactory;
+import org.apache.jena.riot.system.IRIResolver;
+import org.apache.jena.riot.system.ParserProfile;
+import org.apache.jena.riot.system.RiotLib;
+import org.apache.jena.riot.system.StreamRDF;
+
+import com.hp.hpl.jena.datatypes.xsd.XSDDatatype;
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.graph.NodeFactory;
+import com.hp.hpl.jena.sparql.util.Context;
+
+public class LangCSV implements LangRIOT {
+
+	public static final String CSV_PREFIX = "http://w3c/future-csv-vocab/";
+	public static final String CSV_ROW = CSV_PREFIX + "row";
+
+	private InputStream input = null;
+	private Reader reader = null;
+	private String base;
+	private String filename;
+	private StreamRDF sink;
+	private ParserProfile profile; // Warning - we don't use all of this.
+	
+	public static void register(){
+		RDFParserRegistry.removeRegistration(Lang.CSV);
+		RDFParserRegistry.registerLangTriples(Lang.CSV, new ReaderRIOTFactoryCSV());
+	}
+
+	@Override
+	public Lang getLang() {
+		return RDFLanguages.CSV;
+	}
+
+	@Override
+	public ParserProfile getProfile() {
+		return profile;
+	}
+
+	@Override
+	public void setProfile(ParserProfile profile) {
+		this.profile = profile;
+	}
+
+	public LangCSV(Reader reader, String base, String filename,
+			ErrorHandler errorHandler, StreamRDF sink) {
+		this.reader = reader;
+		this.base = base;
+		this.filename = filename;
+		this.sink = sink;
+		this.profile = RiotLib.profile(getLang(), base, errorHandler);
+	}
+
+	public LangCSV(InputStream in, String base, String filename,
+			ErrorHandler errorHandler, StreamRDF sink) {
+		this.input = in;
+		this.base = base;
+		this.filename = filename;
+		this.sink = sink;
+		this.profile = RiotLib.profile(getLang(), base, errorHandler);
+	}
+
+	@Override
+	public void parse() {
+		sink.start();
+		CSVParser parser = (input != null) ? CSVParser.create(input)
+				: CSVParser.create(reader);
+		List<String> row = null;
+		ArrayList<Node> predicates = new ArrayList<Node>();
+		int rowNum = 0;
+		while ((row = parser.parse1()) != null) {
+			
+			if (rowNum == 0) {
+				for (String column : row) {
+					String uri = IRIResolver.resolveString(filename) + "#"
+							+ toSafeLocalname(column);
+					Node predicate = this.profile.createURI(uri, rowNum, 0);
+					predicates.add(predicate);
+				}
+			} else {
+				//Node subject = this.profile.createBlankNode(null, -1, -1);
+				Node subject = caculateSubject(rowNum, filename);
+				Node predicateRow = this.profile.createURI(CSV_ROW, -1, -1);
+				Node objectRow = this.profile
+						.createTypedLiteral((rowNum + ""),
+								XSDDatatype.XSDinteger, rowNum, 0);
+				sink.triple(this.profile.createTriple(subject, predicateRow,
+						objectRow, rowNum, 0));
+				for (int col = 0; col < row.size() && col<predicates.size(); col++) {
+					Node predicate = predicates.get(col);
+					String columnValue = row.get(col).trim();
+					if("".equals(columnValue)){
+						continue;
+					}					
+					Node o;
+					try {
+						// Try for a double.
+						double d = Double.parseDouble(columnValue);
+						o = NodeFactory.createLiteral(columnValue,
+								XSDDatatype.XSDdouble);
+					} catch (Exception e) {
+						o = NodeFactory.createLiteral(columnValue);
+					}
+					sink.triple(this.profile.createTriple(subject, predicate,
+							o, rowNum, col));
+				}
+
+			}
+			rowNum++;
+		}
+		sink.finish();
+
+	}
+
+	public static String toSafeLocalname(String raw) {
+		String ret = raw.trim();
+		return encodeURIComponent(ret);
+		
+	}
+	
+	public static String encodeURIComponent(String s) {
+	    return IRILib.encodeUriComponent(s);
+	}
+	
+	public static Node caculateSubject(int rowNum, String filename){
+		Node subject = NodeFactory.createAnon();
+//		String uri = IRIResolver.resolveString(filename) + "#Row_" + rowNum; 
+//		Node subject =  NodeFactory.createURI(uri);
+		return subject;
+	}
+	
+	
+	
+	
+    private static class ReaderRIOTFactoryCSV implements ReaderRIOTFactory
+    {
+        @Override
+        public ReaderRIOT create(Lang lang) {
+            return new ReaderRIOTLangCSV(lang) ;
+        }
+    }
+
+    private static class ReaderRIOTLangCSV implements ReaderRIOT
+    {
+        private final Lang lang ;
+        private ErrorHandler errorHandler ; 
+        private ParserProfile parserProfile = null ;
+
+        ReaderRIOTLangCSV(Lang lang) {
+            this.lang = lang ;
+            errorHandler = ErrorHandlerFactory.getDefaultErrorHandler() ;
+        }
+
+        @Override
+        public void read(InputStream in, String baseURI, ContentType ct, StreamRDF output, Context context) {
+            if ( lang == CSV){
+            	LangRIOT parser = new LangCSV (in, baseURI, baseURI, ErrorHandlerFactory.getDefaultErrorHandler(),  output);
+                if ( parserProfile != null )
+                    parser.setProfile(parserProfile);
+                if ( errorHandler != null )
+                    parser.getProfile().setHandler(errorHandler) ;
+                parser.parse() ;
+            } else {
+            	throw new IllegalArgumentException("The Lang must be 'CSV'!");
+            }
+
+        }
+
+        @Override
+        public void read(Reader in, String baseURI, ContentType ct, StreamRDF output, Context context) {
+        	if ( lang == CSV){
+        		LangRIOT parser = new LangCSV (in, baseURI, baseURI, ErrorHandlerFactory.getDefaultErrorHandler(),  output);
+                if ( parserProfile != null )
+                    parser.setProfile(parserProfile);
+                if ( errorHandler != null )
+                    parser.getProfile().setHandler(errorHandler) ;
+        		parser.parse() ;
+        	} else {
+            	throw new IllegalArgumentException("The Lang must be 'CSV'!");
+            }
+        }
+
+        @Override public ErrorHandler getErrorHandler()                     { return errorHandler ; }
+        @Override public void setErrorHandler(ErrorHandler errorHandler)    { this.errorHandler = errorHandler ; }
+
+        @Override public ParserProfile getParserProfile()                   { return parserProfile ; } 
+        @Override public void setParserProfile(ParserProfile parserProfile) { this.parserProfile = parserProfile ; }
+    }
+}

Propchange: jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/lang/LangCSV.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/util/IRILib.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/util/IRILib.java?rev=1618100&view=auto
==============================================================================
--- jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/util/IRILib.java (added)
+++ jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/util/IRILib.java Fri Aug 15 05:37:29 2014
@@ -0,0 +1,262 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.propertytable.util;
+
+import java.io.File ;
+import java.io.IOException ;
+
+import org.apache.jena.atlas.AtlasException ;
+import org.apache.jena.atlas.lib.Chars ;
+import org.apache.jena.atlas.lib.StrUtils ;
+import org.apache.jena.riot.SysRIOT ;
+
+/** 
+ * Operations related to IRIs 
+ * Add '£', based on org.apache.jena.riot.system.IRILib
+ */
+public class IRILib
+{
+    // http://www.w3.org/TR/xpath-functions/#func-encode-for-uri
+    // Encodes delimiters.
+    
+    /* RFC 3986
+     * 
+     * unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"
+     * gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
+     * sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
+                    / "*" / "+" / "," / ";" / "="
+     */
+    
+    private static char uri_reserved[] = 
+    { 
+      '!', '*', '"', '\'', '(', ')', ';', ':', '@', '&', 
+      '=', '+', '$', ',', '/', '?', '%', '#', '[', ']'} ;
+
+    // No allowed in URIs
+    private static char uri_non_chars[] = { '<', '>', '{', '}', '|', '\\', '`', '^', ' ',  '\n', '\r', '\t', '£' } ;
+    
+    // RFC 2396
+    //private static char uri_unwise[]    = { '{' , '}', '|', '\\', '^', '[', ']', '`' } ;
+
+
+    private static char[] charsComponent =
+    // reserved, + non-chars + nasties.
+    { '!', '*', '"', '\'', '(', ')', ';', ':', '@', '&', 
+      '=', '+', '$', ',', '/', '?', '%', '#', '[', ']',
+      '{', '}', '|', '\\', '`', '^',
+      ' ', '<', '>', '\n', '\r', '\t', '£' } ;
+    
+    private static char[] charsFilename =
+        // reserved, + non-chars + nasties.
+        // Leave : (Windows drive charcater) and / (separator) alone
+        // include SPC and ~
+        { '!', '*', '"', '\'', '(', ')', ';', /*':',*/ '@', '&', 
+          '=', '+', '$', ',', /*'/',*/ '?', '%', '#', '[', ']',
+          '{', '}', '|', '\\', '`', '^',
+          ' ', '<', '>', '\n', '\r', '\t',
+          '~'} ;
+
+    private static char[] charsPath =  
+    {
+        // Reserved except leave the separators alone. 
+        // Leave the path separator alone.
+        // Leave the drive separator alone.
+        '!', '*', '"', '\'', '(', ')', ';', /*':',*/ '@', '&',
+        '=', '+', '$', ',', /*'/',*/ '?', '%', '#', '[', ']',
+        '{', '}', '|', '\\', '`', '^',
+        // Other junk 
+        ' ', '<', '>', '\n', '\r', '\t' } ;
+
+    // The initializers must have run.
+    static final String cwd ; 
+    static final String cwdURL ;
+    
+    // Current directory, with trailing "/"
+    // This matters for resolution.
+    static { 
+        String x = new File(".").getAbsolutePath() ;
+        x = x.substring(0, x.length()-1) ;
+        cwd = x ;
+        cwdURL = plainFilenameToURL(cwd) ;
+    }
+    
+    // See also IRIResolver
+    /** Return a string that is an IRI for the filename.*/
+    public static String fileToIRI(File f)
+    {
+        return filenameToIRI(f.getAbsolutePath()) ;
+    }
+    
+    /** Create a string that is a IRI for the filename.
+     *  The file name may already have file:.
+     *  The file name may be relative. 
+     *  Encode using the rules for a path (e.g. ':' and'/' do not get encoded)
+     */
+    public static String filenameToIRI(String fn)
+    {
+        if ( fn == null ) return cwdURL ;
+        
+        if ( fn.length() == 0 ) return cwdURL ;
+        
+        if ( fn.startsWith("file:") )
+            return normalizeFilenameURI(fn) ;
+        return plainFilenameToURL(fn) ;
+    }
+    
+    /** Convert an IRI to a filename */
+    public static String IRIToFilename(String iri)
+    {
+        if ( ! iri.startsWith("file:") )
+            throw new AtlasException("Not a file: URI: "+iri) ; 
+        
+        String fn ;
+        if ( iri.startsWith("file:///") )
+            fn = iri.substring("file://".length()) ;
+        else
+            fn = iri.substring("file:".length()) ;
+        return decode(fn) ;
+    }
+    
+    /** Convert a plain file name (no file:) to a file: URL */
+    private static String plainFilenameToURL(String fn)
+    {
+        // No "file:"
+        // Make Absolute filename.
+        boolean trailingSlash = fn.endsWith("/") ;
+        File file = new File(fn) ;
+        
+        try { fn = file.getCanonicalPath() ; }
+        catch (IOException e) { fn = file.getAbsolutePath() ; }
+        
+        if ( trailingSlash && ! fn.endsWith("/") )
+            fn = fn + "/" ;
+        
+        if ( SysRIOT.isWindows )
+        {
+            // C:\ => file:///C:/... 
+            if ( fn.length() >= 2 && fn.charAt(1) == ':' )
+                // Windows drive letter - already absolute path.
+                // Make "URI" absolute path
+                fn = "/"+fn ;
+            // Convert \ to /
+            // Maybe should do this on all platforms? i.e consistency.
+            fn = fn.replace('\\', '/' ) ;
+        }
+        
+        fn = encodeFileURL(fn) ;
+        return "file://"+fn ;
+    }
+    
+    
+    /** Sanitize a "file:" URL. Must start "file:" */
+    private static String normalizeFilenameURI(String fn)
+    {
+        if ( ! fn.startsWith("file:/") )
+        {
+            // Relative path.
+            String fn2 = fn.substring("file:".length()) ;
+            return plainFilenameToURL(fn2) ;
+        }
+        
+        // Starts file:///
+        if ( fn.startsWith("file:///") )
+            // Assume it's good as return as-is.
+            return fn ;
+
+        if ( fn.startsWith("file://") )
+        {
+            String fn2 = fn.substring("file:/".length()) ;  // Leave one "/"
+            return plainFilenameToURL(fn2) ;
+        }
+
+        // Must be file:/
+        String fn2 = fn.substring("file:".length()) ;
+        return plainFilenameToURL(fn2) ;
+    }
+
+    /** Encode using the rules for a component (e.g. ':' and '/' get encoded) 
+     * Does not encode non-ASCII characters 
+     */
+    public static String encodeUriComponent(String string)
+    {
+        String encStr = StrUtils.encodeHex(string,'%', charsComponent) ;
+        return encStr ;
+    }
+
+    /** Encode using the rules for a file: URL.  
+     *  Does not encode non-ASCII characters
+     */
+    public static String encodeFileURL(String string)
+    {
+        String encStr = StrUtils.encodeHex(string,'%', charsFilename) ;
+        return encStr ;
+    }
+
+    /** Encode using the rules for a path (e.g. ':' and '/' do not get encoded) */
+    public static String encodeUriPath(String uri)
+    {
+        // Not perfect.
+        // Encode path.
+        // %-encode chars.
+        uri = StrUtils.encodeHex(uri, '%', charsPath) ;
+        return uri ;
+    }
+
+    public static String decode(String string)
+    {
+        return StrUtils.decodeHex(string, '%') ;
+    }
+
+    public static String encodeNonASCII(String string)
+    {
+        if ( ! containsNonASCII(string) )
+            return string ;
+        
+        byte[] bytes = StrUtils.asUTF8bytes(string) ;
+        StringBuilder sw = new StringBuilder() ;
+        for ( byte b : bytes )
+        {
+            // Signed bytes ...
+            if ( b > 0 )
+            {
+                sw.append( (char) b );
+                continue;
+            }
+
+            int hi = ( b & 0xF0 ) >> 4;
+            int lo = b & 0xF;
+            sw.append( '%' );
+            sw.append( Chars.hexDigitsUC[hi] );
+            sw.append( Chars.hexDigitsUC[lo] );
+        }
+        return sw.toString() ;
+    }
+
+    public static boolean containsNonASCII(String string)
+    {
+        boolean clean = true ;
+        for ( int i = 0 ; i < string.length() ; i++ )
+        {
+            char ch = string.charAt(i) ;
+            if ( ch >= 127 )
+                return true;
+        }
+        return false ;
+    } 
+}

Propchange: jena/Experimental/jena-csv/src/main/java/org/apache/jena/propertytable/util/IRILib.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/TS_PropertyTable.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/TS_PropertyTable.java?rev=1618100&r1=1618099&r2=1618100&view=diff
==============================================================================
--- jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/TS_PropertyTable.java (original)
+++ jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/TS_PropertyTable.java Fri Aug 15 05:37:29 2014
@@ -18,11 +18,12 @@
 
 package org.apache.jena.propertytable;
 
-import org.apache.jena.propertytable.impl.GraphCSVTest;
+import org.apache.jena.propertytable.graph.GraphCSVTest;
 import org.apache.jena.propertytable.impl.PropertyTableArrayImplTest;
 import org.apache.jena.propertytable.impl.PropertyTableBuilderForArrayImplTest;
 import org.apache.jena.propertytable.impl.PropertyTableBuilderForHashMapImplTest;
 import org.apache.jena.propertytable.impl.PropertyTableHashMapImplTest;
+import org.apache.jena.propertytable.lang.TestLangCSV;
 import org.junit.runner.RunWith;
 import org.junit.runners.Suite;
 
@@ -34,6 +35,7 @@ import org.junit.runners.Suite;
 	GraphCSVTest.class,
 	PropertyTableBuilderForArrayImplTest.class,
 	PropertyTableBuilderForHashMapImplTest.class,
+	TestLangCSV.class
 })
 public class TS_PropertyTable {
 

Copied: jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/graph/GraphCSVTest.java (from r1617106, jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/impl/GraphCSVTest.java)
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/graph/GraphCSVTest.java?p2=jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/graph/GraphCSVTest.java&p1=jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/impl/GraphCSVTest.java&r1=1617106&r2=1618100&rev=1618100&view=diff
==============================================================================
--- jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/impl/GraphCSVTest.java (original)
+++ jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/graph/GraphCSVTest.java Fri Aug 15 05:37:29 2014
@@ -16,9 +16,12 @@
  * limitations under the License.
  */
 
-package org.apache.jena.propertytable.impl;
+package org.apache.jena.propertytable.graph;
 
+import org.apache.jena.propertytable.graph.GraphCSV;
+import org.apache.jena.propertytable.lang.LangCSV;
 import org.junit.Assert;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 import com.hp.hpl.jena.query.ARQ;
@@ -32,10 +35,14 @@ import com.hp.hpl.jena.rdf.model.Model;
 import com.hp.hpl.jena.rdf.model.ModelFactory;
 import com.hp.hpl.jena.sparql.engine.main.StageBuilder;
 import com.hp.hpl.jena.sparql.engine.main.StageGenerator;
-import com.hp.hpl.jena.util.PrintUtil;
 
 public class GraphCSVTest extends Assert {
 	
+	@BeforeClass
+	public static void init(){
+		LangCSV.register();
+	}
+	
 	@Test
 	public void testGraphCSV() throws Exception {
 		//String file = "src/test/resources/HEFCE_organogram_senior_data_31032011.csv";test.csv

Added: jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/lang/TestLangCSV.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/lang/TestLangCSV.java?rev=1618100&view=auto
==============================================================================
--- jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/lang/TestLangCSV.java (added)
+++ jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/lang/TestLangCSV.java Fri Aug 15 05:37:29 2014
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.propertytable.lang;
+
+import java.io.StringReader;
+
+import org.apache.jena.atlas.junit.BaseTest;
+import org.apache.jena.atlas.lib.StrUtils;
+import org.apache.jena.riot.Lang;
+import org.apache.jena.riot.RDFDataMgr;
+import org.apache.jena.riot.RDFLanguages;
+import org.apache.jena.riot.system.IRIResolver;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.hp.hpl.jena.rdf.model.Model;
+import com.hp.hpl.jena.rdf.model.ModelFactory;
+
+public class TestLangCSV extends BaseTest {
+	private static final String FILE_NAME = "src/test/resources/test.csv";
+	private static final String FILE_URI = IRIResolver.resolveString(FILE_NAME);
+
+	@BeforeClass
+	public static void init(){
+		LangCSV.register();
+	}
+	
+	@Test
+	public void testPredicateWithSpace() {
+		String[] s1 = { "Predicate With Space", "PredicateWithSpace" };
+		String[] s2 = {
+				//"<"+ LangCSV.caculateSubject(1, FILE_NAME) + "> <" + FILE_URI + "#Predicate+With+Space> 'PredicateWithSpace' ; ",
+				" [] <" + FILE_URI + "#Predicate%20With%20Space> 'PredicateWithSpace' ; ",
+				" <http://w3c/future-csv-vocab/row> 1 ." };
+		assertIsomorphicWith(s1, s2);
+	}
+	
+	@Test
+	public void testNonURICharacters() {
+		String[] s1 = { "`~!@#$%^&*()-_=+[{]}|\\;:'\"<.>/?", "NonURICharacters" };
+		String[] s2 = {
+				//"<"+ LangCSV.caculateSubject(1, FILE_NAME) + "> <" + FILE_URI + "#%60%7E%21%40%23%24%25%5E%26*%28%29-_%3D%2B%5B%7B%5D%7D%7C%5C%3B%3A%27%22%3C.%3E%2F%3F> 'NonURICharacters' ; ",
+				" [] <" + FILE_URI + "#%60~%21%40%23%24%25%5E%26%2A%28%29-_%3D%2B%5B%7B%5D%7D%7C%5C%3B%3A%27%22%3C.%3E%2F%3F> 'NonURICharacters' ; ",
+				" <http://w3c/future-csv-vocab/row> 1 ." };
+		assertIsomorphicWith(s1, s2);
+	}
+	
+	@Test
+	public void testDigitalLocalName() {
+		String[] s1 = { "1234", "DigitalLocalName" };
+		String[] s2 = {
+				//"<"+ LangCSV.caculateSubject(1, FILE_NAME) + "> <" + FILE_URI + "#1234> 'DigitalLocalName' ; ",
+				" [] <" + FILE_URI + "#1234> 'DigitalLocalName' ; ",
+				" <http://w3c/future-csv-vocab/row> 1 ." };
+		assertIsomorphicWith(s1, s2);
+	}
+
+	@Test
+	public void testMoney() {
+		String[] s1 = { "£", "£" };
+		String[] s2 = {
+				//"<"+ LangCSV.caculateSubject(1, FILE_NAME) + "> <" + FILE_URI + "#1234> 'DigitalLocalName' ; ",
+				" [] <" + FILE_URI + "#%A3> '£' ; ",
+				" <http://w3c/future-csv-vocab/row> 1 ." };
+		assertIsomorphicWith(s1, s2);
+	}
+	
+	@Test
+	public void RDFDataMgrReadTest() {
+		Model m1 = RDFDataMgr.loadModel(FILE_NAME, RDFLanguages.CSV);
+		Model m2 = ModelFactory.createDefaultModel();
+		m2.read(FILE_NAME, "CSV");
+		assertEquals(12, m1.size());
+		assertTrue(m1.isIsomorphicWith(m2));
+	}
+
+	private Model parseToModel(String[] strings, Lang lang) {
+		String string = StrUtils.strjoin("\n", strings);
+		StringReader r = new StringReader(string);
+		Model model = ModelFactory.createDefaultModel();
+		RDFDataMgr.read(model, r, FILE_NAME, lang);
+		return model;
+	}
+	
+	private void assertIsomorphicWith(String[] s1, String[] s2){
+		Model m1 = parseToModel(s1, RDFLanguages.CSV);
+		Model m2 = parseToModel(s2, RDFLanguages.TURTLE);
+		assertTrue(m1.isIsomorphicWith(m2));
+	}
+
+}

Propchange: jena/Experimental/jena-csv/src/test/java/org/apache/jena/propertytable/lang/TestLangCSV.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain