/**
* Copyright (c) 2009-2011 VMware, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.springsource.insight.plugin.servlet;
import com.springsource.insight.intercept.operation.Operation;
import com.springsource.insight.intercept.operation.OperationFields;
import com.springsource.insight.intercept.operation.OperationMap;
import com.springsource.insight.intercept.operation.OperationType;
import com.springsource.insight.intercept.trace.AbstractTraceErrorAnalyzer;
import com.springsource.insight.intercept.trace.Frame;
import com.springsource.insight.intercept.trace.TraceError;
import com.springsource.insight.util.StringUtil;
public class HttpStatusTraceErrorAnalyzer extends AbstractTraceErrorAnalyzer {
private static final TraceError contextNotAvailableError = new TraceError("Context not available");
private static final HttpStatusTraceErrorAnalyzer INSTANCE = new HttpStatusTraceErrorAnalyzer();
public static final String STATUS_CODE_ATTR = "statusCode", REASON_PHRASE_ATTR = "reasonPhrase";
private HttpStatusTraceErrorAnalyzer() {
super(OperationType.HTTP);
}
public static final HttpStatusTraceErrorAnalyzer getInstance() {
return INSTANCE;
}
@Override
public TraceError locateFrameError(Frame httpFrame) {
Operation op = httpFrame.getOperation();
OperationMap response = op.get("response", OperationMap.class);
int statusCode = (response == null) ? (-1) : response.getInt(STATUS_CODE_ATTR, (-1));
if ((statusCode >= 0) && httpStatusIsError(statusCode)) {
return new TraceError(createErrorMessage(statusCode, response.get(REASON_PHRASE_ATTR, String.class)));
}
OperationMap request = op.get("request", OperationMap.class);
Boolean contextAvailable = (request == null) ? null : request.get(OperationFields.CONTEXT_AVAILABLE, Boolean.class);
if ((contextAvailable != null) && (!contextAvailable.booleanValue())) {
return contextNotAvailableError;
} else {
return null;
}
}
// TODO make this a general utility
static String createErrorMessage(int statusCode, String reasonPhrase) {
if (StringUtil.isEmpty(reasonPhrase)) {
return String.valueOf("Status code = " + statusCode);
} else {
return String.valueOf(statusCode) + " " + reasonPhrase;
}
}
// TODO make this a general utility
static boolean httpStatusIsError(int status) {
return (status < 100) || (status >= 400);
}
}