package org.bundlemaker.core.osgi.manifest;
import java.util.Map;
import org.bundlemaker.core.analysis.AnalysisCore;
import org.bundlemaker.core.analysis.IAnalysisModelConfiguration;
import org.bundlemaker.core.analysis.IModuleArtifact;
import org.bundlemaker.core.analysis.IRootArtifact;
import org.bundlemaker.core.osgi.utils.ArtifactUtils;
import org.bundlemaker.core.osgi.utils.ManifestUtils;
import org.bundlemaker.core.resource.IModularizedSystem;
import org.bundlemaker.core.resource.IModule;
import org.eclipse.core.runtime.Assert;
import org.eclipse.virgo.bundlor.util.BundleManifestUtils;
import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
import org.eclipse.virgo.util.parser.manifest.ManifestContents;
/**
* <p>
* Abstract base class for all manifest creators.
* </p>
*
* @author Gerd Wütherich (gerd@gerd-wuetherich.de)
*/
public abstract class AbstractManifestCreator implements IBundleManifestCreator {
/** the constant for the 'MANIFEST_PER_ENTRY_ATTRIBUTES_NAME' */
private static final String MANIFEST_PER_ENTRY_ATTRIBUTES_NAME = "Name";
/** the bundle manifest */
private BundleManifest _bundleManifest;
/** the manifest template */
private BundleManifest _manifestTemplate;
/** the original manifest */
private BundleManifest _originalManifest;
/** the modularized system */
private IModularizedSystem _modularizedSystem;
/** the resource module */
private IModule _resourceModule;
/** the manifest preferences */
private IManifestPreferences _manifestPreferences;
/** the root artifact */
private IRootArtifact _rootArtifact;
/** the module artifact */
private IModuleArtifact _moduleArtifact;
/**
* {@inheritDoc}
*/
@Override
public final ManifestContents createManifest(final IModularizedSystem modularizedSystem,
final IModule resourceModule, final ManifestContents manifestTemplate, final ManifestContents originalManifest,
final IManifestPreferences manifestPreferences) {
// assert not null
Assert.isNotNull(modularizedSystem);
Assert.isNotNull(resourceModule);
Assert.isNotNull(manifestTemplate);
Assert.isNotNull(originalManifest);
Assert.isNotNull(manifestPreferences);
System.out.println("Creating manifest for '" + resourceModule.getModuleIdentifier() + "'");
// set the values
_modularizedSystem = modularizedSystem;
_resourceModule = resourceModule;
_originalManifest = BundleManifestUtils.createBundleManifest(originalManifest);
_manifestTemplate = BundleManifestUtils.createBundleManifest(manifestTemplate);
_manifestPreferences = manifestPreferences;
//
// TODO: make Configurable
_rootArtifact = AnalysisCore.getAnalysisModel(modularizedSystem,
IAnalysisModelConfiguration.BINARY_RESOURCES_CONFIGURATION);
//
_moduleArtifact = ArtifactUtils.getAssociatedModuleArtifact(_rootArtifact, resourceModule);
// create a new bundle manifest
_bundleManifest = BundleManifestFactory.createBundleManifest();
// populate the manifest
onCreateManifest();
// copy all 'per-entry' attributes from the manifest template to the final manifest
ManifestContents manifestContents = ManifestUtils.toManifestContents(_bundleManifest);
// copy all 'per-entry' attributes from the template
for (String sectionName : manifestTemplate.getSectionNames()) {
// get the section attributes
Map<String, String> sectionAttributes = manifestTemplate.getAttributesForSection(sectionName);
// copy the section attributes
for (String key : sectionAttributes.keySet()) {
if (!key.equalsIgnoreCase(MANIFEST_PER_ENTRY_ATTRIBUTES_NAME)) {
manifestContents.getAttributesForSection(sectionName).put(key, sectionAttributes.get(key));
}
}
}
// get the new manifest contents
return manifestContents;
}
/**
* <p>
* Returns the {@link BundleManifest}.
* </p>
*
* @return the {@link BundleManifest}.
*/
protected final BundleManifest getBundleManifest() {
return _bundleManifest;
}
/**
* <p>
* Returns the {@link IModularizedSystem}.
* </p>
*
* @return the {@link IModularizedSystem}.
*/
protected final IModularizedSystem getModularizedSystem() {
return _modularizedSystem;
}
/**
* <p>
* Returns the {@link IResourceModule}.
* </p>
*
* @return the {@link IResourceModule}.
*/
protected final IModule getResourceModule() {
return _resourceModule;
}
/**
* <p>
* Returns the {@link BundleManifest} for the manifest template.
* </p>
*
* @return the {@link BundleManifest} for the manifest template.
*/
protected final BundleManifest getManifestTemplate() {
return _manifestTemplate;
}
/**
* <p>
* Returns the {@link BundleManifest} for the original manifest.
* </p>
*
* @return the {@link BundleManifest} for the original manifest.
*/
protected final BundleManifest getOriginalManifest() {
return _originalManifest;
}
/**
* <p>
* Returns the {@link IManifestPreferences}.
* </p>
*
* @return the {@link IManifestPreferences}.
*/
protected final IManifestPreferences getManifestPreferences() {
return _manifestPreferences;
}
/**
* <p>
* Returns the {@link IRootArtifact}.
* </p>
*
* @return the {@link IRootArtifact}.
*/
protected final IRootArtifact getRootArtifact() {
return _rootArtifact;
}
/**
* <p>
* Returns the {@link IModuleArtifact}.
* </p>
*
* @return the {@link IModuleArtifact}.
*/
protected final IModuleArtifact getModuleArtifact() {
return _moduleArtifact;
}
/**
* <p>
* </p>
*/
protected abstract void onCreateManifest();
}