Skip to main content
Jump to: navigation, search

Difference between revisions of "Org.eclipse.higgins.idas.udi"

(Example usage)
Line 1: Line 1:
{{#eclipseproject:technology.higgins}}
+
{{#eclipseproject:technology.higgins|eclipse_custom_style.css}}
 
[[Image:Higgins_logo_76Wx100H.jpg|right]]
 
[[Image:Higgins_logo_76Wx100H.jpg|right]]
  

Revision as of 08:40, 15 December 2008

{{#eclipseproject:technology.higgins|eclipse_custom_style.css}}

Higgins logo 76Wx100H.jpg

This page describes the component higgins.idas.udi, which implements UDI Resolution in Higgins. See http://www.parity.com/udi for details on UDIs.

A UDI is a string (URI, XRI, Cool URI or anything else) that somehow can be dereferenced to a Context, Entity or Attribute.

Details

  • Javadoc: Javadoc
  • Status: first code in Higgins B-1-1-M3
  • Language: Java
  • Packaging: OSGI bundle

Service

Context UDIs

The following interfaces are provided to support the concept of Context UDIs:

/*
 * A Context UDI is defined to be any string that can be used to obtain Context UDI Metadata.
 */
 
interface IContextUDI {
 
	public IContextUDIMetadata getContextUDIMetadata();
}
 
/*
 * Context UDI Metadata is defined to be everything needed to instantiate an IContext:
 *   - required: one or more Context Types
 *   - optional: a configuration map of the Context
 */
 
interface IContextMetadata {
 
	public String[] getTypes();
	public Map getConfiguration();
}

Entity UDIs

The following interfaces are provided to support the concept of Entity UDIs:

/*
 * An Entity UDI (also called Resource UDI) is defined to be any string that can be used to obtain Entity UDI Metadata.
 */
 
interface IEntityUDI {
 
	public IEntityUDIMetadata getEntityUDIMetadata();
}
 
/*
 * Entity UDI Metadata is defined to be everything needed to instantiate an IEntity:
 *   - required: Context UDI Metadata of the Context the Entity is in
 *   - required: A relative Entity ID which identifies the Entity within its Context
 */
 
interface IEntityUDIMetadata {
 
	public IContextUDIMetadata getContextUDIMetadata();
	public String getEntityID();
}

Attribute UDIs

The following interfaces are provided to support the concept of Attribute UDIs:

/*
 * An Attribute UDI is defined to be any string that can be used to obtain Attribute Metadata.
 */
 
interface IAttributeUDI {
 
	public IAttributeMetadata getAttributeMetadata();
}
 
/*
 * Attribute Metadata is defined to be everything needed to instantiate an IAttribute:
 *   - required: Entity Metadata of the Entity the Attribute belongs to
 *   - required: A relative Attribute ID which identifies the Attribute on its Entity
 */
 
interface IAttributeMetadata {
 
	public IEntityMetadata getEntityMetadata();
	public URI getAttributeID();
}

UDIResolver

The UDIResolver is the most important piece of the idas.udi project. It is a singleton class that you use to parse and resolve UDIs.

It is agnostic of any specific UDI implementation. Instead, it uses a list of IUDIFactorys (see next section) for parsing UDIs.

public class UDIResolver implements IConfigurableComponent {
 
	private static UDIResolver impl = null;
 
	private List udiFactoryList;
 
	public UDIResolver() {
 
		this.udiFactoryList = new ArrayList();
	}
 
	public static synchronized UDIResolver getInstance() {
 
		if (impl == null) impl = new UDIResolver();
		return(impl);
	}
 
	/**
	 * Register the IUDIFactorys from the configuration
	 */
	public void configure(Map mapGlobalSettings, String strComponentName, Map mapComponentSettings) throws Exception { ... }
 
	/**
	 * Parse a string into an IContextUDI by trying all registered IUDIFactorys
	 * until one succeeds.
	 */
	public IContextUDI parseContextUDI(String contextUDIStr) throws IdASException { ... }
 
 
	/**
	 * Parse a string into an IEntityUDI by trying all registered IUDIFactorys
	 * until one succeeds.
	 */
	public IEntityUDI parseEntityUDI(String entityUDIStr) throws IdASException { ... }
 
	/**
	 * Parse a string into an IAttributeUDI by trying all registered IUDIFactorys
	 * until one succeeds.
	 */
	public IAttributeUDI parseAttributeUDI(String attributeUDIStr) throws IdASException { ... }
 
	/**
	 * Resolve an IContextUDI to an IContext by retrieving the IContextUDIMetadata
	 */
	public IContext resolve(IContextUDI contextUDI, Object authentication) throws IdASException { ... }
 
	/**
	 * Resolve an IEntityUDI to an IEntity by retrieving the IEntityUDIMetadata
	 */
	public IEntity resolve(IEntityUDI entityUDI, Object authentication) throws IdASException { ... }
 
	/**
	 * Resolve an IAttributeUDI to an IAttribute by retrieving the IAttributeUDIMetadata
	 */
	public IAttribute resolve(IAttributeUDI attributeUDI, Object authentication) throws IdASException { ... }
}

IUDIFactory

A UDI Factory is one specific implementation of the generic UDI concept. It can parse strings into IContextUDIs, IEntityUDIs and IAttributeUDIs. The UDIResolver singleton class keeps a list of IUDIFactorys. This list can be configured via the Configuration API.

The IUDIFactory interface is simple:

public interface IUDIFactory {
 
	public IContextUDI parseContextUDI(String contextUDI);
	public IEntityUDI parseEntityUDI(String entityUDI);
	public IAttributeUDI parseAttributeUDI(String attributeUDI);
}

At least the following IUDIFactory implementations will come out of the box:

  • XDIUDIFactory: Can parse XRIs into Context UDIs, Entity UDIs and Attribute UDIs.
  • URIUDIFactory: Can parse URIs without fragments into Context UDIs and Entity UDIs.
  • HashURIUDIFactory: Can parse URIs with fragments into Context UDIs and Entity UDIs.
  • ConfUDIFactory: This makes it possible to also use the Context IDs stored in IdASRegistry as Context UDIs.

Because of this configurable IUDIFactory mechanism, the UDI concept is extensible. New kinds of UDIs (pointers to Contexts, Entities and Attributes) can be invented by simply writing another IUDIFactory implementation.

The following is an example configuration XML file for UDIResolver that shows a possible default list of IUDIFactorys:

<Configuration
	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns="http://higgins.eclipse.org/Configuration"
	xmlns:htf="http://higgins.eclipse.org/Configuration"
	xsd:schemaLocation="http://higgins.eclipse.org/Configuration Configuration.xsd">
 
	<!--  The setting handlers are classes that consume Setting elements where the Type matches and generate an object of the Class -->
	<SettingHandlers>
		<SettingHandler Type="htf:map" Class="java.util.Map" Handler="org.eclipse.higgins.configuration.xml.MapHandler"/>
		<SettingHandler Type="htf:list" Class="java.util.List" Handler="org.eclipse.higgins.configuration.xml.ListHandler"/>
		<SettingHandler Type="htf:string" Class="java.lang.String" Handler="org.eclipse.higgins.configuration.xml.StringHandler"/>
		<SettingHandler Type="htf:boolean" Class="java.lang.Boolean" Handler="org.eclipse.higgins.configuration.xml.BooleanHandler"/>
		<SettingHandler Type="htf:classsingleton" Class="java.lang.Object" Handler="org.eclipse.higgins.configuration.xml.ClassSingletonHandler"/>
		<SettingHandler Type="htf:classinstance" Class="java.lang.Object" Handler="org.eclipse.higgins.configuration.xml.ClassInstanceHandler"/>
	</SettingHandlers>
 
	<Setting Name="DeploymentConfiguration" Type="htf:map">
 
		<Setting Name="ComponentSettings" Type="htf:map">
 
			<Setting Name="XRIUDIFactory" Type="htf:map">
				<Setting Name="Resolver" Type="htf:map">
					<Setting Name="MaxFollowRedirects" Type="htf:string">5</Setting>
					<Setting Name="MaxFollowRefs" Type="htf:string">10</Setting>
					<Setting Name="MaxRequests" Type="htf:string">15</Setting>
					<Setting Name="MaxTotalBytes" Type="htf:string">10485760</Setting>
					<Setting Name="MaxBytesPerRequest" Type="htf:string">1048576</Setting>
					<Setting Name="AtAuthority" Type="htf:string"><![CDATA[<XRD xmlns="xri://$xrd*($v*2.0)" xmlns:xrd="xri://$xrd*($v*2.0)"><Status cid="verified" ceid="off" code="100" /><CanonicalID>@</CanonicalID><Service><Type>xri://$res*auth*($v*2.0)</Type><MediaType match="default" select="false" /><URI priority="1">https://at.xri.net/</URI><URI priority="2">http://at.xri.net/</URI></Service> </XRD>]]></Setting>
					<Setting Name="EqualsAuthority" Type="htf:string"><![CDATA[<XRD xmlns="xri://$xrd*($v*2.0)" xmlns:xrd="xri://$xrd*($v*2.0)"><Status cid="verified" ceid="off" code="100" /><CanonicalID>=</CanonicalID><Service><Type>xri://$res*auth*($v*2.0)</Type><MediaType match="default" select="false" /><URI priority="1">https://equal.xri.net/</URI><URI priority="2">http://equal.xri.net/</URI></Service> </XRD>]]></Setting>
					<Setting Name="BangAuthority" Type="htf:string"><![CDATA[<XRD xmlns="xri://$xrd*($v*2.0)" xmlns:xrd="xri://$xrd*($v*2.0)"><Status cid="verified" ceid="off" code="100" /><CanonicalID>!</CanonicalID><Service><Type>xri://$res*auth*($v*2.0)</Type><MediaType match="default" select="false" /><URI priority="1">https://bang.xri.net/</URI><URI priority="2">http://bang.xri.net/</URI></Service> </XRD>]]></Setting>
				</Setting>
				<Setting Name="ResolverFlags" Type="htf:map">
					<Setting Name="https" Type="htf:boolean">false</Setting>
					<Setting Name="saml" Type="htf:boolean">false</Setting>
					<Setting Name="cid" Type="htf:boolean">true</Setting>
					<Setting Name="refs" Type="htf:boolean">true</Setting>
				</Setting>
			</Setting>
			<Setting Name="URIUDIFactory" Type="htf:map" />
			<Setting Name="HashURIUDIFactory" Type="htf:map" />
			<Setting Name="ConfUDIFactory" Type="htf:map" />
 
			<Setting Name="UDIResolver" Type="htf:map">
				<Setting Name="UDIFactoryInstancesList" Type="htf:list">
					<Setting Name="XRIUDIFactory" Type="htf:string">XRIUDIFactory</Setting>
					<Setting Name="URIUDIFactory" Type="htf:string">URIUDIFactory</Setting>
					<Setting Name="HashURIUDIFactory" Type="htf:string">HashURIUDIFactory</Setting>
					<Setting Name="ConfUDIFactory" Type="htf:string">ConfUDIFactory</Setting>
				</Setting>
			</Setting>
 
			<Setting Name="IdASRegistry" Type="htf:map">
				<Setting Name="ContextFactoryInstancesList" Type="htf:list">
					<Setting Name="JNDIContextFactory" Type="htf:map">
						<Setting Name="Instance" Type="htf:string">JNDIContextFactory</Setting>
						<Setting Name="ContextTypes" Type="htf:list">
							<Setting Name="ContextType1" Type="htf:string">($context)*(+ldap)</Setting>
						</Setting>
					</Setting>
					<Setting Name="RDFContextFactory" Type="htf:map">
						<Setting Name="Instance" Type="htf:string">RDFContextFactory</Setting>
						<Setting Name="ContextTypes" Type="htf:list">
							<Setting Name="ContextType1" Type="htf:string">$context$mime*application*rdf.xml</Setting>
						</Setting>
					</Setting>
				</Setting>
 
				<Setting Name="ContextIdsList" Type="htf:list">
					<Setting Name="localContext" Type="htf:map">
						<Setting Name="ContextId" Type="htf:string">localContext</Setting>
						<Setting Name="ContextTypes" Type="htf:list">
							<Setting Name="HigginsContextType" Type="htf:string">$context+ldap</Setting>
						</Setting>
						<Setting Name="Connection" Type="htf:map">
							<Setting Name="ConnectionType" Type="htf:string">LDAP</Setting>
							<Setting Name="AddressList" Type="htf:list">
								<Setting Name="Address" Type="htf:string">ldap://rh158.sohosmart.net:7389</Setting>
							</Setting>
							<Setting Name="jndiProvider" Type="htf:string">com.sun.jndi.ldap.LdapCtxFactory</Setting>
						</Setting>
						<Setting Name="env" Type="htf:map">
							<Setting Name="java.naming.security.authentication" Type="htf:string">simple</Setting>
						</Setting>
					</Setting>
				</Setting>
 
			</Setting>
 
		</Setting>
 
		<Setting Name="XRIUDIFactory" Type="htf:classinstance">org.eclipse.higgins.idas.udi.impl.xri.XRIUDIFactory</Setting>
		<Setting Name="URIUDIFactory" Type="htf:classinstance">org.eclipse.higgins.idas.udi.impl.uri.URIUDIFactory</Setting>
		<Setting Name="HashURIUDIFactory" Type="htf:classinstance">org.eclipse.higgins.idas.udi.impl.hashuri.HashURIUDIFactory</Setting>
		<Setting Name="ConfUDIFactory" Type="htf:classinstance">org.eclipse.higgins.idas.udi.impl.conf.ConfUDIFactory</Setting>
 
		<Setting Name="UDIResolver" Type="htf:classsingleton">org.eclipse.higgins.idas.udi.UDIResolver</Setting>
 
		<Setting Name="JNDIContextFactory" Type="htf:classinstance">org.eclipse.higgins.idas.cp.jndi.JNDIContextFactory</Setting>
		<Setting Name="RDFContextFactory" Type="htf:classinstance">org.eclipse.higgins.idas.cp.rdf.RDFContextFactory</Setting>
 
		<Setting Name="IdASRegistry" Type="htf:classsingleton">org.eclipse.higgins.idas.registry.IdASRegistry</Setting>
 
	</Setting>
 
</Configuration>

Example usage

Here is some example code that contains three examples of how you can start with an Entity UDI and end up with a fully instantiated Entity:

import org.eclipse.higgins.configuration.xml.ConfigurationHandler;
import org.eclipse.higgins.idas.api.IEntity;
import org.eclipse.higgins.idas.udi.IEntityUDI;
import org.eclipse.higgins.idas.udi.UDIResolver;
 
ConfigurationHandler handler = new ConfigurationHandler();
 
handler.setConfigurationBase(".");
handler.setFileName("test.xml");
handler.configure(null);
 
UDIResolver resolver = (UDIResolver) handler.getSettings().get("UDIResolver");
 
// Example 1: Entity UDI in XRI form
 
IEntityUDI entityUDI1 = resolver.parseEntityUDI("@parity*contexts/($context)*(+ldap)*(+poc)//uid%3Dmarkus,ou%3Didentities,dc%3Dhiggins,dc%3Declipse,dc%3Dorg");
Object authnMaterials1 = /* ... */;
 
IEntity entity1 = resolver.resolve(entityUDI1, authnMaterials1);
 
// Example 2: Entity UDI in URI form (Linked Data "303" Cool URI):
 
IEntityUDI entityUDI2 = resolver.parseEntityUDI("http://www.acme.com/id/alice");
Object authnMaterials2 = /* ... */;
 
IEntity entity2 = resolver.resolve(entityUDI2, authnMaterials2);
 
// Example 3: Entity UDI using a Context from the local Configuration file
 
IEntityUDI entityUDI3 = resolver.parseEntityUDI("localContext/uid=markus,ou=identities,dc=higgins,dc=eclipse,dc=org");
Object authnMaterials2 = /* ... */;
 
IEntity entity3 = resolver.resolve(entityUDI3, authnMaterials3);

The only difference between the examples is that different IUDIFactory implementations are used internally by the UDIResolver.

Q&A

  • Why are there separate IxxxUDI and IxxxUDIMetadata interfaces? Why isn't it enough to have IxxxUDI?

The IxxxUDI interface represents the UDI itself. The IxxxUDIMetadata interface provides all the information needed to instantiate the object the UDI points to. The reason why the two interfaces are separate is that an Entity UDI (IEntityUDI) does NOT necessarily have to contain within itself a Context UDI, but it DOES have to provide Context UDI Metadata for the Context the Entity is in. Similarly, an Attribute UDI (IAttributeUDI) does NOT necessarily have to contain within itself an Entity UDI, but it DOES have to provide Entity UDI Metadata for the Entity the Attribute belongs to.

The current idea is that Context IDs from the Configuration API are considered one flavor of Context UDIs, i.e. you are able to parse and resolve them with the UDIResolver class. However, the idas.udi project is not required, if all you need is read/write Context IDs in your configuration file.

Relation to IdASRegistry

IdAS UDI Resolution is a way of discovering Contexts, Entities and Attributes from a UDI. It uses IdASRegistry to look up a suitable Context Provider based on the discovered Context Types.

Therefore, idas.udi depends on idas.registry. The converse is not true, i.e. idas.registry does not depend on idas.udi.

See Also

Back to the top