<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="/wikid/docs/xsl/mwCollections/CollectionRegistryFramework/display.xsl" type="text/xsl"?>

<!--
This resource container holds the product of the resolution request
-->
<resource xmlns:config="info:sid/localhost:CollectionSimpleSchemas:config" xmlns:explain="http://explain.z3950.org/dtd/2.0/" xmlns:srw="http://www.loc.gov/zing/srw/" xmlns:wiki="info:sid/localhost:CollectionSimpleSchemas:wiki" xmlns:wr="http://errol.oclc.org/oai:xmlregistry.oclc.org:errol/WikiRepository" xmlns:xlink="http://www.w3.org/TR/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!--
This is an echo of the request information this stylesheet used to produce the resolution product
-->
<uri-context>
<srwIdentifier>info:sid/localhost:CollectionRegistryFramework:ApplicationFramework</srwIdentifier>
<collectionURI>info:sid/localhost:CollectionRegistryFramework</collectionURI>
<repository-identifier>CollectionRegistryFramework</repository-identifier>
<srwURL>http://alcme.oclc.org:80/wikid/search/WikiDb.localhost</srwURL>
<local-identifier>ApplicationFramework</local-identifier>
<action>display</action>
</uri-context>
<!--
This is the collection configuration record
-->
<record xmlns="info:sid/localhost:CollectionSimpleSchemas:config" xsi:schemaLocation="info:sid/localhost:CollectionSimpleSchemas:config http://alcme.oclc.org:80/wikid/raw/info:sid/localhost:CollectionSimpleSchemas:config.xsd">
<repositoryName>Registry Framework</repositoryName>
<description>Information about the Registry Framework</description>
<localIdentifierType>userAssigned</localIdentifierType>
<adminEmail>mailto:jyoung@oclc.org</adminEmail>
<defaultXSL>no</defaultXSL>
<schemaURI recordPrefix="wiki">info:sid/localhost:CollectionSimpleSchemas:wiki</schemaURI>
<crosswalkSchemaURI recordPrefix="xhtml">info:sid/localhost:CollectionExternalSchemas:xhtml</crosswalkSchemaURI>
<defaultSchemaURI>info:sid/localhost:CollectionExternalSchemas:xhtml</defaultSchemaURI>
</record>
<!--
There is a local-identifier, so this URI must identify an item in a collection
-->
<!--
This is the searchRetrieveResponse for the item's Deposit record
-->
<content>
<searchRetrieveResponse xmlns="http://www.loc.gov/zing/srw/">
<version>1.1</version>
<numberOfRecords>1</numberOfRecords>
<resultSetId>4rzxmf</resultSetId>
<resultSetIdleTime>300</resultSetIdleTime>
<records xmlns:ns1="http://www.loc.gov/zing/srw/">
<record>
<recordSchema>http://www.oclc.org/schemas/WikiRepository</recordSchema>
<recordPacking>xml</recordPacking>
<recordData>
<wr:Deposit xmlns="http://www.w3.org/TR/xhtml1/strict">
<wr:browserPath>http://alcme.oclc.org:80/wikid/docs/WikiRepository</wr:browserPath>
<wr:refID>info:sid/localhost:CollectionRegistryFramework:ApplicationFramework</wr:refID>
<wr:refIDPrefix/>
<wr:userName>anonymous</wr:userName>
<wr:collection>CollectionRegistryFramework</wr:collection>
<wr:relativePath>2007/05/01/12</wr:relativePath>
<wr:fullRefID>inf_3asid_2flocalhost_3aCollectionRegistryFramework_3aApplicationFramework_5f20070501121257028</wr:fullRefID>
<wr:mimeType>text/xml</wr:mimeType>
<wr:sort>CollectionRegistryFramework:ApplicationFramework</wr:sort>
<wr:dateCreated>2007-05-01</wr:dateCreated>
<wr:datestamp>2007-05-01</wr:datestamp>
<wr:oldDate/>
</wr:Deposit>
</recordData>
<recordPosition>1</recordPosition>
</record>
</records>
<echoedSearchRetrieveRequest xmlns:ns2="http://www.loc.gov/zing/srw/">
<version>1.1</version>
<query>repos.hasDate = "hasdate" and oai.identifier exact "info:sid/localhost:CollectionRegistryFramework:ApplicationFramework"</query>
<xQuery>
<ns3:searchClause xmlns:ns3="http://www.loc.gov/zing/cql/xcql/">
<ns3:index>cql.any</ns3:index>
<ns3:relation>
<ns3:value>=</ns3:value>
</ns3:relation>
<ns3:term>huh?</ns3:term>
</ns3:searchClause>
</xQuery>
<startRecord>1</startRecord>
<maximumRecords>1</maximumRecords>
<recordPacking>xml</recordPacking>
<recordSchema>default</recordSchema>
</echoedSearchRetrieveRequest>
</searchRetrieveResponse>
<!--
This is the datestamp for the Deposit
-->
<datestamp>2007-05-01</datestamp>
<!--
This is the URL for the content
-->
<contentURL>http://alcme.oclc.org:80/wikid/docs/WikiRepository/2007/05/01/12/inf_3asid_2flocalhost_3aCollectionRegistryFramework_3aApplicationFramework_5f20070501121257028</contentURL>
<!--
Here is the record content
-->
<record>
<record xmlns="info:sid/localhost:CollectionSimpleSchemas:wiki" xsi:schemaLocation="info:sid/localhost:CollectionSimpleSchemas:wiki http://alcme.oclc.org:80/wikid/raw/info:sid/localhost:CollectionSimpleSchemas:wiki.xsd">
<raw>The application framework (named “OpenURL Object Model” or “OOM”) that we used to implement the Registry Framework Architecture needs to be justified since it probably could have been built using other, more popular frameworks like Spring. Here, then, is some background.

