COSMOS SDD Runtime P2 Review

From Eclipsepedia

Jump to: navigation, search

The SDD Runtime team took a week to do a deep dive into the framework called Equinox P2, which is part of the Equinox Project under Eclipse.


Contents

Goals

The main goals of the investigation were to determine how far along the p2 framework is and to get an understanding of the overall architecture of the framework. High level discussions had pointed to the architecture following the same issues that the SDD schema and profile is trying to solve, but using different terminology.


Approach

The approach the COSMOS Runtime team took was to divide and conquer. With several "Getting Started" guides on the Equinox Wiki, we each took a guide and attempted to get something built based on the information provided.

Getting Started for Developers

For the Getting Started for Developers guide, we started by following the provided documentation and were met with little success. Retrieving the code and building in an Eclipse 3.3 (Europa) environment was failed because the p2 code relies on libraries developed for the 3.4 (Ganamede). The latest stable build of 3.4 is the M5 build. Once 3.4M5 was downloaded, the reloaded code was compiled and we started moving into running the steps defined in the guide. The first step of running the Metadata Generator SDK was successful, and repository and archive data were generated. We have no way of knowing if the data that is generated is the correct data so we proceeded to the next step.

The next step was to run the director app code, which is supposed to take the metadata directories created in the first step using the generator and make a application area that can be run. Invoking the director app proved troublesome as it would not run and threw the following error.

       osgi> !SESSION 2008-02-21 12:35:51.494
       -----------------------------------------------
       eclipse.buildId=unknown
       java.version=1.5.0_12
       java.vendor=Sun Microsystems Inc.
       BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US Framework 
       arguments:  -application org.eclipse.equinox.p2.director.app.application -metadataRepository file:C:\equinox.p2\servers\ -artifactRepository file:C:\equinox.p2\servers\-installIU sdk -destination C:\equinox.p2\eclipseApp\ -flavor tooling -profile foo 
       Command-line arguments:  -dev file:C:/jehamm/dev/open_source/.metadata/.plugins/org.eclipse.pde.core/directorapp/dev.properties  
       console -consolelog -application org.eclipse.equinox.p2.director.app.application -metadataRepository file:C:\equinox.p2\servers\ -artifactRepository file:C:\equinox.p2\servers\ -installIU sdk -destination C:\equinox.p2\eclipseApp\ -flavor tooling -profile foo
       !ENTRY org.eclipse.osgi 4 0 2008-02-21 12:35:52.212 !MESSAGE 
       Application error !STACK 1
       java.lang.IllegalStateException: Unable to acquire application service.
       Ensure that the org.eclipse.core.runtime bundle is resolved and started (see config.ini).
       at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:72)
       at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:362)
       at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:175)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
       at java.lang.reflect.Method.invoke(Unknown Source)
       atorg.eclipse.equinox.launcher.Main.invokeFramework(Main.java:564)
       at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504)
       at org.eclipse.equinox.launcher.Main.run(Main.java:1251)
       at org.eclipse.equinox.launcher.Main.main(Main.java:1227)


After getting this error an email was sent to the equinox-dev group requesting any help regarding this error. In the meantime, some time spent searching through the p2 dev mailing turned up some things to try to correct the problem but nothing worked. After a couple of iterations over email though various individuals we were never able to get past the first step in the Getting Started For Developers Guide.

Webapp QuickStart

In addition to working through the developers guide, we also tackled the WebApp Quick Start guide. This quick start is designed to show how to use the p2 framework to deploy an existing war file into a Tomcat or JBoss application thus provisioning some new jsp files.

To start this investigation, we used an instance of JBoss and downloaded and installed the provBridge.war file and the metajsp.war file into JBoss.

Analysis


