package com.onpositive.gae.baseviewer.requests;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import org.eclipse.core.runtime.IProgressMonitor;
import com.onpositive.gae.baseviewer.BaseDataFacade.Callback;
public class AndRequest implements IComplexQueryRequest {
private HashSet<IComplexQueryRequest> toAnd;
private boolean completed;
private boolean allcompleted;
private boolean cancelled;
public AndRequest(IComplexQueryRequest... q) {
toAnd = new HashSet<IComplexQueryRequest>(Arrays.asList(q));
}
public AndRequest(HashSet<IComplexQueryRequest> q) {
toAnd = q;
}
public void execute(IComplexFacade facade, Callback cb,
IProgressMonitor monitor) {
final HashMap<IComplexQueryRequest, HashSet<Object>> z = new HashMap<IComplexQueryRequest, HashSet<Object>>();
for (final IComplexQueryRequest q : toAnd) {
z.put(q, new HashSet<Object>());
if (cancelled){
return;
}
q.execute(facade, new Callback() {
public boolean objectFetched(Object object) {
synchronized (z) {
HashSet<Object> hashSet = z.get(q);
hashSet.add(object);
}
return false;
}
}, monitor);
}
if (cancelled){
return;
}
l2: while (true) {
sleep();
if (cancelled){
return;
}
for (final IComplexQueryRequest q : toAnd) {
if (!q.isCompleted()) {
continue l2;
}
}
break;
}
allcompleted = true;
for (final IComplexQueryRequest q : toAnd) {
allcompleted &= q.isAllResultsCompleted();
}
IComplexQueryRequest q = toAnd.iterator().next();
HashSet<Object> hashSet = z.get(q);
l2: for (Object o : hashSet) {
if (cancelled){
return;
}
for (final IComplexQueryRequest q1 : toAnd) {
if (q != q1) {
if (!z.get(q1).contains(o)) {
continue l2;
}
}
}
cb.objectFetched(o);
}
completed = true;
}
void sleep() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
public boolean isAllResultsCompleted() {
return allcompleted;
}
public boolean isCompleted() {
return completed;
}
public void cancel() {
cancelled=true;
for (final IComplexQueryRequest q : toAnd) {
q.cancel();
}
}
public void filter(HashSet<Object> r) {
// TODO Auto-generated method stub
}
}