001 /* 002 * (c) Copyright 2010 University of Bristol 003 * All rights reserved. 004 * [See end of file] 005 */ 006 007 package net.rootdev.javardfa.output; 008 009 import java.io.OutputStream; 010 import java.io.OutputStreamWriter; 011 import java.io.UnsupportedEncodingException; 012 import java.io.Writer; 013 014 015 /** 016 * A pretty ropey turtle serialiser. 017 * Advantages: streams, no dependencies. 018 * 019 * @author pldms 020 */ 021 public class TurtleSink extends NTripleSink { 022 023 private String currentSubject = null; 024 private String currentPredicate = null; 025 026 public TurtleSink(OutputStream os, String... comments) throws UnsupportedEncodingException { 027 super(new OutputStreamWriter(os, "UTF-8"), comments); 028 } 029 030 public TurtleSink(Writer writer, String... comments) { 031 super(writer, comments); 032 } 033 034 @Override 035 public void end() { 036 out.println("."); 037 super.end(); 038 } 039 040 @Override 041 public void addObject(String subject, String predicate, String object) { 042 emitTriple(subject, predicate, toNode(object)); 043 } 044 045 @Override 046 public void addLiteral(String subject, String predicate, String lex, String lang, String datatype) { 047 emitTriple(subject, predicate, toLiteral(lex, lang, datatype)); 048 } 049 050 private void emitTriple(String subject, String predicate, String objectEncoded) { 051 if (subject.equals(currentSubject)) { // We can at least ';' 052 if (predicate.equals(currentPredicate)) { // We can ',' 053 out.println(","); 054 out.print("\t\t"); 055 out.print(objectEncoded); 056 } else { 057 out.println(";"); 058 out.print("\t"); 059 out.println(toNode(predicate)); 060 out.print("\t\t"); 061 out.print(objectEncoded); 062 currentPredicate = predicate; 063 } 064 } else { 065 if (currentSubject != null) out.println("."); 066 out.println(toNode(subject)); 067 out.print("\t"); 068 out.println(toNode(predicate)); 069 out.print("\t\t"); 070 out.print(objectEncoded); 071 currentPredicate = predicate; 072 currentSubject = subject; 073 } 074 } 075 076 @Override 077 protected final String enc(int codepoint) { 078 return new String( new int[] {codepoint},0,1); 079 } 080 081 @Override 082 protected final String longenc(int codepoint) { 083 return new String( new int[] {codepoint},0,1); 084 } 085 } 086 087 /* 088 * (c) Copyright 2009 University of Bristol 089 * All rights reserved. 090 * 091 * Redistribution and use in source and binary forms, with or without 092 * modification, are permitted provided that the following conditions 093 * are met: 094 * 1. Redistributions of source code must retain the above copyright 095 * notice, this list of conditions and the following disclaimer. 096 * 2. Redistributions in binary form must reproduce the above copyright 097 * notice, this list of conditions and the following disclaimer in the 098 * documentation and/or other materials provided with the distribution. 099 * 3. The name of the author may not be used to endorse or promote products 100 * derived from this software without specific prior written permission. 101 * 102 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 103 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 104 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 105 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 106 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 107 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 108 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 109 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 110 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 111 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 112 */