| // Copyright 2013 The Apache Software Foundation |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package org.apache.tapestry5.internal.services.assets; |
| |
| import org.apache.tapestry5.internal.services.ResourceStreamer; |
| import org.apache.tapestry5.ioc.Resource; |
| |
| import java.io.IOException; |
| |
| /** |
| * Utility used by {@link org.apache.tapestry5.services.assets.AssetRequestHandler} implementations |
| * where the first folder in the extra path is actually a computed checksum of the resource's content. |
| * |
| * @since 5.4 |
| */ |
| public class ChecksumPath |
| { |
| private static final String NON_EXISTING_RESOURCE = "_________________________"; |
| |
| public final String checksum; |
| |
| public final String resourcePath; |
| |
| private final ResourceStreamer streamer; |
| |
| public ChecksumPath(ResourceStreamer streamer, String baseFolder, String extraPath) |
| { |
| this.streamer = streamer; |
| int slashx = extraPath.indexOf('/'); |
| |
| checksum = extraPath.substring(0, slashx); |
| |
| String morePath = extraPath.substring(slashx + 1); |
| |
| if (!isBlank(morePath)) { |
| resourcePath = baseFolder == null |
| ? morePath |
| : baseFolder + "/" + morePath; |
| } |
| else { |
| // When we only have something which looks like a checksum but no actual path. |
| // For example, /assets/META-INF/ |
| resourcePath = NON_EXISTING_RESOURCE; |
| } |
| } |
| |
| /** |
| * If the resource exists and the checksum is correct, stream it to the client and return true. Otherwise, |
| * return false. |
| * |
| * @param resource |
| * to stream |
| * @return true if streamed, false otherwise |
| * @throws IOException |
| */ |
| public boolean stream(Resource resource) throws IOException |
| { |
| if (resource == null || !resource.exists()) |
| { |
| return false; |
| } |
| |
| |
| return streamer.streamResource(resource, checksum, ResourceStreamer.DEFAULT_OPTIONS); |
| } |
| |
| /** |
| * Copied from StringUtils since it's the only method we want from it. |
| */ |
| private static boolean isBlank(final CharSequence cs) { |
| int strLen; |
| if (cs == null || (strLen = cs.length()) == 0) { |
| return true; |
| } |
| for (int i = 0; i < strLen; i++) { |
| if (!Character.isWhitespace(cs.charAt(i))) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| } |