Deploying the war files starts the OSGI> prompt up but it immediatly started throwing errors in loading as shown below.

       15:14:28,224 INFO  [TomcatDeployer] deploy, ctxPath=/metajsp, warUrl=.../tmp/deploy/tmp35322metajsp-exp.war/
       15:14:28,349 WARN  [config] Unable to process deployment descriptor for context 'null'
       15:14:30,693 INFO  [TomcatDeployer] deploy, ctxPath=/provbridge, warUrl=.../tmp/deploy/tmp35323provbridge-exp.war/
       osgi> 
       15:14:32,146 ERROR [STDERR] Can't install org.mozilla.rhino/1.6.0.200706271604 from location file:/C:/JBoss/jboss4.2.2.GA/server/default/work/jboss.web/localhost/provbridge/eclipse/plugins/org.mozilla.rhino_1.6.0.200706271604/
       15:14:32,177 ERROR [STDERR] Can't install com.thoughtworks.xstream/1.0.0 from location file:/C:/JBoss/jboss-4.2.2.GA/server/default/work/jboss.web/localhost/provbridge/eclipse/plugins/com.thoughtworks.xstream_1.0.0/
       15:14:32,787 ERROR [STDERR] org.osgi.framework.BundleException: The bundle could not be resolved. Reason: Missing Constraint: Import-Package: org.eclipse.equinox.prov.artifact.repository; version="0.0.0"
       15:14:32,787 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:305)
       15:14:32,787 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:260)
       15:14:32,802 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:252)
       15:14:32,802 ERROR [STDERR]     at org.eclipse.equinox.simpleconfigurator.internal.ConfigApplier.startBundle (ConfigApplier.java:186)
       15:14:32,802 ERROR [STDERR]     at org.eclipse.equinox.simpleconfigurator.internal.ConfigApplier.install(ConfigApplier.java:51)
       15:14:32,802 ERROR [STDERR]     at org.eclipse.equinox.simpleconfigurator.internal.SimpleConfiguratorImpl.applyConfiguration(SimpleConfiguratorImpl.java:83)
       15:14:32,802 ERROR [STDERR]     at org.eclipse.equinox.simpleconfigurator.internal.SimpleConfiguratorImpl.applyConfiguration(SimpleConfiguratorImpl.java:94)
       15:14:32,802 ERROR [STDERR]     at org.eclipse.equinox.simpleconfigurator.internal.Activator.start(Activator.java:47)
       15:14:32,818 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(BundleContextImpl.java:999)
       15:14:32,818 ERROR [STDERR]     at java.security.AccessController.doPrivileged(Native Method)
       15:14:32,818 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:993)
       15:14:32,818 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:974)
       15:14:32,818 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:346)
       15:14:32,818 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:350)
       15:14:32,818 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1118)
       15:14:32,834 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:634)
       15:14:32,834 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:508)
       15:14:32,834 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:282)
       15:14:32,834 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:468)
       15:14:32,834 ERROR [STDERR]     at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:195)
       15:14:32,834 ERROR [STDERR]     at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:297)
       15:14:32,849 ERROR [STDERR] org.osgi.framework.BundleException: The bundle could not be resolved. Reason: Missing         Constraint: Import-Package: org.eclipse.equinox.prov.artifact.repository; version="0.0.0"
       15:14:32,849 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:305)
       15:14:32,849 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:260)
       15:14:32,849 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:252)
       15:14:32,849 ERROR [STDERR]     at org.eclipse.equinox.simpleconfigurator.internal.ConfigApplier.startBundles(ConfigApplier.java:186)
       15:14:32,865 ERROR [STDERR]     at org.eclipse.equinox.simpleconfigurator.internal.ConfigApplier.install(ConfigApplier.java:51)
       15:14:32,865 ERROR [STDERR]     at org.eclipse.equinox.simpleconfigurator.internal.SimpleConfiguratorImpl.applyConfiguration(SimpleConfiguratorImpl.java:83)
       15:14:32,865 ERROR [STDERR]     at org.eclipse.equinox.simpleconfigurator.internal.SimpleConfiguratorImpl.applyConfiguration(SimpleConfiguratorImpl.java:94)
       15:14:32,865 ERROR [STDERR]     at org.eclipse.equinox.simpleconfigurator.internal.Activator.start(Activator.java:47)
       15:14:32,865 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(BundleContextImpl.java:999)
       15:14:32,865 ERROR [STDERR]     at java.security.AccessController.doPrivileged(Native Method)
       15:14:32,881 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:993)
       15:14:32,881 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:974)
       15:14:32,881 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:346)
       15:14:32,881 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:350)
       15:14:32,881 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1118)
       15:14:32,881 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:634)
       15:14:32,881 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:508)
       15:14:32,896 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:282)
       15:14:32,896 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:468)
       15:14:32,896 ERROR [STDERR]     at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:195)
       15:14:32,896 ERROR [STDERR]     at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:297)
       15:14:32,896 ERROR [STDERR] org.osgi.framework.BundleException: The bundle could not be resolved. Reason: Missing Constraint: Import-Package: org.eclipse.equinox.prov.artifact.repository; version="0.0.0"
       15:14:32,912 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:305)
       15:14:32,912 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:260)
       15:14:32,912 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:252)
       15:14:32,912 ERROR [STDERR]     at org.eclipse.equinox.simpleconfigurator.internal.ConfigApplier.startBundles(ConfigApplier.java:186)
       15:14:32,912 ERROR [STDERR]     at org.eclipse.equinox.simpleconfigurator.internal.ConfigApplier.install(ConfigApplier.java:51)
       15:14:32,912 ERROR [STDERR]     at org.eclipse.equinox.simpleconfigurator.internal.SimpleConfiguratorImpl.applyConfiguration(SimpleConfiguratorImpl.java:83)
       15:14:32,927 ERROR [STDERR]     at org.eclipse.equinox.simpleconfigurator.internal.SimpleConfiguratorImpl.applyConfiguration(SimpleConfiguratorImpl.java:94)
       15:14:32,927 ERROR [STDERR]     at org.eclipse.equinox.simpleconfigurator.internal.Activator.start(Activator.java:47)
       15:14:32,927 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(BundleContextImpl.java:999)
       15:14:32,927 ERROR [STDERR]     at java.security.AccessController.doPrivileged(Native Method)
       15:14:32,927 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:993)
       15:14:32,927 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:974)
       15:14:32,943 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:346)
       15:14:32,943 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:350)
       15:14:32,943 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1118)
       15:14:32,943 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:634)
       15:14:32,943 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:508)
       15:14:32,943 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:282)
       15:14:32,943 ERROR [STDERR]     at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:468)
       15:14:32,959 ERROR [STDERR]     at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:195)
       15:14:32,959 ERROR [STDERR]     at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:297)
       15:14:33,693 INFO  [Http11Protocol] Starting Coyote HTTP/1.1 on http-127.0.0.1-8080
       15:14:33,709 INFO  [AjpProtocol] Starting Coyote AJP/1.3 on ajp-127.0.0.1-8009
       15:14:33,802 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 28s:437ms


