KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > imagero > uio > buffer > HTTPBuffer


1 /*
2  * Copyright (c) Andrey Kuznetsov. All Rights Reserved.
3  *
4  * http://uio.imagero.com
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  * o Redistributions of source code must retain the above copyright notice,
10  * this list of conditions and the following disclaimer.
11  *
12  * o Redistributions in binary form must reproduce the above copyright notice,
13  * this list of conditions and the following disclaimer in the documentation
14  * and/or other materials provided with the distribution.
15  *
16  * o Neither the name of imagero Andrei Kouznetsov nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
29  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */

32 package com.imagero.uio.buffer;
33
34 import com.imagero.uio.io.IOutils;
35
36 import java.io.IOException JavaDoc;
37 import java.io.InputStream JavaDoc;
38 import java.net.HttpURLConnection JavaDoc;
39 import java.net.URL JavaDoc;
40
41 /**
42  * Implementation of Buffer for http.
43  * This intelligent Buffer uses "byteserving" feature
44  * of HTTP 1.1 for reading only data which is needed.
45  *
46  * @author Andrei Kouznetsov
47  * Date: 05.01.2004
48  * Time: 20:59:01
49  */

50 public class HTTPBuffer implements Buffer {
51
52     URL JavaDoc url;
53
54     long offset;
55     int length;
56     byte[] data;
57
58     public HTTPBuffer(URL JavaDoc url, int offset, int length) {
59         this.url = url;
60         this.offset = offset;
61         this.length = length;
62
63 // Sys.out.println("HTTPBuffer");
64
// Sys.out.println("offset:" + Long.toHexString(offset));
65
// Sys.out.println("length:" + Integer.toHexString(length));
66
}
67
68     /**
69      * read specified part of data from URL
70      *
71      * @return data
72      *
73      * @throws IOException if server don't support "byteserving"
74      */

75     public byte[] getData() throws IOException JavaDoc {
76         if(data == null) {
77             readData();
78         }
79         return data;
80     }
81
82     public byte[] getData(byte[] d) throws IOException JavaDoc {
83         if(data == null) {
84             readData();
85         }
86         System.arraycopy(data, 0, d, 0, Math.min(data.length, d.length));
87         return d;
88     }
89
90     public int length() {
91         return length;
92     }
93
94     private void readData() throws IOException JavaDoc {
95         HttpURLConnection JavaDoc httpcon = (HttpURLConnection JavaDoc) url.openConnection();
96         httpcon.setAllowUserInteraction(true);
97         httpcon.setDoInput(true);
98         httpcon.setDoOutput(true);
99         httpcon.setRequestMethod("GET");
100         httpcon.setUseCaches(false);
101         httpcon.setRequestProperty("Range", "bytes=" + offset + "-" + (offset + length));
102         httpcon.connect();
103
104         String JavaDoc responseMessage = httpcon.getResponseMessage();
105         int responseCode = httpcon.getResponseCode();
106         if(responseCode != 206) {
107             httpcon.disconnect();
108             throw new IOException JavaDoc("byteserving not supported by server");
109         }
110
111 // Sys.out.println(responseCode + " " + responseMessage);
112
InputStream JavaDoc in = httpcon.getInputStream();
113
114         data = new byte[length];
115         IOutils.readFully2(in, data);
116
117         httpcon.disconnect();
118     }
119
120     public boolean isDirty() {
121         return false;
122     }
123 }
124
Popular Tags