01: /*
02: * Copyright 2005-2007 Noelios Consulting.
03: *
04: * The contents of this file are subject to the terms of the Common Development
05: * and Distribution License (the "License"). You may not use this file except in
06: * compliance with the License.
07: *
08: * You can obtain a copy of the license at
09: * http://www.opensource.org/licenses/cddl1.txt See the License for the specific
10: * language governing permissions and limitations under the License.
11: *
12: * When distributing Covered Code, include this CDDL HEADER in each file and
13: * include the License file at http://www.opensource.org/licenses/cddl1.txt If
14: * applicable, add the following below this CDDL HEADER, with the fields
15: * enclosed by brackets "[]" replaced with your own identifying information:
16: * Portions Copyright [yyyy] [name of copyright owner]
17: */
18:
19: package org.restlet.resource;
20:
21: import java.io.IOException;
22: import java.nio.channels.ReadableByteChannel;
23: import java.nio.channels.WritableByteChannel;
24:
25: import org.restlet.data.MediaType;
26: import org.restlet.util.ByteUtils;
27:
28: /**
29: * Transient representation based on a readable NIO byte channel.
30: *
31: * @author Jerome Louvel (contact@noelios.com)
32: */
33: public class ReadableRepresentation extends ChannelRepresentation {
34: /** The representation's input stream. */
35: private ReadableByteChannel readableChannel;
36:
37: /**
38: * Constructor.
39: *
40: * @param readableChannel
41: * The representation's channel.
42: * @param mediaType
43: * The representation's media type.
44: */
45: public ReadableRepresentation(ReadableByteChannel readableChannel,
46: MediaType mediaType) {
47: this (readableChannel, mediaType, UNKNOWN_SIZE);
48: }
49:
50: /**
51: * Constructor.
52: *
53: * @param readableChannel
54: * The representation's channel.
55: * @param mediaType
56: * The representation's media type.
57: * @param expectedSize
58: * The expected stream size.
59: */
60: public ReadableRepresentation(ReadableByteChannel readableChannel,
61: MediaType mediaType, long expectedSize) {
62: super (mediaType);
63: setSize(expectedSize);
64: this .readableChannel = readableChannel;
65: setAvailable(readableChannel != null);
66: setTransient(true);
67: }
68:
69: /**
70: * Returns a readable byte channel. If it is supported by a file a read-only
71: * instance of FileChannel is returned.
72: *
73: * @return A readable byte channel.
74: */
75: public synchronized ReadableByteChannel getChannel()
76: throws IOException {
77: ReadableByteChannel result = this .readableChannel;
78: this .readableChannel = null;
79: setAvailable(false);
80: return result;
81: }
82:
83: /**
84: * Writes the representation to a byte channel.
85: *
86: * @param writableChannel
87: * A writable byte channel.
88: */
89: public void write(WritableByteChannel writableChannel)
90: throws IOException {
91: ByteUtils.write(getChannel(), writableChannel);
92: }
93:
94: }
|