There was no further information available and since the guide has not been updated since October of 2007, we decided not to pursue this any further.

Getting Started

In addition to working through the developers guide, we simultaneously tackled the Getting Started guide.

Summary

It appears that the Equinox p2 effort is in major flux at this moment and we are coming into the mix at a bad time. The Equinox team is preparing for EclipseCon and have stated that they have little to no time to devote to this initiative. They have however responded to the emails to the equinox-dev list in timely manors. It is our recommendation that we focus our energy on identifying the parts of the Solstice runtime effort that would be necessary even if we did decide to extend the p2 framework. This includes the work of reading, verifying a SDD schema, creating and updating MDR information, and communication with a CMDB(f) system.


Latest ( 2/26/2008 )

The source code for the p2 project has been relocated from its CVS repository into a new location. The new code location is /cvsroot/eclipse/org.eclipse.equinox/p2/. To get the new code and start afresh, I have removed all of the original code and started with a clean build. I have successfully been able to run both the Metadata Generator SDK and the director app and have created a working Eclipse Application as advertised in the Getting Started for Developers Guide. Now to figure out what all of this really means....


There are two metadata repositories under p2, each of which are represented in a single xml file: content.xml and artifacts.xml. Artifacts.xml describes the location and size of individual Installable Units (in the p2 sense of an Installable Unit). For p2 as it exists, each of these IUs are OSGi bundles, and each are represented by an artifact tag in artifacts.xml, which contains an id, a version number, and properties (although at the moment, the properties seem to be limited to artifact size and download size).

The artifacts file simply maps IU packages (for whom the metadata can be found in the content repository) to a physical repository location. In the artifact repository shown above, the repository tag has a name attribute that identifies the repositoryURL (referenced later in the repoUrl variable in the mappings section). This, coupled with the id and version information found in attributes of each artifact tag, allows the runtime environment to know where to get each artifact at install time. Note that the repository can be local, but also could be hosted anywhere that is accessible from the client machine.

The content repository (represented in content.xml) contains far more information about each IU (referred to in the content repository as a "unit"), and creates additional units by grouping the IUs identified in the artifact repository. Any unit that has

<property name='org.eclipse.equinox.p2.type.group' value='true'/>

in its properties section represents an installable entity, and can be composed of any number of required units, which may themselves be composed of other required units, much like a composite SDD. Conceptually, there is a disconnect between p2's bundling of installable software and the bundling of an SDD. For an SDD, an installable unit is a package structure such as a jar that includes a descriptor and some collection of files, whereas in p2, the "descriptor" (essentially the contents of a unit tag within the contents repository) is grouped with many other descriptors in the same repository, and the collection of installable files is located in a completely independent location which is referenced by the artifacts repository.

p2's bundling makes more sense when considered from the point of view of p2's role as a provisioning framework, because it allows the signifigantly larger installable fileset to be held in an independent, central location, while the much more portable metadata can be duplicated on client hosts as needed, and through tooling the user can selectively download the installable files at install time. For an individual client downloading software, this whole process might seem like overkill to install a single piece of software, so there would probably continue to be benefit in also retaining the single package format of an SDD as it currently exists.

These distinctions, however, have more to do with packaging and less to do with data incompatibilities, and so do not limit the viability of p2 as a runtime for SDDs. The real overlap seems to be the SDD content repository (content.xml) and the SDD itself. The SDD is composed of two files, a Package Descriptor and a Deployment Descriptor. The Package Descriptor is simpler than the Deployment Descriptor, and contains information such as human readable descriptions, version, build, and manufacturer information, etc. It also contains information about what is bundled in the package (for example, an executable for an installer, the deployment descriptor, and a language bundle).

An SDD package descriptor is a superset of both the p2 content repository and the p2 artifact repository. It contains all of the information describing the package that is contained in the p2 content repository (name, version, description, licensing, etc) as well as a reference to the packaged deliverables (although as mentioned before, the p2 content repository references p2 artifact repository entries to resolve actual content location, whereas the SDD package descriptor is referencing a files in an accompanying package). The SDD deployment descriptor is also a superset of a p2 content repository, in that both contain dependency information, information about the final deliverable, and references to other like entities (i.e. an p2 content repository unit references other units that compose it, and an SDD Deployment Descriptor can reference other Deployment Descriptors that are subcomponents). However, the SDD Deployment Descriptor also contains information about restrictions on the hosting topology, disk space requirements, and much more.

In a nutshell, it appears that the differences between p2 and SDDs at the moment are packaging and scope of metadata. It is conceivable that the SDD packaging paradigm could be rearranged to use the artifact repository model from p2 and benefit from its provisioning functionality, and that the p2 content repository could replace the proprietary content of each unit node with a SDD package descriptor - deployment descriptor pair and benefit from the standardization and breadth of scope of the SDD work.

