org.apache.webdav.lib.methods.PollMethod.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.webdav.lib.methods.PollMethod.java

Source

/*
 * $Header$
 * $Revision: 208420 $
 * $Date: 2005-01-14 22:09:13 +0800 (Fri, 14 Jan 2005) $
 *
 * ====================================================================
 *
 * Copyright 1999-2002 The Apache Software Foundation 
 *
 * 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 org.apache.webdav.lib.methods;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

import org.apache.commons.httpclient.HttpConnection;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpState;
import org.apache.commons.httpclient.HttpStatus;

import org.apache.webdav.lib.util.DOMUtils;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

/**
 * Implements the POLL WebDAV method.
 * 
 * @see <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/e2k3/e2k3/_webdav_poll.asp">Reference</a>
 */
public class PollMethod extends XMLResponseMethodBase {
    private static final String HEADER_SUBSCRIPTION_ID = "Subscription-Id";
    private static final String EXCHANGE_NS = "http://schemas.microsoft.com/Exchange/";
    private List subscriptionIds = new ArrayList();
    private List subscriptionsWithEvents = new ArrayList();
    private List subscriptionsWithoutEvents = new ArrayList();

    public PollMethod() {

    }

    public PollMethod(String path) {
        super(path);
    }

    /**
     * Adds an ID for a subscription that is to be polled. All added subscription
     * IDs should have the got same Content-Location uri from the SUBSCRIBE method. 
     */
    public void addSubscriptionId(int id) {
        checkNotUsed();
        this.subscriptionIds.add(new Integer(id));
    }

    /**
     * Returns a list of number objects containing the subscription IDs for
     * subscriptions for which events are reported.
     * @return Collection of {@link Integer}s
     */
    public Collection getSubscriptionsWithEvents() {
        checkUsed();
        return this.subscriptionsWithEvents;
    }

    /**
     * Returns a list of number objects containing the subscription IDs for
     * subscriptions for which <em>NO</em> events are reported.
     * @return Collection of {@link Integer}s
     */
    public Collection getSubscriptionsWithoutEvents() {
        checkUsed();
        return this.subscriptionsWithoutEvents;
    }

    // --------------------------------------------------- WebdavMethod Methods

    public String getName() {
        return "POLL";
    }

    public void recycle() {
        super.recycle();
        this.subscriptionIds.clear();
    }

    protected void addRequestHeaders(HttpState state, HttpConnection conn) throws IOException, HttpException {
        super.addRequestHeaders(state, conn);
        if (this.subscriptionIds.size() > 0) {
            StringBuffer b = new StringBuffer();
            boolean first = true;
            for (Iterator i = this.subscriptionIds.iterator(); i.hasNext();) {
                if (first)
                    first = false;
                else
                    b.append(", ");
                b.append(i.next());
            }
            super.addRequestHeader(HEADER_SUBSCRIPTION_ID, b.toString());
        }
    }

    /**
     * Adds special checking of header values of the POLL method to
     * the super class implementation.
     */
    public void setRequestHeader(String headerName, String headerValue) {
        if (headerName.equalsIgnoreCase(HEADER_SUBSCRIPTION_ID)) {
            StringTokenizer t = new StringTokenizer(headerValue, ", ");
            try {
                for (; t.hasMoreTokens();) {
                    addSubscriptionId(Integer.parseInt(t.nextToken()));
                }
            } catch (NumberFormatException e) {
                throw new IllegalArgumentException(
                        "Invalid header value '" + headerValue + "' for header " + headerName + "!");
            }
        } else {
            super.setRequestHeader(headerName, headerValue);
        }
    }

    public void parseResponse(InputStream input, HttpState state, HttpConnection conn)
            throws IOException, HttpException {
        int status = getStatusLine().getStatusCode();

        if (status == HttpStatus.SC_MULTI_STATUS) {
            parseXMLResponse(input);
            NodeList list = getResponseDocument().getDocumentElement().getElementsByTagNameNS("DAV:", "response");

            for (int i = 0; i < list.getLength(); i++) {
                Element e = (Element) list.item(i);

                NodeList s = e.getElementsByTagNameNS("DAV:", "status");
                if (s.getLength() > 0) {
                    Element response = ((Element) (s.item(0)).getParentNode());
                    String statusText = DOMUtils.getTextValue(s.item(0));
                    if (statusText.indexOf(" 200 ") != -1) {
                        // polled subscriptions for which *AN* event is fired
                        NodeList p = response.getElementsByTagNameNS(EXCHANGE_NS, "subscriptionID");
                        if (p.getLength() > 0) {
                            NodeList li = ((Element) p.item(0)).getElementsByTagName("li");
                            for (int l = 0; l < li.getLength(); ++l) {
                                String id = DOMUtils.getTextValue(li.item(i));
                                this.subscriptionsWithEvents.add(Integer.getInteger(id));
                            }
                        }
                    } else if (statusText.indexOf(" 204 ") != -1) {
                        // polled subscriptions for which *NO* event is fired
                        NodeList p = response.getElementsByTagNameNS(EXCHANGE_NS, "subscriptionID");
                        if (p.getLength() > 0) {
                            NodeList li = ((Element) p.item(0)).getElementsByTagName("li");
                            for (int l = 0; l < li.getLength(); ++l) {
                                String id = DOMUtils.getTextValue(li.item(i));
                                this.subscriptionsWithoutEvents.add(Integer.getInteger(id));
                            }
                        }
                    }
                }
            }
        }
    }
}