/*******************************************************************************
* Copyright (c) 2011 Subgraph.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Subgraph - initial API and implementation
******************************************************************************/
package com.subgraph.vega.internal.model.conditions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import com.db4o.ObjectContainer;
import com.db4o.activation.ActivationPurpose;
import com.db4o.activation.Activator;
import com.db4o.collections.ActivatableArrayList;
import com.db4o.query.Query;
import com.db4o.ta.Activatable;
import com.subgraph.vega.api.model.conditions.IHttpCondition;
import com.subgraph.vega.api.model.conditions.IHttpConditionManager;
import com.subgraph.vega.api.model.conditions.IHttpConditionSet;
import com.subgraph.vega.api.model.requests.IRequestLogRecord;
public class HttpConditionSet implements IHttpConditionSet, Activatable {
private final String name;
private final List<IHttpCondition> conditionList = new ActivatableArrayList<IHttpCondition>();
private boolean matchOnEmptySet;
private transient HttpConditionManager conditionManager;
HttpConditionSet(String name, HttpConditionManager conditionManager) {
this(name, conditionManager, null);
}
HttpConditionSet(String name, HttpConditionManager conditionManager, IHttpConditionSet copyMe) {
this.name = name;
this.conditionManager = conditionManager;
if(copyMe != null) {
for(IHttpCondition c: copyMe.getAllConditions())
conditionList.add(c.createCopy());
}
}
@Override
public String getName() {
activate(ActivationPurpose.READ);
return name;
}
@Override
public boolean matchesAll(HttpRequest request, HttpResponse response) {
activate(ActivationPurpose.READ);
return matchesAllConditions(request, response);
}
@Override
public boolean matchesAny(HttpRequest request, HttpResponse response) {
activate(ActivationPurpose.READ);
return matchesAnyCondition(request, response);
}
private boolean matchesAllConditions(HttpRequest request, HttpResponse response) {
activate(ActivationPurpose.READ);
synchronized(conditionList) {
if (conditionList.size() == 0) {
return matchOnEmptySet;
}
for(IHttpCondition c: conditionList) {
if(c.isEnabled() && !c.matches(request, response))
return false;
}
return true;
}
}
private boolean matchesAnyCondition(HttpRequest request, HttpResponse response) {
activate(ActivationPurpose.READ);
synchronized(conditionList) {
if (conditionList.size() == 0) {
return matchOnEmptySet;
}
for(IHttpCondition c: conditionList) {
if(c.isEnabled() && c.matches(request, response)) {
return true;
}
}
return false;
}
}
@Override
public void appendCondition(IHttpCondition condition) {
activate(ActivationPurpose.READ);
conditionList.add(condition);
conditionManager.notifyConditionSetChanged(this);
}
@Override
public void removeCondition(IHttpCondition condition) {
activate(ActivationPurpose.READ);
conditionList.remove(condition);
conditionManager.notifyConditionSetChanged(this);
}
@Override
public void clearConditions() {
activate(ActivationPurpose.READ);
conditionList.clear();
conditionManager.notifyConditionSetChanged(this);
}
@Override
public List<IHttpCondition> getAllConditions() {
activate(ActivationPurpose.READ);
return new ArrayList<IHttpCondition>(conditionList);
}
@Override
public IHttpConditionManager getConditionManager() {
activate(ActivationPurpose.READ);
return conditionManager;
}
void setConditionManager(HttpConditionManager conditionManager) {
activate(ActivationPurpose.WRITE);
this.conditionManager = conditionManager;
}
public List<IRequestLogRecord> filterRequestLog(ObjectContainer db) {
activate(ActivationPurpose.READ);
if(!hasRecords(db)) {
return Collections.emptyList();
}
final Query query = db.query();
query.constrain(IRequestLogRecord.class);
for(IHttpCondition c: conditionList) {
((AbstractCondition) c).filterRequestLogQuery(query);
}
return query.execute();
}
private boolean hasRecords(ObjectContainer db) {
final Query query = db.query();
query.constrain(IRequestLogRecord.class);
return query.execute().size() > 0;
}
@Override
public void setMatchOnEmptySet(boolean flag) {
activate(ActivationPurpose.WRITE);
matchOnEmptySet = flag;
}
private transient Activator activator;
@Override
public void activate(ActivationPurpose activationPurpose) {
if(activator != null) {
activator.activate(activationPurpose);
}
}
@Override
public void bind(Activator activator) {
if(this.activator == activator) {
return;
}
if(activator != null && this.activator != null) {
throw new IllegalStateException("Object can only be bound to one activator");
}
this.activator = activator;
}
}