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     */