The Registry Framework Architecture (described earlier) is an abstraction and synthesis of almost every project I’ve worked on at OCLC for the last 20 years. The primary catalyst of this conceptual synthesis was OpenURL. Unfortunately, the brand name “OpenURL” has two very distinct meanings that have caused needless confusion and need to be clarified. 

The original version, OpenURL 0.1, was specified as a citation-linking protocol. This caught on well in the library community and is what most people think of when you mention “OpenURL”. The subsequent OpenURL 1.0 specification, however, took a different approach. Rather than defining an explicit protocol, OpenURL 1.0 defines a framework for specifying protocols in general. The basic model in this framework is simple and intuitive, but suffers from two problems. First, the model is very abstract. For example, OpenURL 1.0 revolves around the intuitive but vague concepts of “what”, “who”, “where”, and “why”. The second problem is that the OpenURL 1.0 specification gave these simple concepts obfuscated names like “referent”, “requester”, “referring entity”, and “service type” respectively. The second problem can be overcome by keeping a printout handy of the terminology mapping. The first problem takes some getting used to, but should quickly become second-nature.

Given this clarification, I would assert that OpenURL 1.0 represents a simple, intuitive, flexible, and lightweight model for specifying web services. This is achieved by normalizing the inputs of an operation into generic “what”, “who”, “where”, and “why” containers. Operations can be implemented against this normalized representation, with one or more bridges created between the normalized representation and the protocols that could be used to invoke it. Because these categories are so abstract, it should be possible to imagine that almost any web service could be represented in this way.