In terms of runtime installation, p2 addresses the laying down of bits through a pluggable framework of touchpoints, which are a collection of actions that are specific to a domain. A fairly comprehensive touchpoint has been developed by Equinox for OSGi component installation, and a "native" touchpoint has been developed for common tasks such as unzipping files, setting file permissions, etc. More collaborative work needs to be done jointly by the COSMOS and Equinox teams to determine if the touchpoint paradigm is flexible enough and appropriate for handling the generic types of installations that are necessary to meet the requirements of an SDD runtime. In theory, what would be required is development of installation packaging specific touchpoints for installing any of the different types of packages that an SDD describes (for example, a RPM touchpoint, an InstallShield touchpoint, etc). There would also need to be a touchpoint action defined for reporting to a Management Data Repository (MDR) for federated application deployment scenarios. The useability of the p2 runtime for SDD deployment tooling will become more clear as the SDD deployment use cases are finalized, and as the Equinox team has more available time for collaboration after EclipseCon 2008.

Examples of a p2 artifact and content repository and an SDD Package Descriptor and Deployment Descriptor are shown below.

p2 content repository

<repository name='file:C:/equinox.p2/servers/ - artifacts' type='org.eclipse.equinox.p2.artifact.repository.simpleRepository' version='1'>
  <properties size='1'>
    <property name='p2.compressed' value='false'/>
  </properties>
  <mappings size='3'>
    <rule filter='(& (classifier=osgi.bundle))' output='${repoUrl}/plugins/${id}_${version}.jar'/>
    <rule filter='(& (classifier=binary))' output='${repoUrl}/binary/${id}_${version}'/>
    <rule filter='(& (classifier=org.eclipse.update.feature))' output='${repoUrl}/features/${id}_${version}.jar'/>
  </mappings>
  <artifacts size='265'>
    <artifact classifier='osgi.bundle' id='org.eclipse.ant.ui.source' version='3.2.200.v20080129'>
      <properties size='2'>
        <property name='artifact.size' value='613634'/>
        <property name='download.size' value='613634'/>
      </properties>
    </artifact>
    <artifact classifier='org.eclipse.update.feature' id='org.eclipse.rcp.source' version='3.4.0.v20071210-969FEZVEiQrbR-uMIfkIhLJ'>
      <properties size='2'>
        <property name='artifact.size' value='0'/>
        <property name='download.size' value='28157'/>
      </properties>
    </artifact>
    <artifact classifier='osgi.bundle' id='org.apache.lucene.analysis.source' version='1.9.1.v200711021015'>
      <properties size='2'>
        <property name='artifact.size' value='0'/>
        <property name='download.size' value='358698'/>
      </properties>
    </artifact>
    .
    .
    .
    
    <artifact classifier='osgi.bundle' id='org.eclipse.jsch.core' version='1.1.100.I20080204-0800'>
      <properties size='2'>
        <property name='artifact.size' value='33052'/>
        <property name='download.size' value='33052'/>
      </properties>
    </artifact>
  </artifacts>
</repository>

p2 artifact repository:

