use of org.apache.aries.application.modelling.ModelledResource in project aries by apache.
the class AbstractEJBModellerTest method testEJBJARAndAnnotatedOnClasspathInWebZip.
@Test
public void testEJBJARAndAnnotatedOnClasspathInWebZip() throws Exception {
ModelledResource mr = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos);
addToZip(zos, "MANIFEST_4.MF", "META-INF/MANIFEST.MF");
addToZip(zos, "ejb-jar.xml", "WEB-INF/ejb-jar.xml");
addToZip(zos, "beans/StatelessSessionBean.class", "yes/beans/StatelessSessionBean.class");
addToZip(zos, "beans/StatefulSessionBean.class", "yes/beans/StatefulSessionBean.class");
zos.close();
mr = model(baos.toByteArray());
Collection<? extends ExportedService> services = mr.getExportedServices();
assertEquals("Wrong number of services", 3, services.size());
assertTrue(services.containsAll(getXMLservices()));
assertTrue(services.containsAll(getAnnotatedservices()));
}
use of org.apache.aries.application.modelling.ModelledResource in project aries by apache.
the class AbstractEJBModellerTest method modelBasicEJBBundleWithXML.
@Test
public void modelBasicEJBBundleWithXML() throws Exception {
ModelledResource mr = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos);
addToZip(zos, "MANIFEST_1.MF", "META-INF/MANIFEST.MF");
addToZip(zos, "ejb-jar.xml", "META-INF/ejb-jar.xml");
zos.close();
mr = model(baos.toByteArray());
Collection<? extends ExportedService> services = mr.getExportedServices();
assertEquals("Wrong number of services", 2, services.size());
assertTrue(services.containsAll(getXMLservices()));
assertTrue(Collections.disjoint(services, getAnnotatedservices()));
}
use of org.apache.aries.application.modelling.ModelledResource in project aries by apache.
the class DeploymentManifestManagerImpl method generateDeployedBundles.
/**
* Perform provisioning to work out the 'freeze dried list' of the eba
* @param appContent - the application content in the application.mf
* @param useBundleContent - use bundle entry in the application.mf
* @param providedByValueBundles - bundles contained in the eba
* @return
* @throws ResolverException
*/
@Override
public DeployedBundles generateDeployedBundles(ApplicationMetadata appMetadata, Collection<ModelledResource> provideByValueBundles, Collection<Content> otherBundles) throws ResolverException {
Collection<Content> useBundleSet = appMetadata.getUseBundles();
Collection<Content> appContent = appMetadata.getApplicationContents();
Collection<Content> bundlesToResolve = new ArrayList<Content>();
Set<ImportedBundle> appContentIB = toImportedBundle(appContent);
Set<ImportedBundle> useBundleIB = toImportedBundle(useBundleSet);
bundlesToResolve.addAll(useBundleSet);
bundlesToResolve.addAll(appContent);
bundlesToResolve.addAll(otherBundles);
Collection<ModelledResource> byValueBundles = new ArrayList<ModelledResource>(provideByValueBundles);
ModelledResource fakeBundleResource;
try {
fakeBundleResource = createFakeBundle(appMetadata.getApplicationImportServices());
} catch (InvalidAttributeException iax) {
ResolverException rx = new ResolverException(iax);
_logger.debug(LOG_EXIT, "generateDeploymentManifest", new Object[] { rx });
throw rx;
}
byValueBundles.add(fakeBundleResource);
Collection<ModelledResource> fakeResources = new ArrayList<ModelledResource>();
for (PreResolveHook hook : preResolveHooks) {
hook.collectFakeResources(fakeResources);
}
byValueBundles.addAll(fakeResources);
String appSymbolicName = appMetadata.getApplicationSymbolicName();
String appVersion = appMetadata.getApplicationVersion().toString();
String uniqueName = appSymbolicName + "_" + appVersion;
DeployedBundles deployedBundles = modellingHelper.createDeployedBundles(appSymbolicName, appContentIB, useBundleIB, Arrays.asList(fakeBundleResource));
Collection<ModelledResource> bundlesToBeProvisioned = resolver.resolve(appSymbolicName, appVersion, byValueBundles, bundlesToResolve);
pruneFakeBundlesFromResults(bundlesToBeProvisioned, fakeResources);
if (bundlesToBeProvisioned.isEmpty()) {
throw new ResolverException(MessageUtil.getMessage("EMPTY_DEPLOYMENT_CONTENT", uniqueName));
}
for (ModelledResource rbm : bundlesToBeProvisioned) {
deployedBundles.addBundle(rbm);
}
Collection<ModelledResource> requiredUseBundle = deployedBundles.getRequiredUseBundle();
if (requiredUseBundle.size() < useBundleSet.size()) {
// Some of the use-bundle entries were redundant so resolve again with just the good ones.
deployedBundles = modellingHelper.createDeployedBundles(appSymbolicName, appContentIB, useBundleIB, Arrays.asList(fakeBundleResource));
bundlesToResolve.clear();
bundlesToResolve.addAll(appContent);
Collection<ImportedBundle> slimmedDownUseBundle = narrowUseBundles(useBundleIB, requiredUseBundle);
bundlesToResolve.addAll(toContent(slimmedDownUseBundle));
bundlesToBeProvisioned = resolver.resolve(appSymbolicName, appVersion, byValueBundles, bundlesToResolve);
pruneFakeBundlesFromResults(bundlesToBeProvisioned, fakeResources);
for (ModelledResource rbm : bundlesToBeProvisioned) {
deployedBundles.addBundle(rbm);
}
requiredUseBundle = deployedBundles.getRequiredUseBundle();
}
// Check for circular dependencies. No shared bundle can depend on any
// isolated bundle.
Collection<ModelledResource> sharedBundles = new HashSet<ModelledResource>();
sharedBundles.addAll(deployedBundles.getDeployedProvisionBundle());
sharedBundles.addAll(requiredUseBundle);
Collection<ModelledResource> appContentBundles = deployedBundles.getDeployedContent();
Collection<Content> requiredSharedBundles = new ArrayList<Content>();
for (ModelledResource mr : sharedBundles) {
String version = mr.getExportedBundle().getVersion();
String exactVersion = "[" + version + "," + version + "]";
Content ib = ContentFactory.parseContent(mr.getExportedBundle().getSymbolicName(), exactVersion);
requiredSharedBundles.add(ib);
}
// This will throw a ResolverException if the shared content does not resolve
Collection<ModelledResource> resolvedSharedBundles = resolver.resolve(appSymbolicName, appVersion, byValueBundles, requiredSharedBundles);
// we need to find out whether any shared bundles depend on the isolated bundles
List<String> suspects = findSuspects(resolvedSharedBundles, sharedBundles, appContentBundles);
// from isolated bundles. We need to build up the error message and throw a ResolverException
if (!suspects.isEmpty()) {
StringBuilder msgs = new StringBuilder();
List<String> unsatisfiedRequirements = new ArrayList<String>();
Map<String, List<String>> isolatedBundles = new HashMap<String, List<String>>();
// Find the isolated bundles and store all the packages that they export in a map.
for (ModelledResource mr : resolvedSharedBundles) {
String mrName = mr.getSymbolicName() + "_" + mr.getExportedBundle().getVersion();
if (suspects.contains(mrName)) {
List<String> exportedPackages = new ArrayList<String>();
isolatedBundles.put(mrName, exportedPackages);
for (ExportedPackage ep : mr.getExportedPackages()) {
exportedPackages.add(ep.getPackageName());
}
}
}
// are exported from the isolated bundles.
for (ModelledResource mr : resolvedSharedBundles) {
String mrName = mr.getSymbolicName() + "_" + mr.getExportedBundle().getVersion();
// if current resource isn't an isolated bundle check it's requirements
if (!!!suspects.contains(mrName)) {
// Iterate through the imported packages of the current shared bundle.
for (ImportedPackage ip : mr.getImportedPackages()) {
String packageName = ip.getPackageName();
List<String> bundlesExportingPackage = new ArrayList<String>();
// get a match store the info away.
for (Map.Entry<String, List<String>> currBundle : isolatedBundles.entrySet()) {
List<String> exportedPackages = currBundle.getValue();
if (exportedPackages != null && exportedPackages.contains(packageName)) {
bundlesExportingPackage.add(currBundle.getKey());
}
}
// exception.
if (!!!bundlesExportingPackage.isEmpty()) {
String newMsg;
if (bundlesExportingPackage.size() > 1) {
newMsg = MessageUtil.getMessage("SHARED_BUNDLE_IMPORTING_FROM_ISOLATED_BUNDLES", new Object[] { mrName, packageName, bundlesExportingPackage });
} else {
newMsg = MessageUtil.getMessage("SHARED_BUNDLE_IMPORTING_FROM_ISOLATED_BUNDLE", new Object[] { mrName, packageName, bundlesExportingPackage });
}
msgs.append("\n");
msgs.append(newMsg);
unsatisfiedRequirements.add(newMsg);
}
}
}
}
// Well! if the msgs is empty, no need to throw an exception
if (msgs.length() != 0) {
String message = MessageUtil.getMessage("SUSPECTED_CIRCULAR_DEPENDENCIES", new Object[] { appSymbolicName, msgs });
ResolverException rx = new ResolverException(message);
rx.setUnsatisfiedRequirements(unsatisfiedRequirements);
_logger.debug(LOG_EXIT, "generateDeploymentManifest", new Object[] { rx });
throw (rx);
}
}
checkForIsolatedContentInProvisionBundle(appSymbolicName, deployedBundles);
if (postResolveTransformer != null)
try {
deployedBundles = postResolveTransformer.postResolveProcess(appMetadata, deployedBundles);
} catch (ServiceUnavailableException e) {
_logger.debug(MessageUtil.getMessage("POST_RESOLVE_TRANSFORMER_UNAVAILABLE", e));
}
return deployedBundles;
}
use of org.apache.aries.application.modelling.ModelledResource in project aries by apache.
the class DeploymentGeneratorTest method checkBasicCircularDependenciesDetected.
@Test
public void checkBasicCircularDependenciesDetected() throws Exception {
// Override Resolver behaviour.
//ImportedBundle isolated = new ImportedBundleImpl ("test.isolated" , "1.0.0");
// When we resolve isolated, we're going to get another bundle which has a dependency on isolated.
Collection<ModelledResource> cmr = new ArrayList<ModelledResource>();
ExportedPackage testIsolatedPkg = createExportedPackage("test.isolated", "1.0.0", new String[] { "test.shared" }, new String[] { "test.isolated.pkg" });
cmr.add(testIsolatedPkg.getBundle());
ExportedPackage testSharedPkg = createExportedPackage("test.shared", "1.0.0", new String[] { "test.isolated.pkg" }, new String[] { "test.shared" });
cmr.add(testSharedPkg.getBundle());
_resolver.addResult(cmr);
// The second time DeploymentGenerator calls the Resolver, it will provide just
// test.shared. The resolver will return test.shared _plus_ test.isolated.
_resolver.addResult(cmr);
Skeleton.getSkeleton(appMetadata).setReturnValue(new MethodCall(ApplicationMetadata.class, "getApplicationContents"), Arrays.asList(mockContent("test.isolated", "1.0.0")));
try {
DeployedBundles deployedBundles = deplMFMgr.generateDeployedBundles(appMetadata, new ArrayList<ModelledResource>(), new ArrayList<Content>());
deplMFMgr.generateDeploymentManifest(appMetadata.getApplicationSymbolicName(), appMetadata.getApplicationVersion().toString(), deployedBundles);
} catch (ResolverException rx) {
List<String> usr = rx.getUnsatisfiedRequirements();
assertEquals("One unsatisfied requirement expected, not " + usr.size(), usr.size(), 1);
String chkMsg = "Shared bundle test.shared_1.0.0 has a dependency for package " + "test.shared which is exported from application bundle [test.isolated_1.0.0]";
assertTrue(chkMsg + " expected, not " + usr, usr.contains(chkMsg));
return;
}
fail("ResolverException expected");
}
use of org.apache.aries.application.modelling.ModelledResource in project aries by apache.
the class DeploymentGeneratorTest method checkBundleInAppContentAndProvisionContentButNothingSharedToIsolatedContent.
/**
* Similar to the checkBundleInAppContentAndProvisionContent scenario. However, this time the provisioned bundle does not provide
* a package or service to the isolated content, so there is no problem.
* @throws Exception
*/
@Test
public void checkBundleInAppContentAndProvisionContentButNothingSharedToIsolatedContent() throws Exception {
List<ModelledResource> cmr = new ArrayList<ModelledResource>();
cmr.add(createModelledResource("test.util", "1.1.0", Collections.<String>emptyList(), Arrays.asList("test.api.pack;version=1.1.0")));
cmr.add(createModelledResource("test.bundle", "1.0.0", Arrays.asList("test.api.pack;version=\"[1.1.0,2.0.0)\""), Collections.<String>emptyList()));
cmr.add(createModelledResource("test.provisioned", "1.0.0", Arrays.asList("test.api.pack;version=\"[1.0.0,1.1.0)\""), Collections.<String>emptyList()));
cmr.add(createModelledResource("test.util", "1.0.0", Collections.<String>emptyList(), Arrays.asList("test.api.pack;version=1.0.0")));
// The second time DeploymentGenerator calls the Resolver, it will provide just
// test.shared. The resolver will return test.shared _plus_ test.isolated.
_resolver.addResult(cmr);
Skeleton.getSkeleton(appMetadata).setReturnValue(new MethodCall(ApplicationMetadata.class, "getApplicationContents"), Arrays.asList(mockContent("test.util", "1.1.0"), mockContent("test.bundle", "1.0.0")));
app = Skeleton.newMock(AriesApplication.class);
Skeleton.getSkeleton(app).setReturnValue(new MethodCall(AriesApplication.class, "getApplicationMetadata"), appMetadata);
DeployedBundles deployedBundles = deplMFMgr.generateDeployedBundles(appMetadata, Arrays.asList(new ModelledResource[] { cmr.get(0), cmr.get(1) }), new ArrayList<Content>());
Manifest mf = deplMFMgr.generateDeploymentManifest(appMetadata.getApplicationSymbolicName(), appMetadata.getApplicationVersion().toString(), deployedBundles);
assertTrue(mf.getMainAttributes().getValue("Deployed-Content").contains("test.util;deployed-version=1.1.0"));
assertTrue(mf.getMainAttributes().getValue("Provision-Bundle").contains("test.util;deployed-version=1.0.0"));
}
Aggregations