1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 package org.openrdf.elmo.smusher;
30
31 import java.util.ArrayList;
32 import java.util.Collection;
33 import java.util.HashSet;
34 import java.util.Iterator;
35 import java.util.List;
36
37 import org.openrdf.OpenRDFException;
38 import org.openrdf.elmo.sesame.SesameManager;
39 import org.openrdf.elmo.smusher.listener.CounterListener;
40 import org.openrdf.elmo.smusher.listener.SmusherListener;
41 import org.openrdf.model.Resource;
42 import org.openrdf.repository.Repository;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45
46
47
48
49
50
51
52
53
54
55 public class FastIterativeSmusher extends AbstractSmusher {
56
57 protected List<Smusher> _smushers = new ArrayList<Smusher>();
58 protected int _lastCount = -1;
59 protected final static Logger _logger = LoggerFactory.getLogger(FastIterativeSmusher.class);
60
61 public FastIterativeSmusher() {
62
63 }
64
65 public void addSmusher(Smusher smusher) {
66 if (smusher != null) {
67 _smushers.add(smusher);
68 }
69 }
70
71 public void removeSmusher(Smusher smusher) {
72 if (smusher != null) {
73 _smushers.remove(smusher);
74 }
75 }
76
77 private class MetaListener implements SmusherListener {
78
79 Collection _listeners = new HashSet();
80
81 public MetaListener(Collection listeners) {
82 _listeners = listeners;
83 }
84 public void start() {
85 }
86 public void matchFound(Resource first, Resource second) {
87 Iterator subit = _listeners.iterator();
88 while (subit.hasNext()) {
89 SmusherListener nextListener = (SmusherListener) subit.next();
90 nextListener.matchFound(first, second);
91 }
92 }
93
94 public void commit() {
95 }
96
97 public void finish() {
98 }
99
100 }
101
102 public void smush(SesameManager firstRepository, SesameManager secondRepository) throws OpenRDFException {
103
104
105
106
107 MetaListener metaListener = new MetaListener(_listeners);
108 CounterListener counterListener = new CounterListener();
109
110 for (int i = 0; i < _smushers.size(); i++) {
111 Smusher nextSmusher = (Smusher) _smushers.get(i);
112 nextSmusher.addListener(metaListener);
113 nextSmusher.addListener(counterListener);
114 }
115
116
117 Iterator it = _listeners.iterator();
118 while (it.hasNext()) {
119 SmusherListener nextListener = (SmusherListener) it.next();
120 nextListener.start();
121 }
122
123
124 for (int i = 0; i < _smushers.size(); i++) {
125 Smusher nextSmusher = (Smusher) _smushers.get(i);
126 nextSmusher.smush(firstRepository, secondRepository);
127 }
128
129
130 it = _listeners.iterator();
131 while (it.hasNext()) {
132 SmusherListener nextListener = (SmusherListener) it.next();
133 nextListener.commit();
134 }
135
136 _logger.debug("First iteration found " + counterListener.getCount() + " matches");
137
138
139
140 Smusher transSmusher = new TransitivitySmusher();
141 transSmusher.addListener(metaListener);
142 transSmusher.addListener(counterListener);
143
144 _lastCount = -1;
145 int newCount = 0;
146
147
148 while (newCount > _lastCount) {
149
150 _lastCount = newCount;
151 counterListener.reset();
152
153 transSmusher.smush(firstRepository, secondRepository);
154
155 newCount = counterListener.getCount();
156 _logger.debug("Last iteration found " + newCount + " matches");
157
158
159 it = _listeners.iterator();
160 while (it.hasNext()) {
161 SmusherListener nextListener = (SmusherListener) it.next();
162 nextListener.commit();
163 }
164 }
165 _lastCount = newCount;
166
167
168 it = _listeners.iterator();
169 while (it.hasNext()) {
170 SmusherListener nextListener = (SmusherListener) it.next();
171 nextListener.finish();
172 }
173
174 }
175
176
177
178
179 public int getLastCount() {
180 return _lastCount;
181 }
182
183
184 }
185