<?xml version='1.0' encoding='UTF-8'?>
<?metadataRepository class='org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository' version='0.0.1'?>
<repository name='file:C:/equinox.p2/servers/ - metadata' type='org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository' version='1.0.0'>
  <properties size='1'>
    <property name='p2.compressed' value='false'/>
  </properties>
  <units size='323'>
    <unit id='org.eclipse.update.ui.source' version='3.2.100.v20070615' singleton='false'>
      <update id='org.eclipse.update.ui.source' range='0.0.0' severity='0' description='A description'/>
      <properties size='2'>
        <property name='equinox.p2.name' value='Install/Update UI Source'/>
        <property name='equinox.p2.provider' value='Eclipse.org'/>
      </properties>
      <provides size='3'>
        <provided namespace='org.eclipse.equinox.p2.iunamespace' name='org.eclipse.update.ui.source' version='3.2.100.v20070615'/>
        <provided namespace='osgi.source.bundles' name='org.eclipse.update.ui.source' version='3.2.100.v20070615'/>
        <provided namespace='org.eclipse.equinox.p2.eclipsetouchpoint.types' name='source' version='1.0.0'/>
      </provides>
      <artifacts size='1'>
        <artifact classifier='plugin' id='org.eclipse.update.ui.source' version='3.2.100.v20070615'/>
      </artifacts>
      <touchpoint id='eclipse' version='1.0.0'/>
      <touchpointData size='1'>
        <instructions size='1'>
          <instruction key='manifest'>
            Manifest-Version: 1.0 Bundle-Vendor: Eclipse.org
            Eclipse-SourceBundle:
            org.eclipse.update.ui;version="3.2.100.v20070615";roots:="."
            Bundle-Name: Install/Update UI Source Bundle-Version: 3.2.100.v20070615
            eclipse.p2.bundle.format: jar Bundle-ManifestVersion: 2 Bundle-Localization: plugin
            Bundle-SymbolicName: org.eclipse.update.ui.source
          </instruction>
        </instructions>
      </touchpointData>
    </unit>
    <unit id='org.eclipse.core.filebuffers' version='3.3.100.v20080204-1800'>
      <update id='org.eclipse.core.filebuffers' range='0.0.0' severity='0' description='A description'/>
      <properties size='2'>
        <property name='equinox.p2.name' value='File Buffers'/>
        <property name='equinox.p2.provider' value='Eclipse.org'/>
      </properties>
      <provides size='6'>
        <provided namespace='org.eclipse.equinox.p2.iunamespace' name='org.eclipse.core.filebuffers' version='3.3.100.v20080204-1800'/>
        <provided namespace='osgi.bundles' name='org.eclipse.core.filebuffers' version='3.3.100.v20080204-1800'/>
        <provided namespace='osgi.packages' name='org.eclipse.core.filebuffers' version='0.0.0'/>
        <provided namespace='osgi.packages' name='org.eclipse.core.filebuffers.manipulation' version='0.0.0'/>
        <provided namespace='osgi.packages' name='org.eclipse.core.internal.filebuffers' version='0.0.0'/>
        <provided namespace='org.eclipse.equinox.p2.eclipsetouchpoint.types' name='bundle' version='1.0.0'/>
      </provides>
      <requires size='5'>
        <required namespace='osgi.bundles' name='org.eclipse.core.runtime' range='[3.2.0,4.0.0)'/>
        <required namespace='osgi.bundles' name='org.eclipse.core.resources' range='[3.2.0,4.0.0)' optional='true'/>
        <required namespace='osgi.bundles' name='org.eclipse.text' range='[3.4.0,4.0.0)'/>
        <required namespace='osgi.bundles' name='org.eclipse.core.filesystem' range='[1.1.0,2.0.0)'/>
        <required namespace='osgi.packages' name='com.ibm.icu.text' range='0.0.0'/>
      </requires>
      <artifacts size='1'>
        <artifact classifier='plugin' id='org.eclipse.core.filebuffers' version='3.3.100.v20080204-1800'/>
      </artifacts>
      <touchpoint id='eclipse' version='1.0.0'/>
      <touchpointData size='1'>
        <instructions size='1'>
          <instruction key='manifest'>
            Bundle-Activator:
            org.eclipse.core.internal.filebuffers.FileBuffersPlugin Require-Bundle:
            org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)";resolution:=optional,org.eclipse.text;bundle-version="[3.4.0,4.0.0)",org.eclipse.core.filesystem;bundle-version="[1.1.0,2.0.0)"
            Manifest-Version: 1.0 Bundle-Vendor: Eclipse.org Bundle-RequiredExecutionEnvironment:
            J2SE-1.4 Import-Package: com.ibm.icu.text Bundle-Name: File Buffers Export-Package:
            org.eclipse.core.filebuffers,org.eclipse.core.filebuffers.manipulation,org.eclipse.core.internal.filebuffers;x-internal:=true
            Bundle-Version: 3.3.100.v20080204-1800 eclipse.p2.bundle.format: jar
            Bundle-ManifestVersion: 2 Bundle-ActivationPolicy: lazy Bundle-Localization: plugin
            Bundle-SymbolicName: org.eclipse.core.filebuffers; singleton:=true
          </instruction>
        </instructions>
      </touchpointData>
    </unit>
    <unit id='toolingorg.eclipse.launcher_eclipse.exe' version='1.0.0' singleton='false' fragment='true' hostId='org.eclipse.launcher_eclipse.exe' hostRange='1.0.0'>
      <provides size='2'>
        <provided namespace='org.eclipse.equinox.p2.type' name='iu.fragment' version='1.0.0'/>
        <provided namespace='org.eclipse.equinox.p2.iunamespace' name='toolingorg.eclipse.launcher_eclipse.exe' version='1.0.0'/>
      </provides>
      <requires size='1'>
        <required namespace='org.eclipse.equinox.p2.iunamespace' name='org.eclipse.launcher_eclipse.exe' range='1.0.0'/>
      </requires>
      <touchpoint id='native' version='1.0.0'/>
      <touchpointData size='1'>
        <instructions size='2'>
          <instruction key='install'>
            unzip(source:@artifact, target:${installFolder});
          </instruction>
          <instruction key='uninstall'>
            cleanupzip(source:@artifact, target:${installFolder});
          </instruction>
        </instructions>
      </touchpointData>
    </unit>
    .
    .
    .
    <unit id='org.eclipse.help.source.feature.jar' version='1.0.0.v20080111-7r7vELyEJkXu1bUy3St98B0vNJgl'>
      <provides size='3'>
        <provided namespace='org.eclipse.equinox.p2.iu' name='org.eclipse.help.source.feature.jar' version='1.0.0.v20080111-7r7vELyEJkXu1bUy3St98B0vNJgl'/>
        <provided namespace='org.eclipse.equinox.p2.eclipse.type' name='feature' version='1.0.0'/>
        <provided namespace='org.eclipse.update.feature' name='org.eclipse.help.source' version='1.0.0.v20080111-7r7vELyEJkXu1bUy3St98B0vNJgl'/>
      </provides>
      <filter>
        (org.eclipse.update.install.features=true)
      </filter>
      <artifacts size='1'>
        <artifact classifier='org.eclipse.update.feature' id='org.eclipse.help.source' version='1.0.0.v20080111-7r7vELyEJkXu1bUy3St98B0vNJgl'/>
      </artifacts>
      <touchpoint id='org.eclipse.equinox.p2.osgi' version='1.0.0'/>
      <touchpointData size='1'>
        <instructions size='1'>
          <instruction key='zipped'>
            true
          </instruction>
        </instructions>
      </touchpointData>
      <licenses size='1'>
        <license>
          ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT
          ...
        </license>
      </licenses>
      <copyright>
        Copyright (c) 2000, 2007 IBM Corporation and others.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/epl-v10.html