Another problem with OpenURL 1.0 needs to be pointed out. The conventional way to manifest an OpenURL 1.0 application is to create entries in the OpenURL Registry (http://www.openurl.info/registry/''''''). This isn’t the only way, however. The OpenURL Object Model (OOM) takes a different approach. OOM is to OpenURL as DOM is to XML. For example, the XML specification defines concepts like “element”, “attribute”, “node”, etc. just as the OpenURL specification defines concepts like “entity”, “descriptor”, “transport”, etc. OOM maps its concepts to the programming space in a language-independent way just like DOM does. The expectation is that these conceptual models would get mapped to specific languages in similar ways. For example, in the case of Java, the classes for DOM have been specified by a set of interfaces under the org.w3c.dom.* package. Something analogous has been done for OOM under the info.openurl.oom.* package (http://pubserv.oclc.org/oom-j/jars/docs/dist.html'''''').  If you examine the classes in this package, they should all map quite literally to the OpenURL spec.

Likewise, there can be many implementations of these interface classes. In the case of DOM, we can look at Xerces and Crimson as alternative implementations of this interface set. In the case of OOM, I have written OOMRef-J as a reference implementation (http://pubserv.oclc.org/oomRef-j/jars/dist/docs/dist.html''''''). (Caveat: the OOM-J and OOMRef-J distributions at these locations are slightly stale. They should be updated before anyone gets too serious about using them.)

The unexpected surprise that was revealed by this exercise was that OOMRef-J turned out to be a simple, lightweight, flexible, and intuitive application framework. This fact wasn’t anticipated by the committee that developed the OpenURL 1.0 specification, and few people outside the Registry Project team realize this yet. The Registry Framework is the first practical demonstration of its potential, and with that experience I now feel confident that it can and should be promoted more widely.
</raw>
</record>
</record>
</content>
<displayContent>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>The application framework (named “OpenURL Object Model” or “OOM”) that we used to implement the Registry Framework Architecture needs to be justified since it probably could have been built using other, more popular frameworks like Spring. Here, then, is some background.<p></p>
The Registry Framework Architecture (described earlier) is an abstraction and synthesis of almost every project I’ve worked on at OCLC for the last 20 years. The primary catalyst of this conceptual synthesis was OpenURL. Unfortunately, the brand name “OpenURL” has two very distinct meanings that have caused needless confusion and need to be clarified. <p></p>
The original version, OpenURL 0.1, was specified as a citation-linking protocol. This caught on well in the library community and is what most people think of when you mention “OpenURL”. The subsequent OpenURL 1.0 specification, however, took a different approach. Rather than defining an explicit protocol, OpenURL 1.0 defines a framework for specifying protocols in general. The basic model in this framework is simple and intuitive, but suffers from two problems. First, the model is very abstract. For example, OpenURL 1.0 revolves around the intuitive but vague concepts of “what”, “who”, “where”, and “why”. The second problem is that the OpenURL 1.0 specification gave these simple concepts obfuscated names like “referent”, “requester”, “referring entity”, and “service type” respectively. The second problem can be overcome by keeping a printout handy of the terminology mapping. The first problem takes some getting used to, but should quickly become second-nature.<p></p>
Given this clarification, I would assert that OpenURL 1.0 represents a simple, intuitive, flexible, and lightweight model for specifying web services. This is achieved by normalizing the inputs of an operation into generic “what”, “who”, “where”, and “why” containers. Operations can be implemented against this normalized representation, with one or more bridges created between the normalized representation and the protocols that could be used to invoke it. Because these categories are so abstract, it should be possible to imagine that almost any web service could be represented in this way.<p></p>
Another problem with OpenURL 1.0 needs to be pointed out. The conventional way to manifest an OpenURL 1.0 application is to create entries in the OpenURL Registry (<a href="http://www.openurl.info/registry/">http://www.openurl.info/registry/</a>). This isn’t the only way, however. The OpenURL Object Model (OOM) takes a different approach. OOM is to OpenURL as DOM is to XML. For example, the XML specification defines concepts like “element”, “attribute”, “node”, etc. just as the OpenURL specification defines concepts like “entity”, “descriptor”, “transport”, etc. OOM maps its concepts to the programming space in a language-independent way just like DOM does. The expectation is that these conceptual models would get mapped to specific languages in similar ways. For example, in the case of Java, the classes for DOM have been specified by a set of interfaces under the org.w3c.dom.* package. Something analogous has been done for OOM under the info.openurl.oom.* package (<a href="http://pubserv.oclc.org/oom-j/jars/docs/dist.html">http://pubserv.oclc.org/oom-j/jars/docs/dist.html</a>).  If you examine the classes in this package, they should all map quite literally to the OpenURL spec.<p></p>
Likewise, there can be many implementations of these interface classes. In the case of DOM, we can look at Xerces and Crimson as alternative implementations of this interface set. In the case of OOM, I have written OOMRef-J as a reference implementation (<a href="http://pubserv.oclc.org/oomRef-j/jars/dist/docs/dist.html">http://pubserv.oclc.org/oomRef-j/jars/dist/docs/dist.html</a>). (Caveat: the OOM-J and OOMRef-J distributions at these locations are slightly stale. They should be updated before anyone gets too serious about using them.)<p></p>
The unexpected surprise that was revealed by this exercise was that OOMRef-J turned out to be a simple, lightweight, flexible, and intuitive application framework. This fact wasn’t anticipated by the committee that developed the OpenURL 1.0 specification, and few people outside the Registry Project team realize this yet. The Registry Framework is the first practical demonstration of its potential, and with that experience I now feel confident that it can and should be promoted more widely.
</body>
</html>
</displayContent>
</resource>
