if (!mv.equals("2"))
{
// R3 bundles cannot have directives on their imports.
if (!clause.m_dirs.isEmpty())
{
throw new BundleException("R3 imports cannot contain directives.");
}
}
// Add the resolution directive to indicate that these are
// dynamic imports.
clause.m_dirs.put(Constants.RESOLUTION_DIRECTIVE,
FelixConstants.RESOLUTION_DYNAMIC);
// Check for "version" and "specification-version" attributes
// and verify they are the same if both are specified.
Object v = clause.m_attrs.get(Constants.VERSION_ATTRIBUTE);
Object sv = clause.m_attrs.get(Constants.PACKAGE_SPECIFICATION_VERSION);
if ((v != null) && (sv != null))
{
// Verify they are equal.
if (!((String) v).trim().equals(((String) sv).trim()))
{
throw new IllegalArgumentException(
"Both version and specification-version are specified, but they are not equal.");
}
}
// Ensure that only the "version" attribute is used and convert
// it to the VersionRange type.
if ((v != null) || (sv != null))
{
clause.m_attrs.remove(Constants.PACKAGE_SPECIFICATION_VERSION);
v = (v == null) ? sv : v;
clause.m_attrs.put(
Constants.VERSION_ATTRIBUTE,
VersionRange.parse(v.toString()));
}
// If bundle version is specified, then convert its type to VersionRange.
v = clause.m_attrs.get(Constants.BUNDLE_VERSION_ATTRIBUTE);
if (v != null)
{
clause.m_attrs.put(
Constants.BUNDLE_VERSION_ATTRIBUTE,
VersionRange.parse(v.toString()));
}
// Dynamic imports can have duplicates, so verify that java.*
// packages are not imported.
for (String pkgName : clause.m_paths)
{
if (pkgName.startsWith("java."))
{
throw new BundleException(
"Dynamically importing java.* packages not allowed: " + pkgName);
}
else if (!pkgName.equals("*") && pkgName.endsWith("*") && !pkgName.endsWith(".*"))
{
throw new BundleException(
"Partial package name wild carding is not allowed: " + pkgName);
}
}
}