Java tutorial
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.synapse.transport.utils.logging; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.http.Header; import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.config.ConnectionConfig; import org.apache.http.config.MessageConstraints; import org.apache.http.impl.ConnSupport; import org.apache.http.impl.entity.StrictContentLengthStrategy; import org.apache.http.impl.nio.DefaultNHttpServerConnection; import org.apache.http.impl.nio.codecs.DefaultHttpRequestParser; import org.apache.http.impl.nio.codecs.DefaultHttpResponseWriter; import org.apache.http.nio.*; import org.apache.http.nio.reactor.IOSession; import org.apache.http.nio.reactor.SessionInputBuffer; import org.apache.http.nio.reactor.SessionOutputBuffer; import org.apache.http.nio.util.HeapByteBufferAllocator; import java.io.IOException; /** * A connection factory implementation for DefaultNHttpServerConnection instances. * Based on the current logging configuration, this factory decides whether to create * regular DefaultNHttpServerConnection objects or to create LoggingNHttpServerConnection * objects. Also, depending on the logging configuration, this factory may choose to * wrap IOSession instances in LoggingIOSession objects. */ public class LoggingNHttpServerConnectionFactory implements NHttpConnectionFactory<DefaultNHttpServerConnection> { private static final Log sourceConnLog = LogFactory.getLog(LoggingConstants.SOURCE_CONNECTION_LOG_ID); private static final Log sourceHeaderLog = LogFactory.getLog(LoggingConstants.SOURCE_HEADER_LOG_ID); private static final Log sourceSessionLog = LogFactory.getLog(LoggingConstants.SOURCE_SESSION_LOG_ID); private static final Log sourceWireLog = LogFactory.getLog(LoggingConstants.SOURCE_WIRE_LOG_ID); private static final NHttpMessageParserFactory<HttpRequest> requestParserFactory = new LoggingNHttpRequestParserFactory(); private static final NHttpMessageWriterFactory<HttpResponse> responseWriterFactory = new LoggingNHttpResponseWriterFactory(); private final ConnectionConfig config; public LoggingNHttpServerConnectionFactory(ConnectionConfig config) { this.config = config; } public DefaultNHttpServerConnection createConnection(IOSession session) { if (sourceSessionLog.isDebugEnabled() || sourceWireLog.isDebugEnabled()) { session = new LoggingIOSession(sourceSessionLog, sourceWireLog, session, "http-listener"); } if (sourceConnLog.isDebugEnabled()) { return new LoggingNHttpServerConnection(session, config.getBufferSize(), config.getFragmentSizeHint(), HeapByteBufferAllocator.INSTANCE, ConnSupport.createDecoder(config), ConnSupport.createEncoder(config), config.getMessageConstraints(), StrictContentLengthStrategy.INSTANCE, StrictContentLengthStrategy.INSTANCE, requestParserFactory, responseWriterFactory, sourceConnLog); } else { return new DefaultNHttpServerConnection(session, config.getBufferSize(), config.getFragmentSizeHint(), HeapByteBufferAllocator.INSTANCE, ConnSupport.createDecoder(config), ConnSupport.createEncoder(config), config.getMessageConstraints(), StrictContentLengthStrategy.INSTANCE, StrictContentLengthStrategy.INSTANCE, requestParserFactory, responseWriterFactory); } } static class LoggingNHttpRequestParserFactory implements NHttpMessageParserFactory<HttpRequest> { public NHttpMessageParser<HttpRequest> create(SessionInputBuffer sessionBuffer, MessageConstraints messageConstraints) { return new LoggingNHttpRequestParser(sessionBuffer, messageConstraints); } } static class LoggingNHttpResponseWriterFactory implements NHttpMessageWriterFactory<HttpResponse> { public NHttpMessageWriter<HttpResponse> create(SessionOutputBuffer sessionBuffer) { return new LoggingNHttpResponseWriter(sessionBuffer); } } static class LoggingNHttpRequestParser extends DefaultHttpRequestParser { public LoggingNHttpRequestParser(SessionInputBuffer buffer, MessageConstraints constraints) { super(buffer, constraints); } public HttpRequest parse() throws IOException, HttpException { HttpRequest request = super.parse(); if (request != null && sourceHeaderLog.isDebugEnabled()) { sourceHeaderLog.debug(">> " + request.getRequestLine().toString()); Header[] headers = request.getAllHeaders(); for (Header header : headers) { sourceHeaderLog.debug(">> " + header.toString()); } } return request; } } static class LoggingNHttpResponseWriter extends DefaultHttpResponseWriter { public LoggingNHttpResponseWriter(SessionOutputBuffer buffer) { super(buffer); } public void write(final HttpResponse response) throws IOException, HttpException { if (response != null && sourceHeaderLog.isDebugEnabled()) { sourceHeaderLog.debug("<< " + response.getStatusLine().toString()); Header[] headers = response.getAllHeaders(); for (Header header : headers) { sourceHeaderLog.debug("<< " + header.toString()); } } super.write(response); } } }