source: runtime/src/main/java/eu/earthobservatory/runtime/generaldb/NQuadsParser.java @ 726:66c2c41d6b8e

Revision 726:66c2c41d6b8e, 8.1 KB checked in by Konstantina Bereta <Konstantina.Bereta@…>, 6 years ago (diff)

Fixed graph uri construction

Line 
1package eu.earthobservatory.runtime.generaldb;
2
3import org.openrdf.model.Resource;
4import org.openrdf.model.Statement;
5import org.openrdf.rio.RDFFormat;
6import org.openrdf.rio.RDFHandlerException;
7import org.openrdf.rio.RDFParseException;
8
9import java.io.IOException;
10import java.io.InputStream;
11import java.io.InputStreamReader;
12import java.io.Reader;
13import java.io.UnsupportedEncodingException;
14import java.text.DateFormat;
15import java.text.ParseException;
16import java.text.SimpleDateFormat;
17import java.util.Date;
18import java.util.regex.Pattern;
19
20import javax.naming.StringRefAddr;
21/**
22 * This Source Code Form is subject to the terms of the Mozilla Public
23 * License, v. 2.0. If a copy of the MPL was not distributed with this
24 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
25 *
26 * Copyright (C) 2012, Pyravlos Team
27 *
28 * http://www.strabon.di.uoa.gr/
29 *
30 *  @author Konstantina Bereta <Konstantina.Bereta@di.uoa.gr>
31 * 
32 *  based on code provided by ua Shinavier (http://fortytwo.net).  Builds on code by Aduna.
33 *
34 */
35
36/**
37 * RDFParser implementation for the N-Quads RDF format.
38 * <p/>
39 * Changes made to Aduna's N-Triple parser:
40 * 1) "final" removed from NTriplesParser.getRDFFormat
41 * 2) private member variables made public: reader, lineno, subject, predcate, object
42 * 3) private methods: skipWhitespace, skipLine, parseSubject, parsePredicate, parseObject, throwEOFException
43 *
44 */
45public class NQuadsParser extends ModifiedNTriplesParser {
46    protected Resource context;
47    protected String validTimeLiteral;
48
49    /*
50    // FIXME: delete me
51    public static void main(final String[] args) throws Exception {
52        String baseURI = "http://example.org/bogusBaseURI/";
53
54        Sail sail = new NativeStore(new File("/tmp/btcSmallNativeStore"));
55        sail.initialize();
56        try {
57            Repository repo = new SailRepository(sail);
58            RepositoryConnection conn = repo.getConnection();
59            try {
60                InputStream is = new FileInputStream(
61                        new File("/Users/josh/datasets/btc/btc-2009-small.nq"));
62                try {
63                    RDFParser parser = new NQuadsParser();
64                    parser.setRDFHandler(new RDFInserter(conn));
65                    parser.parse(is, baseURI);
66                } finally {
67                    is.close();
68                }
69            } finally {
70                conn.close();
71            }
72        } finally {
73            sail.shutDown();
74        }
75    }
76    */
77
78    @Override
79    public RDFFormat getRDFFormat() {
80        return RDFFormat.NQUADS;
81    }
82
83    @Override
84    public void parse(final InputStream inputStream,
85                      final String baseURI) throws IOException, RDFParseException, RDFHandlerException {
86        if (inputStream == null) {
87            throw new IllegalArgumentException("Input stream can not be 'null'");
88        }
89        // Note: baseURI will be checked in parse(Reader, String)
90
91        try {
92            parse(new InputStreamReader(inputStream, "US-ASCII"), baseURI);
93        } catch (UnsupportedEncodingException e) {
94            // Every platform should support the US-ASCII encoding...
95            throw new RuntimeException(e);
96        }
97    }
98
99    @Override
100    public void parse(final Reader reader,
101                      final String baseURI) throws IOException, RDFParseException, RDFHandlerException {
102        if (reader == null) {
103            throw new IllegalArgumentException("Reader can not be 'null'");
104        }
105        if (baseURI == null) {
106            throw new IllegalArgumentException("base URI can not be 'null'");
107        }
108
109        rdfHandler.startRDF();
110
111        this.reader = reader;
112        lineNo = 1;
113
114        reportLocation(lineNo, 1);
115
116        try {
117            int c = reader.read();
118            c = skipWhitespace(c);
119
120            while (c != -1) {
121                if (c == '#') {
122                    // Comment, ignore
123                    c = skipLine(c);
124                } else if (c == '\r' || c == '\n') {
125                    // Empty line, ignore
126                    c = skipLine(c);
127                } else {
128                    c = parseQuad(c);
129                }
130
131                c = skipWhitespace(c);
132            }
133        } catch (ParseException e) {
134                        // TODO Auto-generated catch block
135                        e.printStackTrace();
136                } finally {
137            clear();
138        }
139
140        rdfHandler.endRDF();
141    }
142
143    private int parseQuad(int c)
144            throws IOException, RDFParseException, RDFHandlerException, ParseException {
145       
146        boolean ignoredAnError = false;
147        try
148        {
149            c = parseSubject(c);
150   
151            c = skipWhitespace(c);
152   
153            c = parsePredicate(c);
154   
155            c = skipWhitespace(c);
156   
157            c = parseObject(c);
158   
159            c = skipWhitespace(c);
160   
161            // Context is not required
162            if (c != '.') {
163                c = parseContext(c);
164                c = skipWhitespace(c);
165            }
166            if (c == -1) {
167                throwEOFException();
168            } else if (c != '.') {
169                reportFatalError("Expected '.', found: " + (char) c);
170            }
171   
172            c = assertLineTerminates(c);
173        }
174        catch(RDFParseException rdfpe)
175        {
176            if(stopAtFirstError())
177            {
178                throw rdfpe;
179            }
180            else
181            {
182                ignoredAnError = true;
183            }
184        }
185       
186        c = skipLine(c);
187
188        if(!ignoredAnError)
189        {
190            Statement st = createStatement(subject, predicate, object, context);
191            rdfHandler.handleStatement(st);
192        }
193       
194        subject = null;
195        predicate = null;
196        object = null;
197        context = null;
198
199        return c;
200    }
201
202    public Resource createValidTimeURI(String sb) throws ParseException, RDFParseException
203    {
204        String strdf = "http://strdf.di.uoa.gr/ontology#validTime";
205        validTimeLiteral=sb;
206        if(sb.toString().contains("^^<http://strdf.di.uoa.gr/ontology#validTime>"))
207        {       
208        String[] splits = sb.toString().split(",");
209        int i1 = splits[0].indexOf('[');
210        int i2 = splits[1].indexOf(']');
211        String element1 = splits[0].substring(++i1);
212        String element2 = splits[1].substring(0,i2);
213        //System.out.println("element2"+element2);
214        String[] splash2 = splits[1].split("]");
215        DateFormat dateformat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
216                DateFormat.SHORT);
217        int syn = element1.indexOf('+');
218        //System.out.println("element1 = "+element1);
219        String startDate = element1.substring(0,syn);
220        syn = element1.indexOf('+');
221        String endDate = element2.substring(0,syn);
222        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
223        Date start = format.parse(startDate);
224        //System.out.println("start date:"+startDate.toString());
225        Date end = format.parse(endDate);
226        //System.out.println("End date:"+ endDate.toString());
227        String uri = strdf+"/"+ startDate+"_"+ endDate+ "_" +format.getTimeZone().getID();
228        Resource cont = createURI(uri);
229        return cont;
230    }
231        return null;
232    }
233   
234    protected int parseContext(int c)
235            throws IOException, RDFParseException, ParseException {
236        // FIXME: context (in N-Quads) can be a literal
237        StringBuilder sb = new StringBuilder(100);
238       
239        // subject is either an uriref (<foo://bar>) or a nodeID (_:node1)
240        if (c == '<') {
241            // subject is an uriref
242                System.out.println("PARSEURI");
243            c = parseUriRef(c, sb);
244            context = createURI(sb.toString());
245        } else if (c == '_') {
246            // subject is a bNode
247            c = parseNodeID(c, sb);
248                System.out.println("PARSENODE");
249            context = createBNode(sb.toString());
250        }else if(c == '"'){
251                c = parseLiteral(c, sb);
252                validTimeLiteral=sb.toString();
253                context = createURI(sb.toString());
254               
255        }else if (c == -1) {
256            throwEOFException();
257        } else {
258            reportFatalError("Expected '<' or '_', found: " + (char) c);
259        }
260
261        return c;
262    }
263}
Note: See TracBrowser for help on using the repository browser.