blob: 03cdcae200991a2b97f17cc1448b3429c94ab14f [file] [log] [blame]
// 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;
}
}