Adding JMCR-Stable version
[Benchmarks_CSolver.git] / JMCR-Stable / mcr-test / WWW / Doc / Programmer / samples / ContainerResource.html
diff --git a/JMCR-Stable/mcr-test/WWW/Doc/Programmer/samples/ContainerResource.html b/JMCR-Stable/mcr-test/WWW/Doc/Programmer/samples/ContainerResource.html
new file mode 100644 (file)
index 0000000..4e4b5fc
--- /dev/null
@@ -0,0 +1,452 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN"\r
+                      "http://www.w3.org/TR/REC-html40/strict.dtd">\r
+<html>\r
+  <head>\r
+    <title>ContainerResource.java</title>\r
+    <meta name="Author" content="Benoit Mahe">\r
+    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">\r
+    <meta name="Generator" content="*emacs: emacs-css">\r
+\r
+    <link rel="Stylesheet" media="screen" type="text/css" href="default-html.css">\r
+  </head>\r
+  <body>\r
+\r
+    <pre>\r
+<span class="comment">// ContainerResource.java\r
+// $Id: ContainerResource.html,v 1.1 2010/06/15 12:20:03 smhuang Exp $\r
+// (c) COPYRIGHT MIT and INRIA, 1996.\r
+// Please first read the full copyright statement in file COPYRIGHT.html\r
+</span>\r
+<span class="keyword">package</span> <span class="reference">org</span>.<span class="reference">w3c</span>.<span class="reference">tools</span>.<span class="type">resources</span> ;\r
+\r
+<span class="keyword">import</span> <span class="reference">java</span>.<span class="reference">util</span>.*;\r
+\r
+<span class="keyword">import</span> <span class="reference">org</span>.<span class="reference">w3c</span>.<span class="reference">tools</span>.<span class="reference">resources</span>.<span class="reference">event</span>.*;\r
+\r
+<span class="comment">/**\r
+ * This resource manage children resources.\r
+ */</span>\r
+<span class="reference">public</span> <span class="keyword">class</span> <span class="function-name">ContainerResource</span> <span class="keyword">extends</span> <span class="type">AbstractContainer</span> {\r
+\r
+    <span class="comment">/**\r
+     * Attribute index - The index of the resource key.\r
+     */</span>\r
+    <span class="preprocessor">protected</span> <span class="type">static</span> <span class="type">int</span> <span class="variable-name">ATTR_KEY</span> = -1;\r
+\r
+    <span class="type">static</span> {\r
+       <span class="type">Attribute</span> <span class="variable-name">a</span>   = <span class="keyword">null</span> ;\r
+       <span class="type">Class</span>     <span class="variable-name">cls</span> = <span class="keyword">null</span> ;\r
+       <span class="comment">// Get a pointer to our own class:\r
+</span>        <span class="keyword">try</span> {\r
+           cls  = Class.forName("<span class="string">org.w3c.tools.resources.ContainerResource</span>") ;\r
+       } <span class="keyword">catch</span> (<span class="type">Exception</span> <span class="variable-name">ex</span>) {\r
+           ex.printStackTrace() ;\r
+           System.exit(1) ;\r
+       }\r
+       <span class="comment">// The identifier attribute:\r
+</span>        a = <span class="keyword">new</span> <span class="type">IntegerAttribute</span>("<span class="string">key</span>",\r
+                                <span class="keyword">null</span>,\r
+                                Attribute.COMPUTED);\r
+       ATTR_KEY = AttributeRegistry.registerAttribute(cls, a);\r
+    }\r
+\r
+    <span class="reference">public</span> <span class="type">Object</span> <span class="function-name">getClone</span>(<span class="type">Object</span> <span class="variable-name">values</span>[]) {\r
+       values[ATTR_KEY] = <span class="keyword">null</span>;\r
+       <span class="keyword">return</span> <span class="reference">super</span>.getClone(values);\r
+    }\r
+\r
+    <span class="comment">/**\r
+     * Get the container Key. This key must be unique and unchanged\r
+     * during the container life.\r
+     * </span><span class="keyword">@return </span><span class="comment">a String instance.\r
+     */</span>\r
+    <span class="reference">public</span> <span class="type">Integer</span> <span class="function-name">getKey</span>() {\r
+       <span class="type">Integer</span> <span class="variable-name">key</span> = (<span class="type">Integer</span>) getValue(ATTR_KEY, <span class="keyword">null</span>);\r
+       <span class="keyword">if</span> (key == <span class="keyword">null</span>) {\r
+           key = <span class="keyword">new</span> <span class="type">Integer</span>(getIdentifier().hashCode() ^ \r
+                             (<span class="keyword">new</span> <span class="type">Date</span>().hashCode()));\r
+           setValue(ATTR_KEY, key);\r
+       }\r
+       <span class="keyword">return</span> key;\r
+    }\r
+\r
+    <span class="preprocessor">protected</span> <span class="type">SpaceEntry</span> <span class="function-name">getSpaceEntry</span>() {\r
+       <span class="type">ResourceReference</span> <span class="variable-name">rr</span> = getParent();\r
+       <span class="keyword">if</span> (rr == <span class="keyword">null</span>) <span class="comment">//I'm root or external!!\r
+</span>            <span class="keyword">return</span> <span class="keyword">new</span> <span class="type">SpaceEntryImpl</span>(<span class="reference">this</span>);\r
+       <span class="keyword">try</span> {\r
+           <span class="comment">//FIXME sure that is a containerResource?\r
+</span>            <span class="type">ContainerResource</span> <span class="variable-name">cont</span> = (<span class="type">ContainerResource</span>) rr.lock();\r
+           <span class="keyword">return</span> <span class="keyword">new</span> <span class="type">SpaceEntryImpl</span>(cont);\r
+       } <span class="keyword">catch</span> (<span class="type">InvalidResourceException</span> <span class="variable-name">ex</span>) {\r
+           System.out.println(ex.getMessage());\r
+           ex.printStackTrace();\r
+           <span class="keyword">return</span> <span class="keyword">null</span>;\r
+       } <span class="keyword">finally</span> {\r
+           rr.unlock();\r
+       }\r
+    }\r
+\r
+    <span class="comment">/**\r
+     * Get the SpaceEntry of our children resources.\r
+     * </span><span class="keyword">@return </span><span class="comment">A SpaceEntry instance.\r
+     */</span>\r
+    <span class="preprocessor">protected</span> <span class="type">SpaceEntry</span> <span class="function-name">getChildrenSpaceEntry</span>() {\r
+       <span class="keyword">return</span> <span class="keyword">new</span> <span class="type">SpaceEntryImpl</span>( <span class="reference">this</span> );\r
+    }\r
+\r
+    <span class="comment">/**\r
+     * This handles the &lt;code&gt;RESOURCE_MODIFIED&lt;/code&gt; kind of events.\r
+     * </span><span class="keyword">@param </span><span class="variable-name">evt</span><span class="comment"> The StructureChangeEvent.\r
+     */</span>\r
+  \r
+    <span class="comment">//FIXME EVENT, we don't know if this resource is valid.\r
+</span>    <span class="reference">public</span> <span class="type">void</span> <span class="function-name">resourceModified</span>(<span class="type">StructureChangedEvent</span> <span class="variable-name">evt</span>) {\r
+       <span class="reference">super</span>.resourceModified(evt);\r
+    }\r
+\r
+    <span class="comment">/**\r
+     * A new resource has been created in some space.\r
+     * This handles the &lt;code&gt;RESOURCE_CREATED&lt;/code&gt; kind of events.\r
+     * </span><span class="keyword">@param </span><span class="variable-name">evt</span><span class="comment"> The event describing the change.\r
+     */</span>\r
+\r
+    <span class="reference">public</span> <span class="type">void</span> <span class="function-name">resourceCreated</span>(<span class="type">StructureChangedEvent</span> <span class="variable-name">evt</span>) {\r
+       <span class="reference">super</span>.resourceCreated(evt);\r
+    }\r
+  \r
+    <span class="comment">/**\r
+     * A resource is about to be removed\r
+     * This handles the &lt;code&gt;RESOURCE_REMOVED&lt;/code&gt; kind of events.\r
+     * </span><span class="keyword">@param </span><span class="variable-name">evt</span><span class="comment"> The event describing the change.\r
+     */</span>\r
+  \r
+    <span class="reference">public</span> <span class="type">void</span> <span class="function-name">resourceRemoved</span>(<span class="type">StructureChangedEvent</span> <span class="variable-name">evt</span>) {\r
+       <span class="reference">super</span>.resourceRemoved(evt);\r
+    }\r
+\r
+    <span class="comment">/**\r
+     * Update default child attributes.\r
+     * A parent can often pass default attribute values to its children,\r
+     * such as a pointer to itself (the &lt;em&gt;parent&lt;/em&gt; attribute).\r
+     * &lt;p&gt;This is the method to overide when you want your container\r
+     * to provide these kinds of attributes. By default this method will set\r
+     * the following attributes:\r
+     * &lt;dl&gt;&lt;dt&gt;name&lt;dd&gt;The name of the child (it's identifier) - \r
+     * String instance.\r
+     * &lt;dt&gt;parent&lt;dd&gt;The parent of the child (ie ourself here) - \r
+     * a ContainerResource instance.\r
+     * &lt;dt&gt;url&lt;dd&gt;If a &lt;em&gt;identifier&lt;/em&gt; attribute is defined, that\r
+     * attribute is set to the full URL path of the children.\r
+     * &lt;/dl&gt;\r
+     */</span>\r
+  \r
+    <span class="preprocessor">protected</span> <span class="type">ResourceContext</span> <span class="function-name">updateDefaultChildAttributes</span>(<span class="type">Hashtable</span> <span class="variable-name">attrs</span>) {\r
+       <span class="type">ResourceContext</span> <span class="variable-name">context</span> = <span class="reference">super</span>.updateDefaultChildAttributes(attrs);\r
+       <span class="keyword">if</span> (context == <span class="keyword">null</span>) {\r
+           context = <span class="keyword">new</span> <span class="type">ResourceContext</span>(getContext());\r
+           attrs.put("<span class="string">context</span>", context) ;\r
+       }\r
+       <span class="type">String</span> <span class="variable-name">name</span> = (<span class="type">String</span>) attrs.get("<span class="string">identifier</span>");\r
+       <span class="keyword">if</span> ( name != <span class="keyword">null</span> )\r
+           attrs.put("<span class="string">url</span>", getURLPath()+name);\r
+       <span class="keyword">return</span> context;\r
+    }\r
+\r
+    <span class="comment">/**\r
+     * Enumerate children resource identifiers.\r
+     * </span><span class="keyword">@param </span><span class="variable-name">all</span><span class="comment"> Should all resources be enumerated ? Resources are often\r
+     * created on demand only, this flag allows the caller to tell the \r
+     * container about wether it is interested only in already created\r
+     * resources, or in all resources (even the one that have not yet been\r
+     * created).\r
+     * </span><span class="keyword">@return </span><span class="comment">An String enumeration, one element per child.\r
+     */</span>\r
+\r
+    <span class="reference">public</span> <span class="type">synchronized</span> <span class="type">Enumeration</span> <span class="function-name">enumerateResourceIdentifiers</span>(<span class="type">boolean</span> <span class="variable-name">all</span>) {\r
+       <span class="type">ResourceSpace</span> <span class="variable-name">space</span> = getSpace();\r
+       acquireChildren();\r
+       <span class="keyword">return</span> space.enumerateResourceIdentifiers( getChildrenSpaceEntry() );\r
+    }\r
+\r
+    <span class="comment">/**\r
+     * Create a default child resource in that container.\r
+     * This method is called by the editor to add a default resource\r
+     * in the container under the given name. The meaning of &lt;em&gt;default&lt;/em&gt;\r
+     * is left up to the container here.\r
+     * </span><span class="keyword">@param </span><span class="variable-name">name</span><span class="comment"> The identifier for the new resource.\r
+     */</span>\r
+    <span class="reference">public</span>  <span class="type">ResourceReference</span> <span class="function-name">createDefaultResource</span>(<span class="type">String</span> <span class="variable-name">name</span>) {\r
+       <span class="keyword">return</span> <span class="keyword">null</span>;\r
+    }\r
+\r
+    <span class="comment">/**\r
+     * Lookup a children in the container.\r
+     * </span><span class="keyword">@param </span><span class="variable-name">name</span><span class="comment"> The name of the children to lookup.\r
+     */</span>\r
+\r
+    <span class="reference">public</span> <span class="type">ResourceReference</span> <span class="function-name">lookup</span>(<span class="type">String</span> <span class="variable-name">name</span>) {\r
+       acquireChildren();\r
+       <span class="type">SpaceEntry</span> <span class="variable-name">sp</span> = getChildrenSpaceEntry();\r
+       <span class="type">ResourceSpace</span> <span class="variable-name">space</span> = getSpace();\r
+       <span class="type">ResourceReference</span> <span class="variable-name">rr</span> = space.lookupResource(sp, name);\r
+       <span class="keyword">if</span> (rr != <span class="keyword">null</span>) \r
+           <span class="keyword">return</span> rr;\r
+       <span class="type">Hashtable</span> <span class="variable-name">defs</span> = <span class="keyword">new</span> <span class="type">Hashtable</span>(5) ;\r
+       defs.put("<span class="string">identifier</span>", name);\r
+       <span class="type">ResourceContext</span> <span class="variable-name">context</span> = updateDefaultChildAttributes(defs);\r
+\r
+       rr = space.loadResource(sp, name, defs);\r
+       <span class="keyword">if</span> (rr != <span class="keyword">null</span>) {\r
+           context.setResourceReference(rr);\r
+           <span class="keyword">try</span> {\r
+               <span class="type">Resource</span> <span class="variable-name">resource</span> = rr.lock();\r
+               <span class="keyword">if</span> (resource <span class="keyword">instanceof</span> <span class="type">FramedResource</span>) {\r
+                   <span class="type">FramedResource</span> <span class="variable-name">fres</span> = (<span class="type">FramedResource</span>) resource;\r
+                   fres.addStructureChangedListener(<span class="reference">this</span>);\r
+                   <span class="comment">// send event\r
+</span>                }\r
+           } <span class="keyword">catch</span> (<span class="type">InvalidResourceException</span> <span class="variable-name">ex</span>) {\r
+               <span class="comment">// nothing here\r
+</span>            } <span class="keyword">finally</span> {\r
+               rr.unlock();\r
+           }\r
+       }\r
+       <span class="keyword">return</span> rr;\r
+    }\r
+\r
+    <span class="comment">/**\r
+     * Lookup the next component of this lookup state in here.\r
+     * </span><span class="keyword">@param </span><span class="variable-name">ls</span><span class="comment"> The current lookup state.\r
+     * </span><span class="keyword">@param </span><span class="variable-name">lr</span><span class="comment"> The lookup result under construction.\r
+     * </span><span class="keyword">@exception </span><span class="type">ProtocolException</span><span class="comment"> If an error occurs.\r
+     * </span><span class="keyword">@return </span><span class="comment">A boolean, &lt;strong&gt;true&lt;/strong&gt; if lookup has completed, \r
+     * &lt;strong&gt;false&lt;/strong&gt; if it should be continued by the caller.\r
+     */</span>\r
+    <span class="reference">public</span> <span class="type">boolean</span> <span class="function-name">lookup</span>(<span class="type">LookupState</span> <span class="variable-name">ls</span>, <span class="type">LookupResult</span> <span class="variable-name">lr</span>) \r
+       <span class="keyword">throws</span> <span class="type">ProtocolException</span>\r
+    {\r
+       <span class="comment">// Give a chance to our super-class to run its own lookup scheme:\r
+</span>        <span class="keyword">if</span> ( <span class="reference">super</span>.lookup(ls, lr) )\r
+           <span class="keyword">return</span> <span class="keyword">true</span>;\r
+       <span class="comment">// Perform our own lookup on the next component:\r
+</span>        <span class="type">String</span> <span class="variable-name">name</span> = ls.getNextComponent() ;\r
+       <span class="type">ResourceReference</span> <span class="variable-name">rr</span> = <span class="keyword">null</span>;\r
+       rr = lookup(name);\r
+       <span class="keyword">if</span> (rr == <span class="keyword">null</span>) {\r
+           lr.setTarget(<span class="keyword">null</span>);\r
+           <span class="keyword">return</span> <span class="keyword">false</span>;\r
+       }\r
+       <span class="keyword">try</span> {\r
+           lr.setTarget(rr);\r
+           <span class="type">FramedResource</span> <span class="variable-name">resource</span> = (<span class="type">FramedResource</span>) rr.lock();\r
+           <span class="keyword">return</span> (resource != <span class="keyword">null</span> ) ? resource.lookup(ls, lr) : <span class="keyword">false</span>;\r
+       } <span class="keyword">catch</span> (<span class="type">InvalidResourceException</span> <span class="variable-name">ex</span>) {\r
+           <span class="keyword">return</span> <span class="keyword">false</span>;\r
+       } <span class="keyword">finally</span> {\r
+           rr.unlock();\r
+       }\r
+    }\r
+  \r
+    <span class="comment">/**\r
+     * Remove a child resource from that container.\r
+     * </span><span class="keyword">@param </span><span class="variable-name">name</span><span class="comment"> The name of the child to remove.\r
+     * </span><span class="keyword">@exception </span><span class="type">MultipleLockException</span><span class="comment"> If somone else has locked the \r
+     * resource.\r
+     */</span>\r
+\r
+    <span class="reference">public</span> <span class="type">void</span> <span class="function-name">delete</span>(<span class="type">String</span> <span class="variable-name">name</span>) \r
+       <span class="keyword">throws</span> <span class="type">MultipleLockException</span>\r
+    {\r
+       <span class="type">ResourceReference</span> <span class="variable-name">rr</span> = <span class="keyword">null</span>;\r
+       rr = lookup(name);\r
+\r
+       <span class="keyword">if</span> (rr != <span class="keyword">null</span>) {\r
+           <span class="keyword">try</span> {\r
+               <span class="type">synchronized</span> (rr) {\r
+                   <span class="type">Resource</span> <span class="variable-name">resource</span> = rr.lock();\r
+                   <span class="keyword">if</span> (resource <span class="keyword">instanceof</span> <span class="type">FramedResource</span>)\r
+                       ((<span class="type">FramedResource</span>)resource).\r
+                           removeStructureChangedListener(<span class="reference">this</span>);\r
+                   resource.delete();\r
+               }\r
+           } <span class="keyword">catch</span> (<span class="type">InvalidResourceException</span> <span class="variable-name">ex</span>) {\r
+               <span class="comment">// FIXME ??\r
+</span>            } <span class="keyword">finally</span> {\r
+               rr.unlock();\r
+           }\r
+       }\r
+    }\r
+\r
+\r
+\r
+    <span class="comment">/**\r
+     * Delete that container and its children if children is true\r
+     * </span><span class="keyword">@exception </span><span class="type">MultipleLockException</span><span class="comment"> If somone else has locked one \r
+     * of the resource child.\r
+     */</span>\r
+    <span class="reference">public</span> <span class="type">synchronized</span> <span class="type">void</span> <span class="function-name">replace</span>(<span class="type">DirectoryResource</span> <span class="variable-name">newdir</span>) \r
+       <span class="keyword">throws</span> <span class="type">MultipleLockException</span>\r
+    {\r
+       <span class="type">Enumeration</span>       <span class="variable-name">e</span>        = enumerateResourceIdentifiers();\r
+       <span class="type">ResourceReference</span> <span class="variable-name">rr</span>       = <span class="keyword">null</span>;\r
+       <span class="type">Resource</span>          <span class="variable-name">resource</span> = <span class="keyword">null</span>;\r
+       <span class="keyword">while</span> (e.hasMoreElements()) {\r
+           rr = lookup((<span class="type">String</span>) e.nextElement());\r
+           <span class="keyword">if</span> (rr != <span class="keyword">null</span>) {\r
+               <span class="keyword">try</span> {\r
+                   resource = rr.lock();\r
+                   <span class="type">ResourceContext</span> <span class="variable-name">ctxt</span> = <span class="keyword">new</span> <span class="type">ResourceContext</span>(\r
+                       newdir.getContext());\r
+                   resource.setContext(ctxt, <span class="keyword">true</span>);\r
+                   <span class="keyword">if</span> (resource <span class="keyword">instanceof</span> <span class="type">FramedResource</span>) {\r
+                       ((<span class="type">FramedResource</span>)resource).\r
+                           removeStructureChangedListener(<span class="reference">this</span>);\r
+                       ((<span class="type">FramedResource</span>)resource).\r
+                           addStructureChangedListener(newdir);\r
+                   }\r
+               } <span class="keyword">catch</span> (<span class="type">InvalidResourceException</span> <span class="variable-name">ex</span>) {\r
+                   <span class="comment">// do nothing , continue\r
+</span>                } <span class="keyword">finally</span> {\r
+                   rr.unlock();\r
+               }\r
+           }\r
+       }\r
+       <span class="reference">super</span>.delete();\r
+    }\r
+\r
+    <span class="comment">/**\r
+     * Delete that resource container.\r
+     * </span><span class="keyword">@exception </span><span class="type">MultipleLockException</span><span class="comment"> If somone else has locked the \r
+     * resource.\r
+     */</span>\r
+    <span class="reference">public</span> <span class="type">synchronized</span> <span class="type">void</span> <span class="function-name">delete</span>() \r
+       <span class="keyword">throws</span> <span class="type">MultipleLockException</span>\r
+    {\r
+       disableEvent();\r
+       <span class="type">ResourceSpace</span> <span class="variable-name">space</span> = getSpace();\r
+       <span class="comment">//delete our children\r
+</span>        acquireChildren();\r
+       <span class="comment">// check for lock on children\r
+</span>        <span class="type">Enumeration</span>       <span class="variable-name">e</span>        = enumerateResourceIdentifiers();\r
+       <span class="type">ResourceReference</span> <span class="variable-name">rr</span>       = <span class="keyword">null</span>;\r
+       <span class="type">Resource</span>          <span class="variable-name">resource</span> = <span class="keyword">null</span>;\r
+\r
+       <span class="keyword">while</span> (e.hasMoreElements())\r
+           delete((<span class="type">String</span>)e.nextElement());\r
+\r
+       <span class="type">SpaceEntry</span> <span class="variable-name">sentry</span> = getChildrenSpaceEntry();\r
+       <span class="comment">//delete myself\r
+</span>        <span class="reference">super</span>.delete();\r
+       space.deleteChildren(sentry);\r
+    }\r
+\r
+    <span class="comment">/**\r
+     * This resource is being unloaded.\r
+     * The resource is being unloaded from memory, perform any additional\r
+     * cleanup required.\r
+     */</span>\r
+    <span class="reference">public</span> <span class="type">void</span> <span class="function-name">notifyUnload</span>() {\r
+       <span class="reference">super</span>.notifyUnload();\r
+       <span class="comment">// anything else?\r
+</span>    }\r
+\r
+    <span class="preprocessor">protected</span> <span class="type">boolean</span> <span class="variable-name">acquired</span> = <span class="keyword">false</span>;\r
+\r
+    <span class="comment">/**\r
+     * Acquire our children. Must be called before all child manipulation.\r
+     */</span>\r
+    <span class="preprocessor">protected</span> <span class="type">synchronized</span> <span class="type">void</span> <span class="function-name">acquireChildren</span>() {\r
+       <span class="keyword">if</span> (!acquired) {\r
+           <span class="type">ResourceSpace</span> <span class="variable-name">space</span> = getSpace();\r
+           space.acquireChildren( getChildrenSpaceEntry() );\r
+           acquired = <span class="keyword">true</span>;\r
+       }\r
+    }\r
+\r
+    <span class="comment">/**\r
+     * Add an initialized resource into this store container instance.\r
+     * </span><span class="keyword">@param </span><span class="variable-name">resource</span><span class="comment"> The resource to be added to the store.\r
+     */</span>\r
+  \r
+    <span class="preprocessor">protected</span> <span class="type">synchronized</span> <span class="type">ResourceReference</span> <span class="function-name">addResource</span>(<span class="type">Resource</span> <span class="variable-name">resource</span>, \r
+                                                        <span class="type">Hashtable</span> <span class="variable-name">defs</span>) {\r
+       acquireChildren();\r
+       <span class="type">ResourceReference</span> <span class="variable-name">rr</span> = getSpace().addResource(getChildrenSpaceEntry() ,\r
+                                                     resource, \r
+                                                     defs);\r
+       resource.getContext().setResourceReference(rr);\r
+       <span class="keyword">if</span> (resource <span class="keyword">instanceof</span> <span class="type">FramedResource</span>) {\r
+           <span class="type">FramedResource</span> <span class="variable-name">fres</span> = (<span class="type">FramedResource</span>) resource;\r
+           fres.addStructureChangedListener(<span class="reference">this</span>);\r
+       }\r
+       markModified() ;\r
+       postStructureChangedEvent(rr, Events.RESOURCE_CREATED);\r
+       <span class="keyword">return</span> rr;\r
+    }\r
+\r
+    <span class="comment">/**\r
+     * Initialize and register the given resource within that container.\r
+     * </span><span class="keyword">@param </span><span class="variable-name">name</span><span class="comment"> The identifier for the resource.\r
+     * </span><span class="keyword">@param </span><span class="variable-name">resource</span><span class="comment"> An unitialized resource instance.\r
+     * </span><span class="keyword">@param </span><span class="variable-name">defs</span><span class="comment"> A default set of init attribute values (may be\r
+     * &lt;strong&gt;null&lt;/strong&gt;).\r
+     * </span><span class="keyword">@exception </span><span class="type">InvalidResourceException</span><span class="comment"> If an error occurs during\r
+     * the registration.\r
+     */</span>\r
+\r
+    <span class="reference">public</span> <span class="type">void</span> <span class="function-name">registerResource</span>(<span class="type">String</span> <span class="variable-name">name</span>,\r
+                                <span class="type">Resource</span> <span class="variable-name">resource</span>,\r
+                                <span class="type">Hashtable</span> <span class="variable-name">defs</span>)\r
+       <span class="keyword">throws</span> <span class="type">InvalidResourceException</span>\r
+    {\r
+       acquireChildren();\r
+       <span class="comment">// Create a default set of attributes:\r
+</span>        <span class="keyword">if</span> ( defs == <span class="keyword">null</span> )\r
+           defs = <span class="keyword">new</span> <span class="type">Hashtable</span>(11) ;\r
+       defs.put("<span class="string">identifier</span>", name);\r
+       <span class="type">ResourceContext</span> <span class="variable-name">context</span> =  updateDefaultChildAttributes(defs);\r
+       <span class="keyword">if</span> (context != <span class="keyword">null</span>) {\r
+           resource.initialize(defs);\r
+           <span class="type">ResourceReference</span> <span class="variable-name">rr</span>;\r
+           rr = getSpace().addResource(getChildrenSpaceEntry(),\r
+                                       resource, \r
+                                       defs);\r
+           context.setResourceReference(rr);\r
+           <span class="keyword">if</span> (resource <span class="keyword">instanceof</span> <span class="type">FramedResource</span>) {\r
+               <span class="type">FramedResource</span> <span class="variable-name">fres</span> = (<span class="type">FramedResource</span>) resource;\r
+               fres.addStructureChangedListener(<span class="reference">this</span>);\r
+               <span class="comment">// send event\r
+</span>            }\r
+           markModified();\r
+           postStructureChangedEvent(rr, Events.RESOURCE_CREATED);\r
+       } <span class="keyword">else</span> {\r
+           <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">InvalidResourceException</span>(getIdentifier(),\r
+                                              name,\r
+                                              "<span class="string">unable to get context</span>");\r
+       }\r
+    }\r
+\r
+    <span class="comment">/**\r
+     * Initialize ourself.\r
+     * As we are a container resource that really contains something, we make\r
+     * sure our URL ends properly with a slash.\r
+     * </span><span class="keyword">@param </span><span class="variable-name">values</span><span class="comment"> Our default attribute values.\r
+     */</span>\r
+    <span class="reference">public</span> <span class="type">void</span> <span class="function-name">initialize</span>(<span class="type">Object</span> <span class="variable-name">values</span>[]) {\r
+       <span class="reference">super</span>.initialize(values);\r
+       disableEvent();\r
+       <span class="comment">// If my URL doesn't end with a slah, correct it:\r
+</span>        <span class="type">String</span> <span class="variable-name">url</span> = getURLPath() ;\r
+       <span class="keyword">if</span> ((url != <span class="keyword">null</span>) && ! url.endsWith("<span class="string">/</span>") )\r
+           setValue(ATTR_URL, url+"<span class="string">/</span>") ;\r
+       acquired = <span class="keyword">false</span>;\r
+       enableEvent();\r
+    }\r
+}\r
+\r
+\r
+\r
+    </pre>\r
+  </body>\r
+</html>\r