Contributors:
IBM Corporation - initial API and implementation

      </copyright>
    </unit>
  </units>
</repository>

    

SDD Package Descriptor:

<?xml version="1.0" encoding="UTF-8"?>
<sdd-pd:PackageDescriptor 
	xmlns:sdd-pd="http://docs.oasis-open.org/sdd/1/0/packageDescriptor" 
	xmlns:sdd-common="http://docs.oasis-open.org/sdd/1/0/common" 
	xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://docs.oasis-open.org/sdd/1/0/packageDescriptor wd-sdd-packageDescriptor-1.0.xsd" 
	descriptorID="50001111111111111111111111111111" 
	lastModified="2006-10-07T09:30:00.0Z" 
	schemaVersion="1.0">
	<sdd-pd:PackageIdentity softwareID="5000-123" packageType="baseInstall">
		<sdd-common:Description>This Simple Composite Application is wonderful 3-tier application to demonstrate things.</sdd-common:Description>
		<sdd-common:Name>Simple Composite Application</sdd-common:Name>
		<sdd-common:Version>1.0</sdd-common:Version>
		<sdd-common:Manufacturer>
			<sdd-common:Name>IBM Corporation</sdd-common:Name>
			<sdd-common:Location>
				<sdd-common:Address>1133 Westchester Avenue White Plains, New York 10604</sdd-common:Address>
				<sdd-common:Country>U.S.A.</sdd-common:Country>
			</sdd-common:Location>
		</sdd-common:Manufacturer>
	</sdd-pd:PackageIdentity>
	<sdd-pd:Contents>
 		<sdd-pd:Content pathname="SimpleCompositeApp.xml" id="SC_DD" purpose="deploymentDescriptor"/>
 		<sdd-pd:Content pathname="files/SimpleApp.sh" id="SC_Script" purpose="content"/>
 		<sdd-pd:Content pathname="files/SimpleApp.ear" id="SC_EAR" purpose="content"/>
 		<sdd-pd:Content pathname="files/SimpleApp.war" id="SC_WAR" purpose="content"/>
 		<sdd-pd:Content pathname="files/SimpleApp.ddl" id="SC_ORACLE_DDL" purpose="content"/>
 		<sdd-pd:Content pathname="files/SimpleApp.ddl" id="SC_DB2_DDL" purpose="content"/>
	</sdd-pd:Contents>
</sdd-pd:PackageDescriptor>

SDD Deployment Descriptor:

