org.mobicents.xcap.client.impl.XcapClientImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.mobicents.xcap.client.impl.XcapClientImpl.java

Source

/*
 * JBoss, Home of Professional Open Source
 * Copyright 2011, Red Hat, Inc. and individual contributors
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */

package org.mobicents.xcap.client.impl;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.util.Arrays;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.params.SyncBasicHttpParams;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.mobicents.xcap.client.XcapClient;
import org.mobicents.xcap.client.XcapConstant;
import org.mobicents.xcap.client.XcapResponse;
import org.mobicents.xcap.client.auth.Credentials;
import org.mobicents.xcap.client.header.Header;
import org.mobicents.xcap.client.impl.auth.CredentialsFactoryImpl;
import org.mobicents.xcap.client.impl.auth.CredentialsImpl;
import org.mobicents.xcap.client.impl.auth.SingleCredentialsProvider;
import org.mobicents.xcap.client.impl.header.HeaderFactoryImpl;
import org.mobicents.xcap.client.impl.header.HeaderImpl;

/**
 * Impl of the {@link XcapClient}.
 * 
 * @author martins
 * 
 */
public class XcapClientImpl implements XcapClient {

    private static final Log log = LogFactory.getLog(XcapClientImpl.class);

    private final DefaultHttpClient client;

    private final XcapResponseHandler responseHandler = new XcapResponseHandler();
    private final SingleCredentialsProvider credentialsProvider = new SingleCredentialsProvider();
    private final HeaderFactoryImpl headerFactory = new HeaderFactoryImpl();
    private final CredentialsFactoryImpl credentialsFactory = new CredentialsFactoryImpl();

