View Javadoc

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 }