--- //depot/modules/cordoba/storage/modelstore/src/main/java/com/webify/framework/model/IThing.java	2005/11/14 14:35:48
+++ //depot/modules/cordoba/storage/modelstore/src/main/java/com/webify/framework/model/IThing.java	2005/11/22 07:28:55
@@ -1,10 +1,7 @@
 package com.webify.framework.model;
 
-import com.webify.framework.model.metadata.ClassInfo;
 import com.webify.framework.model.metadata.InterfaceInfo;
-
-import java.net.URI;
-import java.util.Set;
+import com.webify.wsf.modelstore.IPersisted;
 
 /**
  * Base interface for all model types in WSF.  Corresponds to owl:Thing.
@@ -15,52 +12,14 @@
  * @version $Id$
  * @since 2.0.0
  */
-public interface IThing {
+public interface IThing extends IPersisted {
 
     /**
      * @deprecated Should not rely on, or hardcode 3.4 base namespace in code.
      */
     String NS_BASE_CATALOG = "http://www.webifysolutions.com/2005/06/base-catalog#";
-    
-    /**
-     * @param name the property <em>URI</em> in string form.
-     * @deprecated use {@link #getProperty(URI)} instead.
-     */
-    Object getProperty(String name);
-
-    Object getProperty(URI name);
-
-    /**
-     * @param name the property <em>URI</em> in string form.
-     * @deprecated use {@link #setProperty(URI, Object)} instead.
-     */
-    void setProperty(String name, Object value);
-
-    void setProperty(URI name, Object value);
-
-    /**
-     * @param name the property <em>URI</em> in string form.
-     * @deprecated use {@link #removeProperty(URI, Object)} instead.
-     */
-    void removeProperty(String name, Object value);
-
-    void removeProperty(URI name, Object value);
-
-    /**
-     * @param name the property <em>URI</em> in string form.
-     * @return true if <code>value</code> is associated with the specified property
-     * @deprecated use {@link #hasProperty(URI, Object)} instead.
-     */
-    boolean hasProperty(String name, Object value);
 
-    boolean hasProperty(URI name, Object value);
-
     /**
-     * @return a (non-null, possibly empty) set of URIs corresponding to property names.
-     */
-    Set propertyNameSet();
-
-    /**
      * @OntProperty (uri="http://www.w3.org/2000/01/rdf-schema#comment")
      */
     String getComment();
@@ -91,27 +50,6 @@
     void setVersionInfo(String versionInfo);
 
     /**
-     * @return the <em>local</em> name within {@link #getURI()}'s namespace.
-     */
-    String getId();
-
-    /**
-     * @return the full URI for this thing, which is unique within a model.
-     */
-    URI getURI();
-    
-    /**
-     * @return the declared type of the instance
-     */
-    URI getDeclaredType();
-
-    /**
-     * @return a <em>locked</em> {@link ClassInfo} instance
-     *   representing this thing's interface/declared type.
-     */
-    ClassInfo getClassInfo();
-
-    /**
      * @return a <em>locked</em> {@link InterfaceInfo} instance
      *   representing this thing's interface/declared type.
      */
--- //depot/modules/cordoba/storage/modelstore/src/main/java/com/webify/framework/model/ModelFactory.java	2005/11/21 08:58:32
+++ //depot/modules/cordoba/storage/modelstore/src/main/java/com/webify/framework/model/ModelFactory.java	2005/11/21 10:29:33
@@ -3,8 +3,8 @@
 import com.webify.framework.model.changes.ModelChanges;
 import com.webify.framework.model.metadata.MetadataRegistry;
 import com.webify.framework.support.trackingmap.MultiValueMap;
+import com.webify.framework.triples.TripleStore;
 import com.webify.framework.triples.VersionInfo;
-import com.webify.framework.triples.TripleStore;
 
 import java.net.URI;
 import java.util.List;
@@ -114,12 +114,6 @@
 
     MultiValueMap getAllProperties(final long version, final URI subject);
 
-    /**
-     * Attaches disconnected instances and {@link java.util.Collection}s
-     * of {@link IThing}s. Other types of objects are ignored.
-     */
-    void attachDisconnected(Object disconnected);
-
     long getCurrentVersion();
 
     VersionInfo getCurrentVersionInfo();
--- //depot/modules/cordoba/storage/modelstore/src/main/java/com/webify/framework/model/dbstore/HibernateModelFactory.java	2005/11/21 08:58:32
+++ //depot/modules/cordoba/storage/modelstore/src/main/java/com/webify/framework/model/dbstore/HibernateModelFactory.java	2005/11/22 07:34:00
@@ -6,7 +6,6 @@
 import com.webify.framework.model.ModelQuery;
 import com.webify.framework.model.NotFoundException;
 import com.webify.framework.model.proxy.ProxyHandlerContext;
-import com.webify.framework.support.collections.IdentitySet;
 import com.webify.framework.support.trackingmap.TrackingMap;
 import com.webify.framework.triples.changes.TripleChanges;
 import com.webify.wsf.modelstore.impl.ModelAccessImpl;
@@ -168,56 +167,6 @@
         return version;
     }
 
-    /**
-     * @return non-null possibly empty collection
-     */
-    private Collection getOtherThingsInCloud(final IThing thing) {
-        final HibernateInvocationHandler handler = HibernateInvocationHandler.handlerForThing(thing);
-        final Collection others = handler.getThingsInCloud();
-        others.remove(thing);
-        return others;
-    }
-
-    /**
-     * @param disconnected
-     *            can be an {@link IThing}, a {@link Collection}or regular
-     *            {@link Object}
-     */
-    public void attachDisconnected(Object disconnected) {
-        HashSet things = new HashSet();
-        findAllThingsInClouds(disconnected, new IdentitySet(), things);
-        if (GENERAL_LOG.isDebugEnabled()) {
-            GENERAL_LOG.debug("Reattaching: " + things);
-        }
-        for (Iterator i = things.iterator(); i.hasNext();) {
-            final IThing thing = (IThing) i.next();
-            HibernateInvocationHandler handler = HibernateInvocationHandler.handlerForThing(thing);
-            handler.reattach(this);
-        }
-    }
-
-    private void findAllThingsInClouds(final Object disconnected,
-                                       final Set visited,
-                                       final Set target) {
-        if (!visited.add(disconnected)) {
-            // already seen this object
-            return;
-        }
-
-        if (disconnected instanceof Collection) {
-            final Collection collection = (Collection) disconnected;
-            for (Iterator i = collection.iterator(); i.hasNext();) {
-                findAllThingsInClouds(i.next(), visited, target);
-            }
-        }
-        else if (disconnected instanceof IThing) {
-            final IThing thing = (IThing) disconnected;
-            // no need to recurse into each because they all have the same cloud
-            target.add(thing);
-            target.addAll(getOtherThingsInCloud(thing));
-        }
-    }
-
     long getWorkingVersion() {
         // TODO implement getWorkingVersion properly.
         return ModelFactory.CURRENT_VERSION;
@@ -250,7 +199,7 @@
         final HibernateProxyBuilder builder = new HibernateProxyBuilder();
         builder.setContext(this);
         if (typeUri == null) {
-            final TypeComputation tc = new TypeComputation(this, iface, properties);
+            final TypeComputation tc = new TypeComputation(this.getMetadataRegistry(), iface, properties);
             builder.setInterface(tc.deriveInterface());
             builder.setTypeUri(tc.deriveType());
         }
--- //depot/modules/cordoba/storage/modelstore/src/main/java/com/webify/framework/model/dbstore/TypeComputation.java	2005/11/21 08:58:32
+++ //depot/modules/cordoba/storage/modelstore/src/main/java/com/webify/framework/model/dbstore/TypeComputation.java	2005/11/22 07:34:00
@@ -4,7 +4,7 @@
 import com.webify.framework.model.IThing;
 import com.webify.framework.model.PredicateConstants;
 import com.webify.framework.model.metadata.ClassInfo;
-import com.webify.framework.model.proxy.ProxyHandlerContext;
+import com.webify.framework.model.metadata.MetadataRegistry;
 import com.webify.framework.support.trackingmap.TrackingMap;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -21,7 +21,7 @@
  * @author dranatunga
  * @version $Id$
  */
-class TypeComputation {
+public class TypeComputation {
 
     private static final int NONE = 0;
 
@@ -44,28 +44,28 @@
 
     private int _ifaceState = NONE;
     private int _typeState = NONE;
-    private final ProxyHandlerContext _context;
+    private final MetadataRegistry _registry;
     private final Class _ifaceIn;
     private Class _bestIface;
     private URI _bestType;
     private final TrackingMap _knowledge;
 
-    TypeComputation(ProxyHandlerContext context, Class ifaceIn, TrackingMap knowledge) {
+    public TypeComputation(MetadataRegistry registry, Class ifaceIn, TrackingMap knowledge) {
         // TODO an instance can have more than one type, we need to account for this in our API
-        _context = context;
+        _registry = registry;
         _ifaceIn = ifaceIn;
         _knowledge = knowledge;
         _bestIface = ifaceIn;
     }
 
-    Class deriveInterface() {
+    public Class deriveInterface() {
         determineUsingInstanceAssociation();
         // TODO determineUsingClassAssocation
         determineUsingTypeNameGuessing();
         return _bestIface;
     }
 
-    URI deriveType() {
+    public URI deriveType() {
         determineUsingInstanceType();
         determineUsingMetadataInfo();
         return _bestType;
@@ -141,7 +141,7 @@
         ClassInfo mostSpecificType = null;
         for (Iterator i = _knowledge.getAll(PredicateConstants.TYPE_OF).iterator(); i.hasNext();) {
             URI oneDeclaredType = (URI) i.next();
-            ClassInfo oneDeclaredInfo = _context.getMetadataRegistry().getClassInfo(oneDeclaredType);
+            ClassInfo oneDeclaredInfo = _registry.getClassInfo(oneDeclaredType);
             if ((mostSpecificType == null) || oneDeclaredInfo.getSuperClasses().contains(mostSpecificType)) {
                 mostSpecificType = oneDeclaredInfo;
             }
@@ -163,7 +163,7 @@
         if (_typeState >= FOUND_FROM_ANNOTATION) {
             return;
         }
-        final ClassInfo classInfo = _context.getMetadataRegistry().getInterfaceInfo(_ifaceIn).getTypeInfo();
+        final ClassInfo classInfo = _registry.getInterfaceInfo(_ifaceIn).getTypeInfo();
         if ((classInfo == null) || (classInfo.getTypeUri() == null)) {
             return;
         }
--- //depot/modules/cordoba/storage/modelstore/src/test/java/com/webify/framework/model/kowari/KowariModelFactoryTest.java	2005/11/14 14:53:49
+++ //depot/modules/cordoba/storage/modelstore/src/test/java/com/webify/framework/model/kowari/KowariModelFactoryTest.java	2005/11/21 10:29:33
@@ -1,23 +1,22 @@
 package com.webify.framework.model.kowari;
 
+import java.net.URI;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
-import java.net.URI;
 
 import com.webify.framework.model.IThing;
 import com.webify.framework.model.ModelFactory;
 import com.webify.framework.model.ModelQuery;
 import com.webify.framework.model.metadata.InterfaceInfo;
 import com.webify.framework.model.metadata.PropertyInfo;
+import com.webify.framework.support.uri.URIs;
 import com.webify.framework.support.uuid.UUID;
-import com.webify.framework.support.uri.URIs;
+import com.webify.framework.test.ConfiguredCoreTest;
+import com.webify.framework.test.ModelExistsCondition;
 import com.webify.framework.test.PreTestCondition;
-import com.webify.framework.test.ModelExistsCondition;
-import com.webify.framework.test.ConfiguredCoreTest;
-
 import junit.framework.TestSuite;
 
 /**
@@ -52,7 +51,6 @@
         ts.addTest(new KowariModelFactoryTest("testModifyKnownSubject"));
         ts.addTest(new KowariModelFactoryTest("testListExisting"));
         ts.addTest(new KowariModelFactoryTest("testListLiterals"));
-        ts.addTest(new KowariModelFactoryTest("testSerializeThing"));
         ts.addTest(new KowariModelFactoryTest("testMetadataAccessFromThing"));
         return ts;
     }
@@ -112,15 +110,6 @@
     }
 
 
-    public void testSerializeThing() {
-        final IThing original = getModelFactory().load(IThing.class, EXISTING_THING);
-        final byte[] serialized = serialize(original);
-        final Object reloaded = deserialize(serialized);
-        assertEquals(original, reloaded);
-        // TODO lookup something off reloaded that would require it to be connected.
-        getModelFactory().attachDisconnected(reloaded);
-    }
-
     public void testMetadataAccessFromThing() {
         final IThing created = getModelFactory().create(SampleCar.class, new UUID().toString());
         final InterfaceInfo info = created.getInterfaceInfo();
