001: /*
002: * Copyright 2002-2005 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.web.portlet.context;
018:
019: import java.io.File;
020: import java.io.FileNotFoundException;
021: import java.io.IOException;
022: import java.io.InputStream;
023: import java.net.URL;
024:
025: import javax.portlet.PortletContext;
026:
027: import org.springframework.core.io.AbstractResource;
028: import org.springframework.core.io.Resource;
029: import org.springframework.util.Assert;
030: import org.springframework.util.StringUtils;
031: import org.springframework.web.portlet.util.PortletUtils;
032:
033: /**
034: * Resource implementation for PortletContext resources,
035: * interpreting relative paths within the portlet application root.
036: *
037: * <p>Always supports stream access, but only allows java.io.File
038: * access when the portlet application archive is expanded.
039: * Always supports resolution as URL.
040: *
041: * @author Juergen Hoeller
042: * @author John A. Lewis
043: * @since 2.0
044: * @see javax.portlet.PortletContext#getResourceAsStream
045: * @see javax.portlet.PortletContext#getRealPath
046: */
047: public class PortletContextResource extends AbstractResource {
048:
049: private final PortletContext portletContext;
050:
051: private final String path;
052:
053: /**
054: * Create a new PortletContextResource.
055: * <p>The Portlet spec requires that resource paths start with a slash,
056: * even if many containers accept paths without leading slash too.
057: * Consequently, the given path will be prepended with a slash if it
058: * doesn't already start with one.
059: * @param portletContext the PortletContext to load from
060: * @param path the path of the resource
061: */
062: public PortletContextResource(PortletContext portletContext,
063: String path) {
064: // check PortletContext
065: Assert
066: .notNull(portletContext,
067: "Cannot resolve PortletContextResource without PortletContext");
068: this .portletContext = portletContext;
069:
070: // check path
071: Assert.notNull(path, "path is required");
072: if (!path.startsWith("/")) {
073: path = "/" + path;
074: }
075: this .path = path;
076: }
077:
078: /**
079: * Return the PortletContext for this resource.
080: */
081: public PortletContext getPortletContext() {
082: return portletContext;
083: }
084:
085: /**
086: * Return the path for this resource.
087: */
088: public String getPath() {
089: return path;
090: }
091:
092: /**
093: * This implementation delegates to PortletContext.getResourceAsStream,
094: * but throws a FileNotFoundException if not found.
095: * @see javax.portlet.PortletContext#getResourceAsStream
096: */
097: public InputStream getInputStream() throws IOException {
098: InputStream is = this .portletContext
099: .getResourceAsStream(this .path);
100: if (is == null) {
101: throw new FileNotFoundException("Could not open "
102: + getDescription());
103: }
104: return is;
105: }
106:
107: public URL getURL() throws IOException {
108: URL url = this .portletContext.getResource(this .path);
109: if (url == null) {
110: throw new FileNotFoundException(
111: getDescription()
112: + " cannot be resolved to URL because it does not exist");
113: }
114: return url;
115: }
116:
117: /**
118: * This implementation delegates to PortletContext.getRealPath,
119: * but throws a FileNotFoundException if not found or not resolvable.
120: * @see javax.portlet.PortletContext#getRealPath
121: */
122: public File getFile() throws IOException {
123: String realPath = PortletUtils.getRealPath(this .portletContext,
124: this .path);
125: return new File(realPath);
126: }
127:
128: public Resource createRelative(String relativePath)
129: throws IOException {
130: String pathToUse = StringUtils.applyRelativePath(this .path,
131: relativePath);
132: return new PortletContextResource(this .portletContext,
133: pathToUse);
134: }
135:
136: public String getFilename() {
137: return StringUtils.getFilename(this .path);
138: }
139:
140: public String getDescription() {
141: return "PortletContext resource [" + this .path + "]";
142: }
143:
144: public boolean equals(Object obj) {
145: if (obj == this ) {
146: return true;
147: }
148: if (obj instanceof PortletContextResource) {
149: PortletContextResource otherRes = (PortletContextResource) obj;
150: return (this .portletContext.equals(otherRes.portletContext) && this .path
151: .equals(otherRes.path));
152: }
153: return false;
154: }
155:
156: public int hashCode() {
157: return this.path.hashCode();
158: }
159:
160: }
|