001: /*
002: * Copyright 2002-2006 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.core.io;
018:
019: import java.io.IOException;
020: import java.io.InputStream;
021:
022: /**
023: * {@link Resource} implementation for a given InputStream. Should only
024: * be used if no specific Resource implementation is applicable.
025: * In particular, prefer {@link ByteArrayResource} or any of the
026: * file-based Resource implementations where possible.
027: *
028: * <p>In contrast to other Resource implementations, this is a descriptor
029: * for an <i>already opened</i> resource - therefore returning "true" from
030: * <code>isOpen()</code>. Do not use it if you need to keep the resource
031: * descriptor somewhere, or if you need to read a stream multiple times.
032: *
033: * @author Juergen Hoeller
034: * @since 28.12.2003
035: * @see ByteArrayResource
036: * @see ClassPathResource
037: * @see FileSystemResource
038: * @see UrlResource
039: */
040: public class InputStreamResource extends AbstractResource {
041:
042: private final InputStream inputStream;
043:
044: private final String description;
045:
046: private boolean read = false;
047:
048: /**
049: * Create a new InputStreamResource.
050: * @param inputStream the InputStream to use
051: */
052: public InputStreamResource(InputStream inputStream) {
053: this (inputStream, "resource loaded through InputStream");
054: }
055:
056: /**
057: * Create a new InputStreamResource.
058: * @param inputStream the InputStream to use
059: * @param description where the InputStream comes from
060: */
061: public InputStreamResource(InputStream inputStream,
062: String description) {
063: if (inputStream == null) {
064: throw new IllegalArgumentException(
065: "InputStream must not be null");
066: }
067: this .inputStream = inputStream;
068: this .description = (description != null ? description : "");
069: }
070:
071: /**
072: * This implementation always returns <code>true</code>.
073: */
074: public boolean exists() {
075: return true;
076: }
077:
078: /**
079: * This implementation always returns <code>true</code>.
080: */
081: public boolean isOpen() {
082: return true;
083: }
084:
085: /**
086: * This implementation throws IllegalStateException if attempting to
087: * read the underlying stream multiple times.
088: */
089: public InputStream getInputStream() throws IOException,
090: IllegalStateException {
091: if (this .read) {
092: throw new IllegalStateException(
093: "InputStream has already been read - "
094: + "do not use InputStreamResource if a stream needs to be read multiple times");
095: }
096: this .read = true;
097: return this .inputStream;
098: }
099:
100: /**
101: * This implementation returns the passed-in description, if any.
102: */
103: public String getDescription() {
104: return this .description;
105: }
106:
107: /**
108: * This implementation compares the underlying InputStream.
109: */
110: public boolean equals(Object obj) {
111: return (obj == this || (obj instanceof InputStreamResource && ((InputStreamResource) obj).inputStream
112: .equals(this .inputStream)));
113: }
114:
115: /**
116: * This implementation returns the hash code of the underlying InputStream.
117: */
118: public int hashCode() {
119: return this.inputStream.hashCode();
120: }
121:
122: }
|