<?xml version="1.0" encoding="UTF-8"?>
<sdd-dd:DeploymentDescriptor
	xmlns:sdd-dd="http://docs.oasis-open.org/sdd/1/0/deploymentDescriptor"
	xmlns:sdd-common="http://docs.oasis-open.org/sdd/1/0/common"
	xmlns:cim="http://docs.oasis-open.org/sdd/1/0/cim-Profile"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://docs.oasis-open.org/sdd/1/0/deploymentDescriptor wd-sdd-deploymentDescriptor-1.0.xsd"
	schemaVersion="1.0" 
	lastModified="2006-10-13T09:30:47.0Z"
	descriptorID="50101111111111111111111111111111">
	<sdd-dd:Topology>
		<sdd-dd:Resource id="J2eeServletServer" type="cim:CIM_J2eeServer">
			<sdd-dd:HostedResource id="SimpleJ2eeServlet" type="cim:CIM_J2eeServlet"/>
		</sdd-dd:Resource>
		<sdd-dd:Resource id="appServer_os" type="cim:CIM_OperatingSystem">
			<sdd-dd:HostedResource id="J2eeAppServer" type="cim:CIM_J2eeServer">
				<sdd-dd:HostedResource id="SimpleJ2eeApp" type="cim:CIM_J2eeApplication"/>
			</sdd-dd:HostedResource>
		</sdd-dd:Resource>
		<sdd-dd:Resource id="os" type="cim:CIM_OperatingSystem">
			<sdd-dd:HostedResource id="DatabaseServer" type="cim:CIM_DatabaseSystem">
				<sdd-dd:HostedResource id="SimpleDatabase" type="cim:CIM_CommonDatabase"/>
			</sdd-dd:HostedResource>
		</sdd-dd:Resource>
	</sdd-dd:Topology> 
	<sdd-dd:CompositeInstallable id="CompApp01" operation="install">
		<sdd-dd:Identity softwareID="5000-123">
			<sdd-common:Description>This simple application increases performance with its 3-tier architecture.</sdd-common:Description>
			<sdd-common:Name>Simple Composite Application</sdd-common:Name>
			<sdd-common:Version>1.0</sdd-common:Version>
			<sdd-common:Manufacturer>
				<sdd-common:Name>IBM Corporation</sdd-common:Name>
				<sdd-common:Location>
					<sdd-common:Address>1133 Westchester Avenue White Plains, New York 10604</sdd-common:Address>
					<sdd-common:Country>U.S.A.</sdd-common:Country>
				</sdd-common:Location>
			</sdd-common:Manufacturer>
		</sdd-dd:Identity>
		<sdd-dd:Variables>
			<sdd-dd:Parameters>
				<sdd-dd:StringParameter id="JDBC_User"/>
				<sdd-dd:StringParameter id="JDBC_Password" sensitive="true"/>
			</sdd-dd:Parameters>
		</sdd-dd:Variables>
		<sdd-dd:BaseContent>
	 		<sdd-dd:InstallableUnit id="SimpleJ2eeAppUnit" targetResourceRef="appServer_os">
				<sdd-dd:Identity>
					<sdd-common:Description>The back end business logic of the Simple Composite Application.</sdd-common:Description>
					<sdd-common:Name>Simple Application Business Logic</sdd-common:Name>
					<sdd-common:Version>1.0</sdd-common:Version>
				</sdd-dd:Identity>
				<sdd-dd:Requirements>
					<sdd-dd:Requirement id="AppServer.reqt" operation="install use">
						<sdd-dd:ResourceConstraint id="J2eeAppServer.check" resourceRef="J2eeAppServer">
							<sdd-dd:Name>WebSphere Application Server</sdd-dd:Name>
							<sdd-dd:VersionConstraint>
								<sdd-dd:Supported>
									<sdd-dd:Range>
										<sdd-dd:MinVersion>6.0</sdd-dd:MinVersion>
										<sdd-dd:MaxVersion inclusive="false">6.2</sdd-dd:MaxVersion>
									</sdd-dd:Range>
								</sdd-dd:Supported>
							</sdd-dd:VersionConstraint>
							<sdd-dd:RelationshipConstraint relatedResourceRef="DatabaseServer" type="connects">
								<sdd-dd:Property>
									<sdd-dd:PropertyName>Protocol</sdd-dd:PropertyName>
									<sdd-dd:Value>JDBC</sdd-dd:Value>
								</sdd-dd:Property>					
							</sdd-dd:RelationshipConstraint>				
						</sdd-dd:ResourceConstraint>
					</sdd-dd:Requirement>
				</sdd-dd:Requirements>
				<sdd-dd:ResultingResource resourceRef="SimpleJ2eeApp">
					<sdd-dd:Name>Simple Application</sdd-dd:Name>
					<sdd-dd:Relationship relatedResourceRef="SimpleDatabase" type="uses">
						<sdd-dd:Property>
							<sdd-dd:PropertyName>Protocol</sdd-dd:PropertyName>
							<sdd-dd:Value>JDBC</sdd-dd:Value>
						</sdd-dd:Property>					
					</sdd-dd:Relationship>				
				</sdd-dd:ResultingResource>
				<sdd-dd:Artifacts>
					<sdd-dd:InstallArtifact type="jacl_script" contentRef="SC_Script">
						<sdd-dd:Arguments>
							<sdd-dd:Argument name="$(JDBC_User)"/>
							<sdd-dd:Argument name="$(JDBC_Password)"/>
						</sdd-dd:Arguments>
						<sdd-dd:AdditionalContent type="ear" contentRef="SC_EAR"/>
					</sdd-dd:InstallArtifact>
				</sdd-dd:Artifacts>
			</sdd-dd:InstallableUnit>
			<sdd-dd:InstallableUnit id="SimpleJ2eeServletUnit" targetResourceRef="J2eeServletServer">
				<sdd-dd:Identity>
					<sdd-common:Description>The user interface for the Simple Composite Application.</sdd-common:Description>
					<sdd-common:Name>Simple Application Servlets</sdd-common:Name>
					<sdd-common:Version>1.0</sdd-common:Version>
				</sdd-dd:Identity>	
				<sdd-dd:Requirements>
					<sdd-dd:Requirement id="ServletServer.reqt" operation="install use">
						<sdd-dd:ResourceConstraint id="J2eeServletServer.check" resourceRef="J2eeServletServer">
							<sdd-dd:Name>Apache Tomcat</sdd-dd:Name>
							<sdd-dd:VersionConstraint>
								<sdd-dd:Supported>
									<sdd-dd:Value>
										<sdd-dd:Version>5.5.20</sdd-dd:Version>
									</sdd-dd:Value>
								</sdd-dd:Supported>
							</sdd-dd:VersionConstraint>
							<sdd-dd:RelationshipConstraint relatedResourceRef="J2eeAppServer" type="connects" >
								<sdd-dd:Property>
									<sdd-dd:PropertyName>Protocol</sdd-dd:PropertyName>
									<sdd-dd:Value>RMI-IIOP</sdd-dd:Value>
								</sdd-dd:Property>					
							</sdd-dd:RelationshipConstraint>
						</sdd-dd:ResourceConstraint>
					</sdd-dd:Requirement>
				</sdd-dd:Requirements>
				<sdd-dd:ResultingResource resourceRef="SimpleJ2eeServlet">
					<sdd-dd:Name>Simple Application Servlet</sdd-dd:Name>
					<sdd-dd:Relationship relatedResourceRef="SimpleJ2eeApp" type="uses" >
						<sdd-dd:Property>
							<sdd-dd:PropertyName>Protocol</sdd-dd:PropertyName>
							<sdd-dd:Value>RMI-IIOP</sdd-dd:Value>
						</sdd-dd:Property>					
					</sdd-dd:Relationship>		
				</sdd-dd:ResultingResource>
				<sdd-dd:Artifacts>
					<sdd-dd:InstallArtifact type="war" contentRef="SC_WAR"/>
				</sdd-dd:Artifacts>
			</sdd-dd:InstallableUnit>
			<sdd-dd:InstallableUnit id="OracleSimpleDatabaseUnit" targetResourceRef="DatabaseServer">
				<sdd-dd:Identity>
					<sdd-common:Description>The RDBMS Database structure for the Simple Composite Application.</sdd-common:Description>
					<sdd-common:Name>Simple Application Datbase</sdd-common:Name>
					<sdd-common:Version>1.0</sdd-common:Version>
				</sdd-dd:Identity>
				<sdd-dd:Condition>
				 	<sdd-dd:ResourceConstraint id="OracleDatabaseServer.condition" resourceRef="DatabaseServer">
						<sdd-dd:Name>Oracle 9iAS</sdd-dd:Name>
					</sdd-dd:ResourceConstraint>
				</sdd-dd:Condition>	
				<sdd-dd:Requirements>
					<sdd-dd:Requirement id="OracleDatabaseServer.reqt" operation="install use">
						<sdd-dd:ResourceConstraint id="OracleDatabaseServer.check" resourceRef="DatabaseServer">
							<sdd-dd:Name>Oracle 9iAS</sdd-dd:Name>
							<sdd-dd:VersionConstraint>
								<sdd-dd:Supported>
									<sdd-dd:Range>
										<sdd-dd:MinVersion>9.0</sdd-dd:MinVersion>
									</sdd-dd:Range>
								</sdd-dd:Supported>
							</sdd-dd:VersionConstraint>
						</sdd-dd:ResourceConstraint>
					</sdd-dd:Requirement>
				</sdd-dd:Requirements>
				<sdd-dd:ResultingResource resourceRef="SimpleDatabase">
					<sdd-dd:Name>Simple Application Database</sdd-dd:Name>
				</sdd-dd:ResultingResource>
				<sdd-dd:Artifacts>
					<sdd-dd:InstallArtifact type="ddl" contentRef="SC_ORACLE_DDL"/>
				</sdd-dd:Artifacts>
			</sdd-dd:InstallableUnit>
			<sdd-dd:InstallableUnit id="DB2SimpleDatabaseUnit" targetResourceRef="DatabaseServer">
				<sdd-dd:Identity>
					<sdd-common:Description>The RDBMS Database structure for the Simple Composite Application.</sdd-common:Description>
					<sdd-common:Name>Simple Application Datbase</sdd-common:Name>
					<sdd-common:Version>1.0</sdd-common:Version>
				</sdd-dd:Identity>
				<sdd-dd:Condition>
				 	<sdd-dd:ResourceConstraint id="DB2DatabaseServer.condition" resourceRef="DatabaseServer">
						<sdd-dd:Name>DB2 9</sdd-dd:Name>
					</sdd-dd:ResourceConstraint>
				</sdd-dd:Condition>	
				<sdd-dd:Requirements>
					<sdd-dd:Requirement id="DB2DatabaseServer.reqt" operation="install use">
						<sdd-dd:ResourceConstraint id="DB2DatabaseServer.check" resourceRef="DatabaseServer">
							<sdd-dd:Name>DB2 9</sdd-dd:Name>
							<sdd-dd:VersionConstraint>
								<sdd-dd:Supported>
									<sdd-dd:Range>
										<sdd-dd:MinVersion>9.0</sdd-dd:MinVersion>
									</sdd-dd:Range>
								</sdd-dd:Supported>
							</sdd-dd:VersionConstraint>
						</sdd-dd:ResourceConstraint>
					</sdd-dd:Requirement>
				</sdd-dd:Requirements>
				<sdd-dd:ResultingResource resourceRef="SimpleDatabase">
					<sdd-dd:Name>Simple Application Database</sdd-dd:Name>
				</sdd-dd:ResultingResource>
				<sdd-dd:Artifacts>
					<sdd-dd:InstallArtifact type="ddl" contentRef="SC_DB2_DDL"/>
				</sdd-dd:Artifacts>
			</sdd-dd:InstallableUnit>
		</sdd-dd:BaseContent>
	</sdd-dd:CompositeInstallable>
</sdd-dd:DeploymentDescriptor>