Consider a DOORS Repository with structure:
- 1) Report of all pollen filter tenders for Model1
- 2) Report of all pollen filter tenders for Family Cars
- 3) Report of all pollen filter tenders.
Assume a well known base Service Provider Catalog Resource URL - e.g.
http://www.example.com/catalog
- - - - - - - - - - -
To retrieve the top level Service Provider Catalog:
GET http://www.example.com/catalog
Returns:
<?xml version="1.0"?>
<oslc_disc:ServiceProviderCatalog
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/terms/"
xmlns:oslc_disc="http://open-services.net/xmlns/discovery/1.0/"
rdf:about="http://www.example.com/catalog.xml">
<dc:title>Top Level Vehicle Catalog</dc:title>
<oslc_disc:entry>
<oslc_disc:ServiceProviderCatalog rdf:about="http://www.example.com/carcatalog.xml" >
<dc:title>Car Catalog</dc:title>
</oslc_disc:ServiceProviderCatalog>
</oslc_disc:entry>
... Maybe more catalogs e.g. Aircraft etc. ...
</oslc_disc:ServiceProviderCatalog>
- - - - - - - - - - -
To retrieve the Car Catalog GET the nested Service Provider Catalog resource:
GET http://www.example.com/carcatalog.xml
Returns
<?xml version="1.0"?>
<oslc_disc:ServiceProviderCatalog
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/terms/"
xmlns:oslc_disc="http://open-services.net/xmlns/discovery/1.0/"
rdf:about="http://www.example.com/carcatalog.xml">
<dc:title>Car Catalog</dc:title>
<oslc_disc:entry>
<oslc_disc:ServiceProviderCatalog rdf:about="http://www.example.com/familycarcatalog.xml" >
<dc:title>Family Car Catalog</dc:title>
</oslc_disc:ServiceProviderCatalog>
</oslc_disc:entry>
<oslc_disc:entry>
<oslc_disc:ServiceProviderCatalog rdf:about="http://www.example.com/performancecarcatalog.xml" >
<dc:title>Performance Car Catalog</dc:title>
</oslc_disc:ServiceProviderCatalog>
</oslc_disc:entry>
<oslc_disc:entry>
<oslc_disc:ServiceProvider>
<dc:title>Generic Car Requirements</dc:title>
<oslc_disc:details rdf:resource="http://www.example.com/jazz/98gJH77897sdfJ" />
<oslc_disc:services rdf:resource="http://www.example.com/jazz/requirements/contexts/9JHiyh756hJHtyu78jh/services.xml" />
</oslc_disc:ServiceProvider>
</oslc_disc:entry>
</oslc_disc:ServiceProviderCatalog>
- - - - - - - - - - -
To retrieve the Family Car Catalog GET the nested Service Provider Catalog resource:
GET http://www.example.com/familycarcatalog.xml
Returns
<?xml version="1.0"?>
<oslc_disc:ServiceProviderCatalog
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/terms/"
xmlns:oslc_disc="http://open-services.net/xmlns/discovery/1.0/"
rdf:about="http://www.example.com/familycarcatalog.xml">
<dc:title>Family Car Catalog</dc:title>
<oslc_disc:entry>
<oslc_disc:ServiceProvider>
<dc:title>Model 1</dc:title>
<oslc_disc:details rdf:resource="http://www.example.com/jazz/Cgch234Hg78SD897FS" />
<oslc_disc:services rdf:resource="http://www.example.com/jazz/requirements/contexts/Kgh7896dsgkg7sdfhi/services.xml" />
</oslc_disc:ServiceProvider>
</oslc_disc:entry>
<oslc_disc:entry>
<oslc_disc:ServiceProvider>
<dc:title>Model 2</dc:title>
<oslc_disc:details rdf:resource="http://www.example.com/jazz/8sdfkjUI7fsjk8fGGx" />
<oslc_disc:services rdf:resource="http://www.example.com/jazz/requirements/contexts/j2c4498uKJ098LFJ90/services.xml" />
</oslc_disc:ServiceProvider>
</oslc_disc:entry>
</oslc_disc:ServiceProviderCatalog>
- - - - - - - - - - -
To retrieve the Model 1 Car Services Document GET the nested Service Provider services resource:
GET http://www.example.com/jazz/requirements/contexts/Kgh7896dsgkg7sdfhi/services.xml
Returns:
<?xml version="1.0" encoding="UTF-8"?>
<oslc_sd:ServiceDescriptor
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/terms/"
xmlns:oslc_sd="http://open-services.net/xmlns/commons/servicedescription/1.0/"
xmlns:oslc_report="http://open-services.net/xmlns/reporting/1.0/"
xmlns:oslc_query="http://open-services.net/xmlns/query/1.0/"
rdf:about="http://www.example.com/jazz/requirements/contexts/Kgh7896dsgkg7sdfhi/services.xml">
<dc:title xml:lang="en-GB">Components for Model 1 Family Car</dc:title>
<dc:description xml:lang="en-GB">DOORS OSLC Reporting 1.0 provider for Model 1 Family Car</dc:description>
<dc:contributor>
<oslc_sd:Contributor>
<dc:title>IBM Rational DOORS</dc:title>
<dc:identifier>com.ibm.rdm.doors</dc:identifier>
<oslc_sd:icon rdf:resource="https://www.example.com/resources/doorsicon.ico"/>
<oslc_sd:home>
<oslc_sd:Home>
<dc:title>IBM Rational DOORS</dc:title>
<oslc_sd:application rdf:resource="doors://www.example.com/invokedoors"/>
</oslc_sd:Home>
</oslc_sd:home>
</oslc_sd:Contributor>
</dc:contributor>
<oslc_report:schemaEnquiry>
<oslc_query:Query>
<dc:title>Service to explore schema of Model 1 Family Car reporting context.</dc:title>
<oslc_query:query rdf:resource="http://www.example.com/jazz/requirements/contexts/j2c4498uKJ098LFJ90?schema=yes"/>
</oslc_query:Query>
</oslc_report:schemaEnquiry>
<oslc_report:queryEvaluation >
<oslc_query:Query>
<dc:title>Service to evaluate query within Model 1 Family Car reporting context.</dc:title>
<oslc_query:query rdf:resource="http://www.example.com/jazz/requirements/contexts/j2c4498uKJ098LFJ90"/>
</oslc_query:Query>
</oslc_report:queryEvaluation >
</oslc_sd:ServiceDescriptor>
- - - - - - - - - - -
To retrieve the schema from the Model 1 Family Car context GET the nested Schema Enquiry query resource:
GET http://www.example.com/jazz/requirements/contexts/j2c4498uKJ098LFJ90?schema=yes
Returns:
<rdfs:Class rdf:about="http://open-services.net/xmlns/rm/1.0/Requirement"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:oslc_report="http://open-services.net/xmlns/reporting/1.0/">
<oslc_report:hasInterestingProperty rdf:resource="dc:title" />
<oslc_report:hasInterestingProperty rdf:resource="dc:description" />
<oslc_report:hasInterestingProperty rdf:resource="dc:creator" />
...
<oslc_report:hasInterestingProperty rdf:resource="http://www.example.com/rm/types/pollenfilter" />
</rdfs:Class>
- - - - - - - - - - -
To query the Model 1 Family Car context GET the nested Query Evaluation query resource (with the required query parameters):
GET http://www.example.com/jazz/requirements/contexts/j2c4498uKJ098LFJ90?oslc_query=example:pollenfilter=”*”;;;;;;;;;;
which would satisfy scenario 1) described above.
To satisfy scenarios 2) and 3) there would need to be Service Documents associated with the relevant Service Provider Catalogues (Cars and Family Cars). Currently the Service Catalog specification does not provide a specific facility to enable this – a node can contain a mix of Service Providers and Service Provider Catalogs, but we would need to define a mechanism to determine whether a Service Provider referred to a generic context (i.e. all the resources below it in the hierarchy) or a specific context (i.e. a requirement document located at that point in the hierarchy).
One possibility would be for the Reporting Service Implementer to provide a service within a Catalog that reports over the whole subtree, so retrieving the Car Catalog by a GET on the Service Provider Catalog resource:
GET http://www.example.com/carcatalog.xml
Returns
<?xml version="1.0"?>
<oslc_disc:ServiceProviderCatalog
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/terms/"
xmlns:oslc_disc="http://open-services.net/xmlns/discovery/1.0/"
rdf:about="http://www.example.com/carcatalog.xml">
<dc:title>Car Catalog</dc:title>
<oslc_disc:entry>
<oslc_disc:ServiceProviderCatalog rdf:about="http://www.example.com/familycarcatalog.xml" >
<dc:title>Family Car Catalog</dc:title>
</oslc_disc:ServiceProviderCatalog>
</oslc_disc:entry>
<oslc_disc:entry>
<oslc_disc:ServiceProviderCatalog rdf:about="http://www.example.com/performancecarcatalog.xml" >
<dc:title>Performance Car Catalog</dc:title>
</oslc_disc:ServiceProviderCatalog>
</oslc_disc:entry>
<oslc_disc:entry>
<oslc_disc:ServiceProvider>
<dc:title>Car Catalog Schema Services</dc:title>
<oslc_disc:details rdf:resource="http://www.example.com/jazz/is8fgJH098FSJ" />
<oslc_disc:services rdf:resource="http://www.example.com/jazz/requirements/contexts/h88SFDhj8hkd9/services.xml" />
</oslc_disc:ServiceProvider>
</oslc_disc:entry>
<oslc_disc:entry>
<oslc_disc:ServiceProvider>
<dc:title>Generic Car Requirements</dc:title>
<oslc_disc:details rdf:resource="http://www.example.com/jazz/98gJH77897sdfJ" />
<oslc_disc:services rdf:resource="http://www.example.com/jazz/requirements/contexts/9JHiyh756hJHtyu78jh/services.xml" />
</oslc_disc:ServiceProvider>
</oslc_disc:entry>
</oslc_disc:ServiceProviderCatalog>
The human user would use the textual description to distinguish between a Service Provider that relates to a concrete requirement document, and a Service Provider that provides an abbreviated view of the schema of the entire subtree.
Using this mechanism, retrieving the schema from a generic context would return a schema that may not contain the pollenfilter property (since I assume that pollen filters are a feature associated with Family Cars only).
--
SebRose - 14 Dec 2009