1 /*
2 * Copyright (c) 2007, Peter Mika All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * - Redistributions of source code must retain the above copyright notice, this
8 * list of conditions and the following disclaimer.
9 * - Redistributions in binary form must reproduce the above copyright notice,
10 * this list of conditions and the following disclaimer in the documentation
11 * and/or other materials provided with the distribution.
12 * - Neither the name of the openrdf.org nor the names of its contributors may
13 * be used to endorse or promote products derived from this software without
14 * specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29 package org.openrdf.elmo.smusher.listener;
30
31 import java.util.ArrayList;
32 import java.util.Collection;
33
34 import org.openrdf.model.Statement;
35 import org.openrdf.model.URI;
36 import org.openrdf.model.impl.StatementImpl;
37 import org.openrdf.repository.Repository;
38 import org.openrdf.repository.RepositoryConnection;
39 import org.openrdf.repository.RepositoryException;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
42
43 /**
44 * A listener that represents matches using a given property (owl:sameAs) by default
45 * and adds them to a given repository.
46 *
47 * @author Peter Mika (pmika@cs.vu.nl)
48 */
49 public class SameAsListener implements SmusherListener {
50
51 //If we have collected more than the specified number of statements
52 //than we upload them
53 private static final int DEFAULT_THRESHOLD = 100000;
54 protected final static Logger _logger = LoggerFactory.getLogger(SameAsListener.class);
55
56 private Repository _repository = null;
57 private int _counter = 0;
58 private boolean _symmetric = true;
59 private int _threshold = DEFAULT_THRESHOLD;
60 private Collection<Statement> _stmts = new ArrayList<Statement>();
61 private URI _property = org.openrdf.model.vocabulary.OWL.SAMEAS;
62
63
64
65 /** Default constructor creates a listener where
66 * <ul>
67 * <li> owl:sameAs statements are added symmetrically
68 * (i.e. if A owl:sameAs B is reported then B owl:sameAs A is also added to the store).
69 * </li>
70 * <li>Statements are committed right away.
71 * </ul>
72 * @param repository
73 */
74 public SameAsListener(Repository repository) {
75 this(repository, true);
76 }
77
78 public SameAsListener(Repository repository, URI property) {
79 this(repository, true);
80 _property = property;
81 }
82
83 /** Constructor that allows you to set whether you want owl:sameAs
84 * statements to be symmetric and whether the matches reported should
85 * be immediately committed to the store. If autoCommit is set to false,
86 * the statements are committed whenever the preset threshold is reached
87 * or commit() is called.
88 *
89 * @param repository
90 * @param symmetric
91 * @param autoCommit
92 */
93 public SameAsListener(Repository repository, boolean symmetric) {
94 _repository = repository;
95 _symmetric = symmetric;
96
97 }
98
99 public void setThreshold(int threshold) {
100 _threshold = threshold;
101 }
102
103 public void start() {
104 _stmts = new ArrayList<Statement>();
105
106 }
107
108 public void matchFound(org.openrdf.model.Resource first, org.openrdf.model.Resource second) {
109 _stmts.add(new StatementImpl(first, _property, second));
110 _counter++;
111 if (_symmetric) {
112 _stmts.add(new StatementImpl(second, _property, first));
113 _counter++;
114 }
115 if (_counter >= _threshold) {
116 commit();
117 //TODO: is this necessary?
118 //_session.clear();
119 _counter = 0;
120 }
121 }
122
123 public void commit() {
124 try {
125 RepositoryConnection con = _repository.getConnection();
126 con.add(_stmts);
127 } catch (RepositoryException e) {
128 _logger.error(e.getMessage(), e);
129 }
130 _stmts.clear();
131 }
132
133 public void finish() {
134 _stmts.clear();
135 }
136
137 }