in impl/src/main/java/org/apache/myfaces/application/ResourceHandlerImpl.java [1135:1300]
protected ResourceMeta deriveResourceMeta(FacesContext context, ResourceLoader resourceLoader,
String resourceId)
{
ResourceMeta resourceMeta = null;
String token = null;
String localePrefix = null;
String libraryName = null;
String libraryVersion = null;
String resourceName = null;
String resourceVersion = null;
int lastSlash = resourceId.lastIndexOf('/');
if (lastSlash < 0)
{
//no slashes, so it is just a plain resource.
resourceName = resourceId;
}
else
{
token = resourceId.substring(lastSlash+1);
if (RESOURCE_VERSION_CHECKER.matcher(token).matches())
{
int secondLastSlash = resourceId.lastIndexOf('/', lastSlash-1);
if (secondLastSlash < 0)
{
secondLastSlash = 0;
}
String rnToken = resourceId.substring(secondLastSlash+1, lastSlash);
int lastPoint = rnToken.lastIndexOf('.');
// lastPoint < 0 means it does not match, the token is not a resource version
if (lastPoint >= 0)
{
String ext = rnToken.substring(lastPoint);
if (token.endsWith(ext))
{
//It match a versioned resource
resourceVersion = token.substring(0,token.length()-ext.length());
}
}
}
// 1. Extract the library path and locale prefix if necessary
int start = 0;
int firstSlash = resourceId.indexOf('/');
// At least one slash, check if the start is locale prefix.
String bundleName = context.getApplication().getMessageBundle();
//If no bundle set, it can't be localePrefix
if (null != bundleName)
{
token = resourceId.substring(start, firstSlash);
//Try to derive a locale object
Locale locale = LocaleUtils.deriveLocale(token);
// If the locale was derived and it is available,
// assume that portion of the resourceId it as a locale prefix.
if (locale != null && LocaleUtils.isAvailableLocale(locale))
{
localePrefix = token;
start = firstSlash+1;
}
}
//Check slash again from start
firstSlash = resourceId.indexOf('/', start);
if (firstSlash < 0)
{
//no slashes.
resourceName = resourceId.substring(start);
}
else
{
//check libraryName
token = resourceId.substring(start, firstSlash);
int minResourceNameSlash = (resourceVersion != null) ?
resourceId.lastIndexOf('/', lastSlash-1) : lastSlash;
if (start < minResourceNameSlash)
{
libraryName = token;
start = firstSlash+1;
//Now that libraryName exists, check libraryVersion
firstSlash = resourceId.indexOf('/', start);
if (firstSlash >= 0)
{
token = resourceId.substring(start, firstSlash);
if (LIBRARY_VERSION_CHECKER.matcher(token).matches())
{
libraryVersion = token;
start = firstSlash+1;
}
}
}
firstSlash = resourceId.indexOf('/', start);
if (firstSlash < 0)
{
//no slashes.
resourceName = resourceId.substring(start);
}
else
{
// Check resource version.
if (resourceVersion != null)
{
resourceName = resourceId.substring(start,lastSlash);
}
else
{
//no resource version, assume the remaining to be resource name
resourceName = resourceId.substring(start);
}
}
}
}
//Check libraryName and resourceName
if (resourceName == null)
{
return null;
}
if (!ResourceValidationUtils.isValidResourceName(resourceName))
{
return null;
}
if (libraryName != null && !ResourceValidationUtils.isValidLibraryName(
libraryName, isAllowSlashesLibraryName()))
{
return null;
}
// If some variable is "" set it as null.
if (localePrefix != null && localePrefix.length() == 0)
{
localePrefix = null;
}
if (libraryName != null && libraryName.length() == 0)
{
libraryName = null;
}
if (libraryVersion != null && libraryVersion.length() == 0)
{
libraryVersion = null;
}
if (resourceName != null && resourceName.length() == 0)
{
resourceName = null;
}
if (resourceVersion != null && resourceVersion.length() == 0)
{
resourceVersion = null;
}
resourceMeta = resourceLoader.createResourceMeta(
localePrefix, libraryName, libraryVersion, resourceName, resourceVersion);
if (resourceMeta != null && !resourceLoader.resourceExists(resourceMeta))
{
resourceMeta = null;
}
return resourceMeta;
}