Apache Felix OSGi Bundle Repository (OBR)
+ +-
+
- Motivation +
- Overview +
- OBR Repository File +
- OBR Service API +
- OBR Shell Command +
- obr help +
- obr list-url +
- obr add-url +
- obr remove-url +
- obr list +
- obr info +
- obr deploy +
- obr start +
- obr source +
- obr javadoc +
- Using OBR with a Proxy +
- Bundle Source Packaging +
- Note on OSGi R3 Bundles +
- Feedback +
-
+
Motivation
+ +The goal of the Apache Felix OSGi Bundle Repository (OBR) is two-fold:
+ +-
+
- To simplify deploying and using available bundles with Felix. +
- To encourage independent bundle development so that communities of interest can grow. +
OBR achieves the first goal by providing a service that can +automatically install a bundle, with its deployment dependencies, from +a bundle repository. This makes it easier for people to experiment with +existing bundles. The second goal is achieved by raising the visibility +of the available bundles and providing access to both the executable +bundle and its source code. Hopefully, by making OBR and the bundles +themselves more visible, community members will be encouraged to +provide or improve service implementations.
+ +Note: OBR provides access to the Felix' default bundle repository, +but you can also use it to deploy your own bundles by creating a bundle +repository meta-data file for your local bundles; see the obr list-url, obr add-url, and obr remove-url commands for more details.
+ + + +Overview
+ +For the most part, OBR is quite simple. An OBR "repository server" +is not necessary, since all functionality may reside on the client +side. OBR is able to provide its functionality by reading an XML-based +meta-data file that describes the bundles available to it. The +meta-data file essentially contains an XML encoding of the bundles' +manifest information. From the meta-data, OBR is able to construct +dependency information for deploying (i.e., installing and updating) +bundles.
+ +OBR defines the following entities:
+ +-
+
- Repository Admin - a service to access a federation of repositories. +
- Repository - provides access to a set of resources. +
- Resource - a description of an artifact to be installed on a device. +
- Capability - a named set of properties. +
- Requirement - an assertion on a capability. +
- Resolver - an object to resolve resource dependencies and to deploy them. +
- Repository file - XML file containing resource meta-data. +
The following diagram illustrates the relationships among these entities:
+ +
The client has access to a federated set of repositories via the Repository Admin service; such as depicted in this view:
+ +
OBR Repository File
+ +The OBR repository file is an XML-based representation of bundle +meta-data. The goal is provide a generic model for describing +dependencies among resources; as such, the term resource is used instead of bundle in the OBR repository syntax; a detailed description of the OBR meta-data format is available in the OSGi RFC 112 +document; this document is not completely in sync with the +implementation, but the concepts are still correct. The following XML +snippet depicts the overall structure of a repository file:
+ +<repository presentationname="..." symbolicname="..." ... > + <resource> + <description>...</description> + <size>...</size> + <documentation>...</documentation> + <source>...</source> + <category id="..."/> + <capability>...</capability> + ... + <requirement>...</requirement> + ... + </resource> + ... +</repository> ++
The above repository defines a set of available resources, each +described by a set of meta-data. Some resource meta-data is purely +intended for human consumption; the most important aspects relate to +the generic capability/requirement model.
+ +A resource can provide any number of capabilities. A capability is a +typed set of properties. For example, the following is an exported +package capability:
+ +<capability name='package'> + <p n='package' v='org.foo.bar'/> + <p n='version' t='version' v='1.0.0'/> +</capability> ++
This capability is of type 'package' and exports 'org.foo.bar' at +version '1.0.0'. Conversely, a requirement is a typed LDAP query over a +set of capability properties. For example, the following is an imported +package requirement:
+ +<require name='package' extend='false' + multiple='false' optional='false' + filter='(&(package=org.foo.bar)(version>=1.0.0))'> + Import package org.foo.bar +</require> ++
This requirement is of type 'package' and imports 'org.foo.bar' at +versions greater than '1.0.0'. Although this syntax looks rather +complicated with the '\&' and '\>=' syntax, it is simply the +standard OSGi LDAP query syntax in XML form (additionally, Peter Kriens +has created a tool called bindex to generate this meta-data from a bundle's manifest).
+ +With this generic dependency model, OBR is able to provide mappings +for the various OSGi bundle dependencies; e.g., import/export package, +provide/require bundle, host/fragment, import/export service, execution +environment, and native code. In addition, it is possible for bundles +to introduce arbitrary dependencies for custom purposes.
+ +Two other important pieces of meta-data are Bundle-SymbolicName and Bundle-Version; +these are standard OSGi bundle manifest attributes that OBR uses to +uniquely identify a bundle. For example, if you want to use OBR to +update a locally installed bundle, OBR gets its symbolic name and +version and searches the repository metadata for a matching symbolic +name. If the matching symbolic name is found, then OBR checks if there +is a newer version than the local copy using the bundle version number. +Thus, the symbolic name plus bundle version forms a unique key to match +locally installed bundles to remotely available bundles.
+ + + +OBR Service API
+ +Typically, OBR service clients only need to interact with the +Repository Admin service, which provides the mechanisms necessary to +discover available resources. The Repository Admin interface is defined +as follows:
+ +public interface RepositoryAdmin +{ + public Resource[] discoverResources(String filterExpr); + public Resolver resolver(); + public Repository addRepository(URL repository)? + throws Exception; + public boolean removeRepository(URL repository); + public Repository[] listRepositories(); + public Resource getResource(String respositoryId); +} ++
In order to resolve and deploy available resources, the Repository +Admin provides Resolver instances, which are defined as follows:
+ +public interface Resolver +{ + public void add(Resource resource); + public Requirement[] getUnsatisfiedRequirements(); + public Resource[] getOptionalResources(); + public Requirement[] getReason(Resource resource); + public Resource[] getResources(Requirement requirement); + public Resource[] getRequiredResources(); + public Resource[] getAddedResources(); + public boolean resolve(); + public void deploy(boolean start); +} ++
When desired resources are discovered via the query mechanisms of +the Repository Admin, they are added to a Resolver instance which will +can be used to resolve all transitive dependencies and to reflect on +any resolution result. The following code snippet depicts a typical +usage scenario:
+ +RepositoryAdmin repoAdmin = ... // Get repo admin service +Resolver resolver = repoAdmin.resolver(); +Resource resource = repoAdmin.discoverResources(filterStr); +resolver.add(resource); +if (resolver.resolve()) +{ + resolver.deploy(true); +} +else +{ + Requirement[] reqs = resolver.getUnsatisfiedRequirements(); + for (int i = 0; i < reqs.length; i++) + { + System.out.println("Unable to resolve: " + reqs[i]); + } +} ++
This code gets the Repository Admin service and then gets a Resolver +instance from it. It then discovers an available resource and adds it +to the resolver. Then it tries to resolve the resources dependencies. +If successful it deploys the resource to the local framework instance; +if not successful it prints the unsatisfied requirements.
+ +OBR's deployment algorithm appears simple at first glance, but it is +actually somewhat complex due to the nature of deploying independently +developed bundles. For example, in an ideal world, if an update for a +bundle is made available, then updates for all of the bundles +satisfying its dependencies are also made available. Unfortunately, +this may not be the case, thus the deployment algorithm might have to +install new bundles during an update to satisfy either new dependencies +or updated dependencies that can no longer be satisfied by existing +local bundles. In response to this type of scenario, the OBR deployment +algorithm tries to favor updating existing bundles, if possible, as +opposed to installing new bundles to satisfy dependencies.
+ +In the general case, OBR user's will not use the OBR API directly, +but will use its functionality indirectly from another tool or user +interface. For example, interactive access to OBR is available via a +command for Felix' shell service. The OBR shell command is discussed in the next section.
+ + + +OBR Shell Command
+ +Besides providing a service API, OBR implements a Felix shell +command for accessing its functionality. For the end user, the OBR +shell command is accessed using the text-based or GUI-based user +interfaces for Felix' shell service. This section describes the syntax +for the OBR shell command.
+ + + +obr help
+ +Syntax:
+obr help [add-url | remove-url | list-url | list | info | deploy | start | source | javadoc] ++
This command is used to display additional information about the other OBR commands.
+ + + +obr list-url
+ +Syntax:
+obr list-url ++
This command gets the URLs to the repository files used by the Repository Admin.
+ + + +obr add-url
+ +Syntax:
+obr add-url [<repository-file-url> ...] ++
This command adds a repository file to the set of repository files +for which the Repository Admin service provides access. The repository +file is represented as a URL. If the repository file URL is already in +the Repository Admin's set of repository files, the request is treated +like a reload operation.
+ + + +obr remove-url
+ +Syntax:
+obr remove-url [<repository-file-url> ...] ++
This command removes a repository file to the set of repository +files for which the Repository Admin service provides access. The +repository file is represented as a URL.
+ + + +obr list
+ +Syntax:
+obr list [<string> ...] ++
This command lists bundles available in the bundle repository. If no +arguments are specified, then all available bundles are listed, +otherwise any arguments are concatenated with spaces and used as a +substring filter on the bundle names.
+ + + +obr info
+ +Syntax:
+obr info <bundle-name>[;<version>] ... ++
This command displays the meta-data for the specified bundles. If a +bundle's name contains spaces, then it must be surrounded by quotes. It +is also possible to specify a precise version if more than one version +exists, such as:
+obr info "Bundle Repository";1.0.0 ++
The above example retrieves the meta-data for version "1.0.0" of the bundle named "Bundle Repository".
+ + + +obr deploy
+ +Syntax:
+obr deploy <bundle-name>[;<version>] ... | <bundle-id> ... ++
This command tries to install or update the specified bundles and +all of their dependencies by default. You can specify either the bundle +name or the bundle identifier. If a bundle's name contains spaces, then +it must be surrounded by quotes. It is also possible to specify a +precise version if more than one version exists, such as:
+obr deploy "Bundle Repository";1.0.0 ++
For the above example, if version "1.0.0" of "Bundle Repository" is +already installed locally, then the command will attempt to update it +and all of its dependencies; otherwise, the command will install it and +all of its dependencies.
+ + + +obr start
+ +Syntax:
+obr start [-nodeps] <bundle-name>[;<version>] ... ++
This command installs and starts the specified bundles and all of +their dependencies by default; use the "-nodeps" switch to ignore +dependencies. If a bundle's name contains spaces, then it must be +surrounded by quotes. If a specified bundle is already installed, then +this command has no effect. It is also possible to specify a precise +version if more than one version exists, such as:
+obr start "Bundle Repository";1.0.0 ++
The above example installs and starts the "1.0.0" version of the bundle named "Bundle Repository" and its dependencies.
+ + + +obr source
+ +Syntax:
+obr source [-x] <local-dir> <bundle-name>[;<version>] ... ++
This command retrieves the source archives of the specified bundles +and saves them to the specified local directory; use the "-x" switch to +automatically extract the source archives. If a bundle name contains +spaces, then it must be surrounded by quotes. It is also possible to +specify a precise version if more than one version exists, such as:
+obr source /home/rickhall/tmp "Bundle Repository";1.0.0 ++
The above example retrieves the source archive of version "1.0.0" of +the bundle named "Bundle Repository" and saves it to the specified +local directory.
+ +obr javadoc
+ +Syntax:
+obr javadoc [-x] <local-dir> <bundle-name>[;<version>] ... ++
This command retrieves the javadoc archives of the specified bundles +and saves them to the specified local directory; use the "-x" switch to +automatically extract the javadoc archives. If a bundle name contains +spaces, then it must be surrounded by quotes. It is also possible to +specify a precise version if more than one version exists, such as:
+obr javadoc /home/rickhall/tmp "Bundle Repository";1.0.0 ++
The above example retrieves the javadoc archive of version "1.0.0" +of the bundle named "Bundle Repository" and saves it to the specified +local directory.
+ + + +Using OBR with a Proxy
+ +If you use a proxy for Web access, then OBR will not work for you in +its default configuration; certain system properties must be set to +enable OBR to work with a proxy. These properties are:
+ +-
+
- http.proxyHost - the name of the proxy host. +
- http.proxyPort - the port of the proxy host. +
- http.proxyAuth +- the user name and password to use when connecting to the proxy; this +string should be the user name and password separated by a colon (e.g., +rickhall:mypassword). +
These system properties can be set directly on the command line when +starting the JVM using the standard "-D<prop>=<value>" +syntax or you can put them in the lib/system.properties file of your +Felix installation; see documentation on configuring Felix for more +information.
+ + + +Bundle Source Packaging
+ +Coming soon...
+ + + +Note on OSGi R3 Bundles
+ +In contrast to OSGi R4 the previous specifications, most notably R3, allowed bundles without the Bundle-SymbolicName +header. The Felix OSGi Bundle Repository implementation heavily relies +on the symbolic name being defined in bundles. As a consequence bundles +without a symbolic name are not fully supported by the Bundle +Repository:
+ +-
+
- Bundles installed in the framework are used by the Bundle +Repository implementation to resolve dependencies regardless of whether +they have a Bundle-SymbolicName header or not. Resolution of dependencies against the installed bundles takes place based on the Export-Package headers. +
- Bundles installed in the framework without a Bundle-SymbolicName +header cannot be updated by the Bundle Repository implementation +because updates from the bundle repository cannot be correlated to such +"anonymous" bundles. +
Feedback
+ +Subscribe to the Felix users mailing list by sending a message to users-subscribe@felix.apache.org; after subscribing, email questions or feedback to users@felix.apache.org.
+

+
+
\ No newline at end of file
diff --git a/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/button_data/2009-usa-125x125.png b/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/button_data/2009-usa-125x125.png
new file mode 100644
index 00000000000..117c6954ddf
Binary files /dev/null and b/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/button_data/2009-usa-125x125.png differ
diff --git a/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/linkext7.gif b/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/linkext7.gif
new file mode 100644
index 00000000000..f2dd2dcfa9b
Binary files /dev/null and b/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/linkext7.gif differ
diff --git a/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/logo.png b/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/logo.png
new file mode 100644
index 00000000000..dccbddcc35c
Binary files /dev/null and b/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/logo.png differ
diff --git a/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/mail_small.gif b/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/mail_small.gif
new file mode 100644
index 00000000000..a3b7d9f06f5
Binary files /dev/null and b/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/mail_small.gif differ
diff --git a/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/obr-entities.png b/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/obr-entities.png
new file mode 100644
index 00000000000..81d37608e06
Binary files /dev/null and b/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/obr-entities.png differ
diff --git a/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/obr-high-level.png b/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/obr-high-level.png
new file mode 100644
index 00000000000..566f171fd93
Binary files /dev/null and b/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/obr-high-level.png differ
diff --git a/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/site.css b/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/site.css
new file mode 100644
index 00000000000..959ab0a592d
--- /dev/null
+++ b/bundlerepository/doc/apache-felix-osgi-bundle-repository_files/site.css
@@ -0,0 +1,25 @@
+/* @override http://felix.apache.org/site/media.data/site.css */
+
+body { background-color: #ffffff; color: #3b3b3b; font-family: Tahoma, Arial, sans-serif; font-size: 10pt; line-height: 140% }
+h1, h2, h3, h4, h5, h6 { font-weight: normal; color: #000000; line-height: 100%; margin-top: 0px}
+h1 { font-size: 200% }
+h2 { font-size: 175% }
+h3 { font-size: 150% }
+h4 { font-size: 140% }
+h5 { font-size: 130% }
+h6 { font-size: 120% }
+a { color: #1980af }
+a:visited { color: #1980af }
+a:hover { color: #1faae9 }
+.title { position: absolute; left: 1px; right: 1px; top:25px; height: 81px; background: url(http://felix.apache.org/site/media.data/gradient.png) repeat-x; background-position: bottom; }
+.logo { position: absolute; width: 15em; height: 81px; text-align: center; }
+.header { text-align: right; margin-right: 20pt; margin-top: 30pt;}
+.menu { border-top: 10px solid #f9bb00; position: absolute; top: 107px; left: 1px; width: 15em; bottom: 0px; padding: 0px; background-color: #fcfcfc }
+.menu ul { background-color: #fdf5d9; list-style: none; padding-left: 4em; margin-top: 0px; padding-top: 2em; padding-bottom: 2em; margin-left: 0px; color: #4a4a43}
+.menu a { text-decoration: none; color: #4a4a43 }
+.main { position: absolute; border-top: 10px solid #cde0ea; top: 107px; left: 15em; right: 1px; margin-left: 2px; padding-right: 4em; padding-left: 1em; padding-top: 1em;}
+.code { background-color: #eeeeee; border: solid 1px black; padding: 0.5em }
+.code-keyword { color: #880000 }
+.code-quote { color: #008800 }
+.code-object { color: #0000dd }
+.code-java { margin: 0em }
\ No newline at end of file
diff --git a/bundlerepository/doc/changelog.txt b/bundlerepository/doc/changelog.txt
new file mode 100644
index 00000000000..d2aa1eb2552
--- /dev/null
+++ b/bundlerepository/doc/changelog.txt
@@ -0,0 +1,193 @@
+
+Changes from 2.0.4 to 2.0.6
+---------------------------
+
+** Improvement
+ * [FELIX-4764] - Add support to GZIP based compact index files
+
+Changes from 2.0.2 to 2.0.4
+---------------------------
+
+** Bug
+ * [FELIX-3097] - LocalRepository is not updated when bundles are
+ * [FELIX-4571] - NullPointerException when using Repository impl with Aries subsystem impl
+ * [FELIX-4616] - BundleRepository ResourceComparator violates comparison contract
+ * [FELIX-4640] - missing (&(osgi.ee=JavaSE)(version=1.8)) when embedding in org.apache.felix.framework
+
+** Improvement
+ * [FELIX-4812] - BundleRepository can be quite CPU intensive when starting a lot of bundles
+
+Changes from 1.6.6 to 2.0.2
+---------------------------
+
+** New Feature
+ * [FELIX-4368] - Support OSGi Repository 1.0 Specification
+ ** [FELIX-4369] - Support repository.xml as defined by OSGi Repository spec
+ ** [FELIX-4370] - Support Repository service as defined by OSGi spec
+ ** [FELIX-4371] - Pass the Repository 1.0 OSGi CT
+
+** Bug
+ * [FELIX-3257] - OBR resolver unable to pick up the highest bundle version when selecting the best candidate
+ * [FELIX-2465] - system.bundle should be automatically wired to the relevant bundle
+ * [FELIX-3842] - NPE in LocalRepositoryImpl
+
+Changes from 1.6.4 to 1.6.6
+---------------------------
+
+** Bug
+ * [FELIX-2612] - [OBR] Doesn't work on Java 1.4 due to use of Boolean.parseBoolean()
+ * [FELIX-2884] - The multiplicity isn't taken into account by the maven bundle plugin and bundlerepository when generating the repository xml
+ * [FELIX-2912] - Host name is lost in exceptions when dealing with Windows shared drives
+ * [FELIX-2958] - Unable to remove previously added repository from OBR
+
+Changes from 1.6.2 to 1.6.4
+---------------------------
+
+** Bug
+ * [FELIX-2306] - ClassCastException in Wrapper.unwrap() when calling Resolver.add(x implements Resource)
+ * [FELIX-2385] - Execution environment property is not correctly exposed
+
+Changes from 1.6.0 to 1.6.2
+---------------------------
+
+** Bug
+ * [FELIX-2269] - Only the higher version of a given bundle is kept in a repository
+ * [FELIX-2276] - Authentication credentials for proxies are not set when retrieving resources
+ * [FELIX-2304] - Single quotes need to be escaped in xml attribute values
+
+Changes from 1.4.3 to 1.6.0
+---------------------------
+
+** Bug
+ * [FELIX-1007] - OBR search doesn't take 'categories' into account
+ * [FELIX-1531] - Mandatory directive is ignored on the Export-Package when it comes to resolve the bundles
+ * [FELIX-1621] - OBR fails to take bundles into account that are already available in the framework
+ * [FELIX-1809] - OBR issue when using parameters with exported packages
+ * [FELIX-2081] - Attribtues and directives and not used on local resources
+ * [FELIX-2082] - Local resources should really be preferred over remote resources
+ * [FELIX-2083] - bundlerepository should mark dependencies it includes as optional
+ * [FELIX-2102] - Bad exception thrown when an obr url can not be resolved
+ * [FELIX-2114] - The reasons for adding a resource may contain the same requirement several times
+ * [FELIX-2126] - Dependencies of optional resources should be optional
+ * [FELIX-2136] - Improve OBR speed
+ * [FELIX-2138] - The resolver should prefer required resources over optional resources to minimize the set of required resources
+ * [FELIX-2139] - Move extensions to a new api into the bundlerepository module as to not pollute the org.osgi.* package
+ * [FELIX-2221] - DataModelHelper.filter() throws wrong Exception
+
+** Improvement
+ * [FELIX-280] - OBR should be able to confirm satisfaction of a filter, including availability of local resources
+ * [FELIX-483] - Log detailed information on invalid syntax in parsed repository xml requirements
+ * [FELIX-692] - OBR should provide an API for resolving bundles dependencies regardless of locally installed bundles
+ * [FELIX-1492] - Add option to exclude optional dependencies during OBR deploy
+ * [FELIX-2106] - Resolver scoped Repository
+ * [FELIX-2115] - The api offers no way to have a timeout or cancel the resolution if it takes too long
+ * [FELIX-2127] - The explanation given why a resource is include is insufficient
+ * [FELIX-2134] - Change the filter implementation
+ * [FELIX-2140] - The Requirement#isSatisfied() method should actually check the capability/requirement namespace
+ * [FELIX-2151] - Use Strings instead of URLs in the API
+
+** New Feature
+ * [FELIX-178] - OBR should expose some way to convert a locally installed bundle to a Resource
+ * [FELIX-2103] - Improve the OBR url handler to be able to access external bundles
+ * [FELIX-2144] - Add global requirements and capabilities
+
+** Task
+ * [FELIX-2104] - Add an optional faster stax based parser
+ * [FELIX-2211] - Simplify the repository parser based on KXml2
+ * [FELIX-2215] - Refactor bundlerepository and maven bundle plugin obr data model
+
+Changes from 1.4.2 to 1.4.3
+---------------------------
+
+** Bug
+ * [FELIX-1792] - Felix OBR seems to just randomly choose one of the satisifed bundles if more than one bundle meets the requirement
+
+
+Changes from 1.4.1 to 1.4.2
+---------------------------
+
+** Task
+ * [FELIX-1617] - Modify framework, main, shell, shell.tui, and obr to depend on official OSGi JAR files
+
+Changes from 1.4.0 to 1.4.1
+---------------------------
+
+** Bug
+ * [FELIX-1000] - Updating an bundle which was installed via OBR fails
+ * [FELIX-1157] - NPE results in OBR if a resource does not have a presentation name
+ * [FELIX-1433] - java.lang.NumberFormatException in Bundle-Version (org.osgi.framework.Version) due to trailing whitespace
+
+Changes from 1.2.1 to 1.4.0
+---------------------------
+** Bug
+ * [FELIX-973] - FilterImpl from Felix Framework does not support none LDAP operators
+ * [FELIX-977] - Bundle resolving runs extreme long
+ * [FELIX-999] - The OBR ResolverImpl shouldn't try to start fragment bundles
+
+** Improvement
+ * [FELIX-884] - OBR should expose registered services as capabilities of local repository
+ * [FELIX-887] - Ensure BundleListeners are not forgotten about
+ * [FELIX-940] - Add support for execution environment
+ * [FELIX-986] - Include the symbolicname in the output of obr list -v
+
+** New Feature
+ * [FELIX-976] - OBR update-url shell command
+
+Changes from 1.2.0 to 1.2.1
+---------------------------
+* [2008-10-24] Fixed potential NPE when comparing resources. (FELIX-789)
+* [2008-10-24] Removed the default repository URL from OBR, so now it must
+ be configured to have a repository. (FELIX-481)
+* [2008-10-24] Print message if there are no matching bundles. (FELIX-785)
+* [2008-10-23] Modified the OBR shell command to hide multiple versions of
+ available artifacts to cut down on noise. It is still possible to list
+ all versions by using a new "-v" switch.
+* [2008-09-29] Adapt Bundle-DocURL header to modified URL
+
+
+Changes from 1.0.3 to 1.2.0
+---------------------------
+
+* [2008-08-30] Prevent issues when updating running bundles. (FELIX-701)
+* [2008-08-28] Prevent NullPointerException if a locally installed bundle
+ does not have a Bundle-SymbolicName or version. (FELIX-108)
+* [2008-08-12] Added OBR descriptor and updated to the newest bundle plugin. (FELIX-672)
+* [2008-07-31] Use LogService instead of System.err. (FELIX-482)
+* [2008-07-21] Modified OBR to correctly consider the namespace attribute
+ when matching capabilities to requirements. (FELIX-638)
+* [2008-06-26] Implement referral with hop count support. (FELIX-399)
+* [2008-05-09] Return an empty resource array when querying with a filter
+ with invalid syntax. (FELIX-480)
+* [2008-05-09] Fixed improper synchronization with respect to visibility rules.
+* [2008-05-09] Ignore resources with invalid filters. (FELIX-484)
+* [2008-05-09] Move repository URL list initialization to a later time to
+ avoid the default repository URL if it is not desired. (FELIX-485)
+
+Changes from 1.0.2 to 1.0.3
+---------------------------
+
+* [2008-04-21] Re-release to make bytecode executable on jre 1.3.
+
+Changes from 1.0.0 to 1.0.2
+---------------------------
+
+* [2008-01-27] Change the default url from sf.net to sourceforge.net.
+* [2007-10-25] Add support for zipped repository files. (FELIX-410)
+* [2007-10-03] Updated OBR's VersionRange to match the Framework's VersionRange
+ and now accept whitespace in its version range. (FELIX-389)
+* [2007-09-24] Extract OSGi OBR service API to a non-bundle jar to avoid
+ circular build problems.
+
+Changes from 0.8.0-incubator to 1.0.0
+-------------------------------------
+
+* [2007-03-16] Correctly initialized member fields to avoid incorrectly
+ assigning the source and license URLs. (FELIX-242)
+* [2007-03-19] Parent POM extends Apache POM for Apache-wide policies.
+ (FELIX-260)
+* [2007-05-18] Improved OBR dependency resolution by searching resolving
+ bundles before local bundles and to search through all available
+ candidates to find one that can resolve instead of picking one and failing
+ if it cannot be resolved. (FELIX-285)
+* [2007-07-13] Fixed LDAP filter syntax bug when using inclusive version
+ ranges. (FELIX-327)
diff --git a/bundlerepository/obr.xml b/bundlerepository/obr.xml
new file mode 100644
index 00000000000..9056eda6be4
--- /dev/null
+++ b/bundlerepository/obr.xml
@@ -0,0 +1,29 @@
+
+