1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/* 2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Copyright 2009 Mike Cumings 3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License. 6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * http://www.apache.org/licenses/LICENSE-2.0 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS, 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License. 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage com.kenai.jbosh; 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.concurrent.locks.Condition; 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.concurrent.locks.Lock; 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.concurrent.locks.ReentrantLock; 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.logging.Level; 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.logging.Logger; 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * A request and response pair representing a single exchange with a remote 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * content manager. This is primarily a container class intended to maintain 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * the relationship between the request and response but allows the response 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * to be added after the fact. 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenfinal class HTTPExchange { 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Logger. 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private static final Logger LOG = 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Logger.getLogger(HTTPExchange.class.getName()); 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Request body. 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private final AbstractBody request; 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Lock instance used to protect and provide conditions. 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private final Lock lock = new ReentrantLock(); 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Condition used to signal when the response has been set. 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private final Condition ready = lock.newCondition(); 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * HTTPResponse instance. 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private HTTPResponse response; 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /////////////////////////////////////////////////////////////////////////// 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Constructor: 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Create a new request/response pair object. 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param req request message body 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen HTTPExchange(final AbstractBody req) { 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (req == null) { 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw(new IllegalArgumentException("Request body cannot be null")); 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen request = req; 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /////////////////////////////////////////////////////////////////////////// 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Package-private methods: 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Get the original request message. 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return request message body. 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen AbstractBody getRequest() { 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return request; 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Set the HTTPResponse instance. 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return HTTPResponse instance associated with the request. 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen void setHTTPResponse(HTTPResponse resp) { 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen lock.lock(); 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen try { 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (response != null) { 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw(new IllegalStateException( 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "HTTPResponse was already set")); 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen response = resp; 99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen ready.signalAll(); 100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } finally { 101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen lock.unlock(); 102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Get the HTTPResponse instance. 107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return HTTPResponse instance associated with the request. 109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen HTTPResponse getHTTPResponse() { 111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen lock.lock(); 112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen try { 113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen while (response == null) { 114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen try { 115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen ready.await(); 116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } catch (InterruptedException intx) { 117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen LOG.log(Level.FINEST, "Interrupted", intx); 118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return response; 121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } finally { 122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen lock.unlock(); 123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 127