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.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44
45
46
47
48
49
50 public class IterativeSmusher extends AbstractSmusher {
51
52 protected List<Smusher> _smushers = new ArrayList<Smusher>();
53 protected int _lastCount = -1;
54 protected final static Logger _logger = LoggerFactory.getLogger(IterativeSmusher.class);
55
56 public IterativeSmusher() {
57
58 }
59
60 public void addSmusher(Smusher smusher) {
61 if (smusher != null) {
62 _smushers.add(smusher);
63 }
64 }
65
66 public void removeSmusher(Smusher smusher) {
67 if (smusher != null) {
68 _smushers.remove(smusher);
69 }
70 }
71
72 private class MetaListener implements SmusherListener {
73
74 Collection<SmusherListener> _listeners = new HashSet<SmusherListener>();
75
76 public MetaListener(Collection<SmusherListener> listeners) {
77 _listeners = listeners;
78 }
79 public void start() {
80 }
81
82 public void matchFound(Resource first, Resource second) {
83 Iterator subit = _listeners.iterator();
84 while (subit.hasNext()) {
85 SmusherListener nextListener = (SmusherListener) subit.next();
86 nextListener.matchFound(first, second);
87 }
88 }
89
90 public void commit() {
91 }
92
93 public void finish() {
94 }
95
96 }
97
98 public void smush(SesameManager firstRepository, SesameManager secondRepository) throws OpenRDFException {
99
100
101
102
103 MetaListener metaListener = new MetaListener(_listeners);
104 CounterListener counterListener = new CounterListener();
105
106 for (int i = 0; i < _smushers.size(); i++) {
107 Smusher nextSmusher = (Smusher) _smushers.get(i);
108 nextSmusher.addListener(metaListener);
109 nextSmusher.addListener(counterListener);
110 }
111
112
113 Iterator it = _listeners.iterator();
114 while (it.hasNext()) {
115 SmusherListener nextListener = (SmusherListener) it.next();
116 nextListener.start();
117 }
118
119 _lastCount = -1;
120 int newCount = 0;
121
122
123 while (newCount > _lastCount) {
124
125 _lastCount = newCount;
126 counterListener.reset();
127
128 for (int i = 0; i < _smushers.size(); i++) {
129 Smusher nextSmusher = (Smusher) _smushers.get(i);
130 nextSmusher.smush(firstRepository, secondRepository);
131 }
132
133
134 it = _listeners.iterator();
135 while (it.hasNext()) {
136 SmusherListener nextListener = (SmusherListener) it.next();
137 nextListener.commit();
138 }
139
140 newCount = counterListener.getCount();
141 _logger.debug("Last iteration found " + newCount + " matches");
142 }
143 _lastCount = newCount;
144
145
146 it = _listeners.iterator();
147 while (it.hasNext()) {
148 SmusherListener nextListener = (SmusherListener) it.next();
149 nextListener.finish();
150 }
151
152 }
153
154
155
156
157 public int getLastCount() {
158 return _lastCount;
159 }
160
161
162 }