⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpmessage.java

📁 jxme的一些相关程序,主要是手机上程序开发以及手机和计算机通信的一些程序资料,程序编译需要Ant支持
💻 JAVA
字号:
/************************************************************************
 *
 * $Id: HttpMessage.java,v 1.2 2002/03/04 21:42:57 echtcherbina Exp $
 *
 * Copyright (c) 2001 Sun Microsystems, Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *       Sun Microsystems, Inc. for Project JXTA."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA"
 *    must not be used to endorse or promote products derived from this
 *    software without prior written permission. For written
 *    permission, please contact Project JXTA at http://www.jxta.org.
 *
 * 5. Products derived from this software may not be called "JXTA",
 *    nor may "JXTA" appear in their name, without prior written
 *    permission of Sun.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL SUN MICROSYSTEMS OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of Project JXTA.  For more
 * information on Project JXTA, please see
 * <http://www.jxta.org/>.
 *
 * This license is based on the BSD license adopted by the Apache Foundation.
 *********************************************************************************/


package net.jxta.impl.endpoint.http;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.SequenceInputStream;
import java.util.Vector;

import org.apache.log4j.Category; import org.apache.log4j.Priority;

/**
 * This class defines the wire format of HTTP messages. It also acts as an
 * interface to the cm
 */
public class HttpMessage {
    
    private static final Category LOG = Category.getInstance(HttpMessage.class.getName());
    
    private String dn = null;
    private String fn = null;
    private String doc = null;
    
    public static final String CodeTag = "Code";
    public static final String ContentTag = "Msg";
    
    public static final int Ok = 1;
    public static final int Failed = 2;
    public static final int Empty = 3;
    public static final int Content = 4;
    
    public static final HttpMessage OKMESSAGE = new HttpMessage( Ok );
    public static final HttpMessage FAILEDMESSAGE = new HttpMessage( Failed );
    public static final HttpMessage EMPTYMESSAGE = new HttpMessage( Empty );

    private static final long MessageLifeTime = 5 * 60 * 1000; // 5 Minutes
    
    // This constructor is used to send a reply containing
    // only a return code.
    
    public HttpMessage(int code) {
        
        doc =  "<" + CodeTag + ">" + Integer.toString(code) +
        "</" + CodeTag + ">";
    }
    
    // This constructor is used to create a HttpMessage off a
    // a String (receiving side).
    
    public HttpMessage( String buffer ) {
        doc = buffer;
    }
    
    public HttpMessage(int code, String buffer ) {
        
        String docstart =  "<" + CodeTag + ">" + Integer.toString(code) +
        "</" + CodeTag + ">" + "<" + ContentTag + ">\n";
        String docend = "</" + ContentTag + ">";
        
        doc = docstart + buffer + docend;
    }
    
    public HttpMessage(byte[] buffer) {
        doc = new String(buffer);
    }
    
    // This constructore is used to send a cmd with a content
    // stored in the CM
    public HttpMessage(String dn, String fn) {
        
        this.dn = dn;
        this.fn = fn;
    }
    
    // This constructor is used to send a msg with a content
    // stored in the CM
    public HttpMessage(String dn, String fn, int code, Vector buffers) {
        this( dn, fn, code, combineBuffers( buffers ) );
    }
    
    // This constructor is used to send a msg with a content
    // stored in the CM
    public HttpMessage(String dn, String fn, Vector buffers) {
        this( dn, fn, combineBuffers( buffers ) );
    }
    
    /**
     *  combines a vector of byte array buffers into an inputStream
     **/
    private static InputStream combineBuffers( Vector buffers ) {
        Vector streamParts = new Vector( buffers.size() );
        
        for( int each = 0; each < buffers.size(); each++ )
            streamParts.addElement(
            new ByteArrayInputStream( (byte[]) buffers.elementAt(each) ) );
        
        InputStream combined = new SequenceInputStream( streamParts.elements() );
        
        return combined;
    }
    
    // This constructor is used to send a msg with a content
    // stored in the CM
    public HttpMessage(String dn, String fn, byte[] buffer) {
        
        this( dn, fn, HttpMessage.Content, new ByteArrayInputStream( buffer ) );
    }
    
    // This constructor is used to send a msg with a content
    // stored in the CM
    public HttpMessage(String dn, String fn, InputStream is ) {
        this( dn, fn, HttpMessage.Content, is );
    }
    
    // This constructor is used to send a msg with a content
    // stored in the CM
    public HttpMessage(String dn, String fn, int code, InputStream is ) {
        this( dn, fn );
        
        String docstart =  "<" + CodeTag + ">" + Integer.toString(code) +
        "</" + CodeTag + ">" + "<" + ContentTag + ">\n";
        String docend = "</" + ContentTag + ">";
        
        Vector streamParts = new Vector();
        
        streamParts.addElement( new ByteArrayInputStream(docstart.getBytes()) );
        streamParts.addElement( is );
        streamParts.addElement( new ByteArrayInputStream(docend.getBytes()) );
        
        InputStream combined = new SequenceInputStream( streamParts.elements() );
        
        try {
            HttpTransport.cm.saveBytes(dn,
				       fn,
				       combined,
				       MessageLifeTime,
				       MessageLifeTime);
        } catch( Exception ignored ) {
            // 20010828 bondolo@jxta.org you would think it was important to
            // not ignore these....
            if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug( "failed to seve to cm", ignored );
        }
    }
    
    /**
     *  Returns the entire contents of the message suitable for transmission
     *
     *  @return byte array containing the entire contents of the message.
     **/
    public byte[] getBytes() {
        
        if (doc == null) {
            try {
                doc = new String( HttpTransport.cm.restoreBytes( dn, fn ) );
            } catch ( Exception punt ) {
                if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug( "failed to restore from cm", punt );
                return null;
            }
        }
        
        return doc.getBytes();
    }
    
    /**
     *  Returns the user data portion of the message
     *
     *  @return byte array containing the user data portion of the message.
     **/
    public byte[] getData() {
        
        if (doc == null) {
            try {
                doc = new String( HttpTransport.cm.restoreBytes( dn, fn ) );
            } catch ( Exception punt ) {
                if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug( "failed to restore from cm", punt );
                return null;
            }
        }
        
        int indexFirst = doc.indexOf("<" + ContentTag + ">");
        int indexLast = doc.lastIndexOf("</" + ContentTag + ">");
        
        if ((indexFirst == -1) || (indexLast == -1)) {
            // Invalid message
            if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug( "invalid message " + indexFirst + " " + indexLast );
            return null;
        }
        
        return doc.substring(indexFirst + ContentTag.length() + 3, // 3 to skip <, >, and \n
        indexLast).getBytes();
    }
    
    /**
     *  Returns the status code from the message.
     *
     *  @return int containing the status code.
     **/
    public int getCode() {
        
        if (doc == null) {
            try {
                doc = new String( HttpTransport.cm.restoreBytes( dn, fn ) );
            } catch ( Exception punt ) {
                if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug( "failed to restore from cm", punt );
                return -1;
            }
        }
        
        int indexFirst = doc.indexOf("<" + CodeTag + ">");
        int indexLast = doc.indexOf("</" + CodeTag + ">");
        
        if ((indexFirst == -1) || (indexLast == -1)) {
            // Invalid message
            return -1;
        }
        
        String theCode = doc.substring(indexFirst + CodeTag.length() + 2,
        indexLast).trim();
        
        try {
            return Integer.parseInt(theCode);
        } catch ( NumberFormatException notCode ) {
            return -1;
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -