in framework.security/src/main/java/org/apache/felix/framework/security/util/Permissions.java [290:453]
public boolean implies(Permission target, final Bundle bundle)
{
if (m_allPermission)
{
return true;
}
Class targetClass = target.getClass();
cleanUp(m_queue, m_cache);
if ((bundle != null) && targetClass == FilePermission.class)
{
for (int i = 0; i < m_permissionInfos.length; i++)
{
if (m_permissionInfos[i].getType().equals(
FilePermission.class.getName()))
{
String postfix = "";
String name = m_permissionInfos[i].getName();
if (!"<<ALL FILES>>".equals(name))
{
if (name.endsWith("*") || name.endsWith("-"))
{
postfix = name.substring(name.length() - 1);
name = name.substring(0, name.length() - 1);
}
if (!(new File(name)).isAbsolute())
{
BundleContext context = (BundleContext) AccessController
.doPrivileged(new PrivilegedAction()
{
public Object run()
{
return bundle.getBundleContext();
}
});
if (context == null)
{
break;
}
name = m_action.getAbsolutePath(new File(context
.getDataFile(""), name));
}
if (postfix.length() > 0)
{
if ((name.length() > 0) && !name.endsWith("/"))
{
name += "/" + postfix;
}
else
{
name += postfix;
}
}
}
Permission source = createPermission(new PermissionInfo(
FilePermission.class.getName(), name,
m_permissionInfos[i].getActions()), targetClass);
if (source.implies(target))
{
return true;
}
}
}
return false;
}
Object current = m_stack.get();
if (current == null)
{
m_stack.set(targetClass);
}
else
{
if (current instanceof HashSet)
{
if (((HashSet) current).contains(targetClass))
{
return false;
}
((HashSet) current).add(targetClass);
}
else
{
if (current == targetClass)
{
return false;
}
HashSet frame = new HashSet();
frame.add(current);
frame.add(targetClass);
m_stack.set(frame);
current = frame;
}
}
try
{
PermissionCollection collection = null;
synchronized (m_cache)
{
final SoftReference collectionEntry = (SoftReference) m_cache.get(targetClass);
if (collectionEntry != null)
{
collection = (PermissionCollection) collectionEntry.get();
}
}
if (collection == null)
{
collection = target.newPermissionCollection();
if (collection == null)
{
collection = new DefaultPermissionCollection();
}
for (int i = 0; i < m_permissionInfos.length; i++)
{
PermissionInfo permissionInfo = m_permissionInfos[i];
String infoType = permissionInfo.getType();
String permissionType = targetClass.getName();
if (infoType.equals(permissionType))
{
Permission permission = createPermission(
permissionInfo, targetClass);
if (permission != null)
{
collection.add(permission);
}
}
}
synchronized (m_cache)
{
m_cache.put(new Entry(target.getClass(), m_queue),
new SoftReference(collection));
}
}
return collection.implies(target);
}
finally
{
if (current == null)
{
m_stack.set(null);
}
else
{
((HashSet) current).remove(targetClass);
if (((HashSet) current).isEmpty())
{
m_stack.set(null);
}
}
}
}