/*
* Copyright 2010-2011 Research In Motion Limited.
*
* 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 blackberry.web.widget.policy;
import java.util.Hashtable;
import net.rim.device.api.web.WidgetAccess;
/**
* Models a searchable collection of WidgetAccess elements
*/
public class WidgetWebFolderAccess {
// Folder structure
private Hashtable _pathCollection;
// Depth of longest file path
private int _maxPathLength;
// Constructor
// Takes in url of the host
public WidgetWebFolderAccess() {
// Assign fields
_maxPathLength = 0;
_pathCollection = new Hashtable();
}
// Adds WidgetElement to the structure by using the folder path as a key
// Folder path must not include the scheme or the host
public void addWidgetAccess( String folderPath, WidgetAccess accessElement ) {
// Trim surrounding slashes for consistency
// The root "/" is a special case that does not need this trimming
if( !folderPath.equals( "/" ) ) {
folderPath = "/" + trimSurroundingSlashes( folderPath );
}
_pathCollection.put( folderPath, accessElement );
// Determine the depth of the path
_maxPathLength = Math.max( _maxPathLength, determineDepth( folderPath ) );
}
// Retrieves the access element assigned to the folder path, if it exists
// Folder path must not include the scheme or the host
private WidgetAccess fetchWidgetAccess( String folderPath ) {
try {
WidgetAccess accessElement = (WidgetAccess) _pathCollection.get( folderPath );
return accessElement;
} catch( Exception e ) {
// Return null if any problem occurs
return null;
}
}
// Retrieves the access element assigned to the folder path, if it exists
// Folder path must not include the scheme or the host
public WidgetAccess getWidgetAccess( String folderPath ) {
int depth = determineDepth( folderPath );
return getWidgetAccessRecursively( folderPath, depth );
}
private WidgetAccess getWidgetAccessRecursively( String folderPath, int pathLength ) {
// Check folder path if an entry exists for the full path
if( _pathCollection.containsKey( folderPath ) ) {
return fetchWidgetAccess( folderPath );
} else if( folderPath.equals( "" ) ) {
return null;
} else {
// Truncate the end portion of the path and try again
int newPathLength = Math.min( _maxPathLength, pathLength - 1 );
String newPath = getPath( folderPath, newPathLength );
return getWidgetAccessRecursively( newPath, newPathLength );
}
}
// Determines the depth of the given path
// Folder path must not include the scheme or the host
private int determineDepth( String folderPath ) {
int depthCount = 0;
// Replace all backslashes with forward slash
folderPath = folderPath.replace( '\\', '/' );
// Special case: "/" is the given path
if( folderPath.equals( "/" ) ) {
return 0;
}
folderPath = trimSurroundingSlashes( folderPath );
// Count slashes remaining
while( folderPath.indexOf( "/" ) != -1 ) {
depthCount += 1;
// Add 1 to skip the slash
folderPath = folderPath.substring( folderPath.indexOf( "/" ) + 1 );
}
// Add one more for the remaining folder
depthCount += 1;
return depthCount;
}
// Parse a folder path up to the desired depth
private String getPath( String folderPath, int desiredDepth ) {
// Special case: Desired depth is 0
if( desiredDepth == 0 ) {
return "/";
}
// Replace all backslashes with forward slash
folderPath = folderPath.replace( '\\', '/' );
folderPath = trimSurroundingSlashes( folderPath );
int depthCount = 0;
StringBuffer builtPath = new StringBuffer();
// Count slashes remaining
while( depthCount < desiredDepth ) {
depthCount++;
// Add 1 to skip the slash
builtPath.append( "/" + folderPath.substring( 0, folderPath.indexOf( '/' ) ) );
folderPath = folderPath.substring( folderPath.indexOf( '/' ) + 1 );
}
return builtPath.toString();
}
// Exclude the filename from the path
// private String excludeFilenameFromPath( String fullPath ) {
// String folderPath = fullPath;
//
// // Replace all backslashes with forward slash
// folderPath = folderPath.replace( '\\', '/' );
//
// // root folder
// if( folderPath.lastIndexOf( '/' ) == 0 ) {
// return "/";
// } else if( folderPath.indexOf( '/' ) != -1 ) {
// folderPath = folderPath.substring( 0, folderPath.lastIndexOf( '/' ) );
// }
// return folderPath;
// }
// Removes the start and end slashes from the path
private String trimSurroundingSlashes( String path ) {
// Trim starting slash
if( path.startsWith( "/" ) ) {
path = path.substring( 1 );
}
// Trim ending slash
if( path.endsWith( "/" ) ) {
path = path.substring( 0, path.length() - 1 );
}
return path;
}
}