/*******************************************************************************
* 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 org.apache.http.Header;
import org.apache.http.HttpMessage;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import com.db4o.activation.ActivationPurpose;
import com.db4o.query.Query;
import com.subgraph.vega.api.model.conditions.IHttpCondition;
import com.subgraph.vega.api.model.conditions.IHttpConditionType;
import com.subgraph.vega.api.model.conditions.match.IHttpConditionMatchAction;
import com.subgraph.vega.internal.model.conditions.match.StringMatchActionSet;
public class ConditionHeader extends AbstractCondition {
static private transient IHttpConditionType requestConditionType;
static private transient IHttpConditionType responseConditionType;
static IHttpConditionType getRequestConditionType() {
synchronized (ConditionHeader.class) {
if(requestConditionType == null)
createTypes();
return requestConditionType;
}
}
static IHttpConditionType getResponseConditionType() {
synchronized(ConditionHeader.class) {
if(responseConditionType == null)
createTypes();
return responseConditionType;
}
}
private static void createTypes() {
requestConditionType = createType("request header", true);
responseConditionType = createType("response header", false);
}
private static IHttpConditionType createType(String label, final boolean flag) {
return new ConditionType(label, new StringMatchActionSet()) {
@Override
public IHttpCondition createConditionInstance(IHttpConditionMatchAction matchAction) {
return new ConditionHeader(flag, matchAction);
}
};
}
private final boolean matchRequestHeader;
ConditionHeader(boolean matchRequestHeader, IHttpConditionMatchAction matchAction) {
super(matchAction);
this.matchRequestHeader = matchRequestHeader;
}
@Override
public boolean matches(HttpRequest request) {
activate(ActivationPurpose.READ);
if(matchRequestHeader)
return matchesString(headersToString(request));
else
return false;
}
@Override
public boolean matches(HttpResponse response) {
activate(ActivationPurpose.READ);
if(!matchRequestHeader)
return matchesString(headersToString(response));
else
return false;
}
private String headersToString(HttpMessage message) {
if(message == null)
return "";
final StringBuilder sb = new StringBuilder();
for(Header h: message.getAllHeaders()) {
sb.append(h.getName());
sb.append(": ");
sb.append(h.getValue());
sb.append("\r\n");
}
return sb.toString();
}
@Override
public boolean matches(HttpRequest request, HttpResponse response) {
activate(ActivationPurpose.READ);
if(matchRequestHeader)
return matchesString(headersToString(request));
else
return matchesString(headersToString(response));
}
@Override
public IHttpConditionType getType() {
activate(ActivationPurpose.READ);
if(matchRequestHeader)
return getRequestConditionType();
else
return getResponseConditionType();
}
@Override
public void filterRequestLogQuery(Query query) {
activate(ActivationPurpose.READ);
if(matchRequestHeader)
constrainQuery(query.descend("requestHeaders"));
else
constrainQuery(query.descend("responseHeaders"));
}
}