    /**
     * 
     */
    public XcapClientImpl() {
        HttpParams params = new SyncBasicHttpParams();
        params.setParameter(HttpProtocolParams.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
        //params.setBooleanParameter(HttpProtocolParams.USE_EXPECT_CONTINUE,
        //        false);
        //params.setBooleanParameter(HttpConnectionParams.STALE_CONNECTION_CHECK,
        //        false);
        //params.setIntParameter(HttpConnectionParams.SOCKET_BUFFER_SIZE,
        //        8 * 1024);
        //params.setIntParameter(HttpConnectionParams.SO_TIMEOUT,
        //        15000);
        params.setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
        SchemeRegistry schemeRegistry = new SchemeRegistry();
        schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
        schemeRegistry.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory()));
        this.client = new DefaultHttpClient(new ThreadSafeClientConnManager(schemeRegistry), params);
        this.client.setHttpRequestRetryHandler(new HttpRequestRetryHandler() {

            public boolean retryRequest(final IOException exception, int executionCount,
                    final HttpContext context) {
                return false;
            }

        });
        client.setCredentialsProvider(credentialsProvider);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.mobicents.xcap.client.XcapClient#getCredentialsFactory()
     */
    public CredentialsFactoryImpl getCredentialsFactory() {
        return credentialsFactory;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.mobicents.xcap.client.XcapClient#getHeaderFactory()
     */
    public HeaderFactoryImpl getHeaderFactory() {
        return headerFactory;
    }

    // CLIENT MANAGEMENT

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.mobicents.xcap.client.XcapClient#setAuthenticationCredentials(org
     * .mobicents.xcap.client.auth.Credentials)
     */
    public void setAuthenticationCredentials(Credentials credentials) {
        credentialsProvider.setCredentials(((CredentialsImpl) credentials).getWrappedCredentials());
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.mobicents.xcap.client.XcapClient#unsetAuthenticationCredentials()
     */
    public void unsetAuthenticationCredentials() {
        credentialsProvider.setCredentials(null);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.mobicents.xcap.client.XcapClient#shutdown()
     */
    public void shutdown() {
        log.info("shutdown()");
        if (client != null) {
            client.getConnectionManager().shutdown();
        }
    }

    // CLIENT OPERATIONS

    private static final HttpContext NULL_HTTP_CONTEXT = null;

    private XcapResponse execute(HttpUriRequest request, Header[] additionalRequestHeaders, Credentials credentials)
            throws IOException {

        if (additionalRequestHeaders != null) {
            for (Header header : additionalRequestHeaders) {
                request.addHeader(((HeaderImpl) header).getWrappedHeader());
            }
        }

        HttpContext httpContext = NULL_HTTP_CONTEXT;
        if (credentials != null) {
            httpContext = new BasicHttpContext();
            httpContext.setAttribute(ClientContext.CREDS_PROVIDER,
                    new SingleCredentialsProvider(((CredentialsImpl) credentials).getWrappedCredentials()));
        }

        final XcapResponseImpl response = client.execute(request, responseHandler, httpContext);

        if (log.isDebugEnabled()) {
            log.debug("Received:\n--BEGIN--\n" + response.toString() + "\n--END--");
        }

        return response;
    }

    private void setRequestEntity(HttpPut request, String content, String mimetype)
            throws UnsupportedEncodingException {
        request.setHeader(XcapConstant.HEADER_CONTENT_TYPE, mimetype);
        request.setEntity(new StringEntity(content, "UTF-8"));
    }

    private void setRequestEntity(HttpPut request, byte[] content, String mimetype)
            throws UnsupportedEncodingException {
        request.setHeader(XcapConstant.HEADER_CONTENT_TYPE, mimetype);
        request.setEntity(new ByteArrayEntity(content));
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.mobicents.xcap.client.XcapClient#get(java.net.URI,
     * org.mobicents.xcap.client.header.Header[],
     * org.mobicents.xcap.client.auth.Credentials)
     */
    public XcapResponse get(URI uri, Header[] additionalRequestHeaders, Credentials credentials)
            throws IOException {

        if (log.isDebugEnabled()) {
            log.debug("get(uri=" + uri + " , additionalRequestHeaders = ( "
                    + Arrays.toString(additionalRequestHeaders) + " ) )");
        }

        return execute(new HttpGet(uri), additionalRequestHeaders, credentials);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.mobicents.xcap.client.XcapClient#put(java.net.URI,
     * java.lang.String, java.lang.String,
     * org.mobicents.xcap.client.header.Header[],
     * org.mobicents.xcap.client.auth.Credentials)
     */
    public XcapResponse put(URI uri, String mimetype, String content, Header[] additionalRequestHeaders,
            Credentials credentials) throws IOException {

        if (log.isDebugEnabled()) {
            log.debug("put(uri=" + uri + ", mimetype=" + mimetype + ", content=" + content
                    + " , additionalRequestHeaders = ( " + Arrays.toString(additionalRequestHeaders) + " ) )");
        }

        final HttpPut request = new HttpPut(uri);
        setRequestEntity(request, content, mimetype);
        return execute(request, additionalRequestHeaders, credentials);

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.mobicents.xcap.client.XcapClient#putIfMatch(java.net.URI,
     * java.lang.String, java.lang.String, java.lang.String,
     * org.mobicents.xcap.client.header.Header[],
     * org.mobicents.xcap.client.auth.Credentials)
     */
    public XcapResponse putIfMatch(URI uri, String eTag, String mimetype, String content,
            Header[] additionalRequestHeaders, Credentials credentials) throws IOException {

        if (log.isDebugEnabled()) {
            log.debug("putIfMatch(uri=" + uri + ", eTag=" + eTag + ", mimetype=" + mimetype + ", content=" + content
                    + " , additionalRequestHeaders = ( " + Arrays.toString(additionalRequestHeaders) + " ) )");
        }

        final HttpPut request = new HttpPut(uri);
        setRequestEntity(request, content, mimetype);
        request.setHeader(XcapConstant.HEADER_IF_MATCH, eTag);
        return execute(request, additionalRequestHeaders, credentials);

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.mobicents.xcap.client.XcapClient#putIfNoneMatch(java.net.URI,
     * java.lang.String, java.lang.String, java.lang.String,
     * org.mobicents.xcap.client.header.Header[],
     * org.mobicents.xcap.client.auth.Credentials)
     */
    public XcapResponse putIfNoneMatch(URI uri, String eTag, String mimetype, String content,
            Header[] additionalRequestHeaders, Credentials credentials) throws IOException {

        if (log.isDebugEnabled()) {
            log.debug("putIfNoneMatch(uri=" + uri + ", eTag=" + eTag + ", mimetype=" + mimetype + ", content="
                    + content + " , additionalRequestHeaders = ( " + Arrays.toString(additionalRequestHeaders)
                    + " ) )");
        }

        final HttpPut request = new HttpPut(uri);
        setRequestEntity(request, content, mimetype);
        request.setHeader(XcapConstant.HEADER_IF_NONE_MATCH, eTag);
        return execute(request, additionalRequestHeaders, credentials);

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.mobicents.xcap.client.XcapClient#put(java.net.URI,
     * java.lang.String, byte[], org.mobicents.xcap.client.header.Header[],
     * org.mobicents.xcap.client.auth.Credentials)
     */
    public XcapResponse put(URI uri, String mimetype, byte[] content, Header[] additionalRequestHeaders,
            Credentials credentials) throws IOException {

        if (log.isDebugEnabled()) {
            log.debug("put(uri=" + uri + ", mimetype=" + mimetype + ", content=" + content
                    + " , additionalRequestHeaders = ( " + Arrays.toString(additionalRequestHeaders) + " ) )");
        }

        final HttpPut request = new HttpPut(uri);
        setRequestEntity(request, content, mimetype);
        return execute(request, additionalRequestHeaders, credentials);

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.mobicents.xcap.client.XcapClient#putIfMatch(java.net.URI,
     * java.lang.String, java.lang.String, byte[],
     * org.mobicents.xcap.client.header.Header[],
     * org.mobicents.xcap.client.auth.Credentials)
     */
    public XcapResponse putIfMatch(URI uri, String eTag, String mimetype, byte[] content,
            Header[] additionalRequestHeaders, Credentials credentials) throws IOException {

        if (log.isDebugEnabled()) {
            log.debug("putIfMatch(uri=" + uri + ", eTag=" + eTag + ", mimetype=" + mimetype + ", content=" + content
                    + " , additionalRequestHeaders = ( " + Arrays.toString(additionalRequestHeaders) + " ) )");
        }

        final HttpPut request = new HttpPut(uri);
        setRequestEntity(request, content, mimetype);
        request.setHeader(XcapConstant.HEADER_IF_MATCH, eTag);
        return execute(request, additionalRequestHeaders, credentials);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.mobicents.xcap.client.XcapClient#putIfNoneMatch(java.net.URI,
     * java.lang.String, java.lang.String, byte[],
     * org.mobicents.xcap.client.header.Header[],
     * org.mobicents.xcap.client.auth.Credentials)
     */
    public XcapResponse putIfNoneMatch(URI uri, String eTag, String mimetype, byte[] content,
            Header[] additionalRequestHeaders, Credentials credentials) throws IOException {

        if (log.isDebugEnabled()) {
            log.debug("putIfNoneMatch(uri=" + uri + ", eTag=" + eTag + ", mimetype=" + mimetype + ", content="
                    + content + " , additionalRequestHeaders = ( " + Arrays.toString(additionalRequestHeaders)
                    + " ) )");
        }

        final HttpPut request = new HttpPut(uri);
        setRequestEntity(request, content, mimetype);
        request.setHeader(XcapConstant.HEADER_IF_NONE_MATCH, eTag);
        return execute(request, additionalRequestHeaders, credentials);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.mobicents.xcap.client.XcapClient#delete(java.net.URI,
     * org.mobicents.xcap.client.header.Header[],
     * org.mobicents.xcap.client.auth.Credentials)
     */
    public XcapResponse delete(URI uri, Header[] additionalRequestHeaders, Credentials credentials)
            throws IOException {

        if (log.isDebugEnabled()) {
            log.debug("delete(uri=" + uri + " , additionalRequestHeaders = ( "
                    + Arrays.toString(additionalRequestHeaders) + " ) )");
        }

        return execute(new HttpDelete(uri), additionalRequestHeaders, credentials);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.mobicents.xcap.client.XcapClient#deleteIfMatch(java.net.URI,
     * java.lang.String, org.mobicents.xcap.client.header.Header[],
     * org.mobicents.xcap.client.auth.Credentials)
     */
    public XcapResponse deleteIfMatch(URI uri, String eTag, Header[] additionalRequestHeaders,
            Credentials credentials) throws IOException {

        if (log.isDebugEnabled()) {
            log.debug("deleteIfMatch(uri=" + uri + ", eTag=" + eTag + " , additionalRequestHeaders = ( "
                    + Arrays.toString(additionalRequestHeaders) + " ) )");
        }

        final HttpDelete request = new HttpDelete(uri);
        request.setHeader(XcapConstant.HEADER_IF_MATCH, eTag);
        return execute(request, additionalRequestHeaders, credentials);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.mobicents.xcap.client.XcapClient#deleteIfNoneMatch(java.net.URI,
     * java.lang.String, org.mobicents.xcap.client.header.Header[],
     * org.mobicents.xcap.client.auth.Credentials)
     */
    public XcapResponse deleteIfNoneMatch(URI uri, String eTag, Header[] additionalRequestHeaders,
            Credentials credentials) throws IOException {

        if (log.isDebugEnabled()) {
            log.debug("deleteIfNoneMatch( uri = " + uri + " , eTag = " + eTag + " , additionalRequestHeaders = ( "
                    + Arrays.toString(additionalRequestHeaders) + " ) )");
        }

        final HttpDelete request = new HttpDelete(uri);
        request.setHeader(XcapConstant.HEADER_IF_NONE_MATCH, eTag);
        return execute(request, additionalRequestHeaders, credentials);
    }

}