You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2011/01/03 11:14:32 UTC

svn commit: r1054571 - in /sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl: EntityResourceList.java PersistentResourceList.java RegisteredResourceImpl.java Util.java

Author: cziegeler
Date: Mon Jan  3 10:14:32 2011
New Revision: 1054571

URL: http://svn.apache.org/viewvc?rev=1054571&view=rev
Log:
SLING-1913 : Implement own serialization/deserilization

Added:
    sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/Util.java   (with props)
Modified:
    sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/EntityResourceList.java
    sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/PersistentResourceList.java
    sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/RegisteredResourceImpl.java

Modified: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/EntityResourceList.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/EntityResourceList.java?rev=1054571&r1=1054570&r2=1054571&view=diff
==============================================================================
--- sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/EntityResourceList.java (original)
+++ sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/EntityResourceList.java Mon Jan  3 10:14:32 2011
@@ -18,10 +18,10 @@
  */
 package org.apache.sling.installer.core.impl;
 
+import java.io.IOException;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 import java.util.SortedSet;
@@ -36,24 +36,52 @@ import org.slf4j.LoggerFactory;
  */
 public class EntityResourceList implements Serializable {
 
-    private static final long serialVersionUID = -1733426192525500065L;
+    /** Use own serial version ID as we control serialization. */
+    private static final long serialVersionUID = 6L;
 
+    /** Serialization version. */
+    private static final int VERSION = 1;
+
+    /** Logger. */
     private static final Logger LOGGER = LoggerFactory.getLogger(EntityResourceList.class);
 
-    private static final class ResourceComparator implements Comparator<RegisteredResource>, Serializable {
-        private static final long serialVersionUID = 3573107717574356088L;
+    /** The set of registered resources for this entity. */
+    private final SortedSet<RegisteredResource> resources = new TreeSet<RegisteredResource>();
 
-        public int compare(RegisteredResource o1, RegisteredResource o2) {
-            int result = o1.compareTo(o2);
-            if ( result == 0 ) {
-                result = o1.getURL().compareTo(o2.getURL());
-            }
-            return result;
+    /**
+     * Serialize the object
+     * - write version id
+     * - serialize each entry in the resources list
+     * @param out Object output stream
+     * @throws IOException
+     */
+    private void writeObject(final java.io.ObjectOutputStream out)
+    throws IOException {
+        out.writeInt(VERSION);
+        out.writeInt(resources.size());
+        for(final RegisteredResource rr : this.resources) {
+            out.writeObject(rr);
         }
     }
 
-    private final SortedSet<RegisteredResource> resources = new TreeSet<RegisteredResource>(
-            new ResourceComparator());
+    /**
+     * Deserialize the object
+     * - read version id
+     * - deserialize each entry in the resources list
+     */
+    private void readObject(final java.io.ObjectInputStream in)
+    throws IOException, ClassNotFoundException {
+        final int version = in.readInt();
+        if ( version != VERSION ) {
+            throw new ClassNotFoundException(this.getClass().getName());
+        }
+        Util.setField(this, "resources", new TreeSet<RegisteredResource>());
+        final int size = in.readInt();
+        for(int i=0; i < size; i++) {
+            final RegisteredResource rr = (RegisteredResource)in.readObject();
+            this.resources.add(rr);
+        }
+    }
 
     /** The resource list is empty if it contains no resources. */
     public boolean isEmpty() {
@@ -114,7 +142,7 @@ public class EntityResourceList implemen
 
     public void addOrUpdate(final RegisteredResource r) {
         LOGGER.debug("Adding new resource: {}", r);
-        // If an object with same sort key is already present, replace with the
+        // If an object with same url is already present, replace with the
         // new one which might have different attributes
         boolean first = true;
         for(final RegisteredResource rr : resources) {

Modified: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/PersistentResourceList.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/PersistentResourceList.java?rev=1054571&r1=1054570&r2=1054571&view=diff
==============================================================================
--- sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/PersistentResourceList.java (original)
+++ sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/PersistentResourceList.java Mon Jan  3 10:14:32 2011
@@ -40,6 +40,9 @@ import org.slf4j.LoggerFactory;
  */
 public class PersistentResourceList {
 
+    /** Serialization version. */
+    private static final int VERSION = 1;
+
     /** The logger */
     private final Logger logger =  LoggerFactory.getLogger(this.getClass());
 
@@ -61,8 +64,13 @@ public class PersistentResourceList {
             ObjectInputStream ois = null;
             try {
                 ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(dataFile)));
-                restoredData = (Map<String, EntityResourceList>)ois.readObject();
-                logger.debug("Restored rsource list: {}", restoredData);
+                final int version = ois.readInt();
+                if ( version == VERSION ) {
+                    restoredData = (Map<String, EntityResourceList>)ois.readObject();
+                } else {
+                    logger.warn("Unknown version for persistent resource list: {}", version);
+                }
+                logger.debug("Restored resource list: {}", restoredData);
             } catch (final Exception e) {
                 logger.warn("Unable to restore data, starting with empty list (" + e.getMessage() + ")", e);
             } finally {
@@ -82,6 +90,7 @@ public class PersistentResourceList {
         try {
             final ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));
             try {
+                oos.writeInt(VERSION);
                 oos.writeObject(data);
                 logger.debug("Persisted resource list.");
             } finally {

Modified: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/RegisteredResourceImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/RegisteredResourceImpl.java?rev=1054571&r1=1054570&r2=1054571&view=diff
==============================================================================
--- sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/RegisteredResourceImpl.java (original)
+++ sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/RegisteredResourceImpl.java Mon Jan  3 10:14:32 2011
@@ -56,34 +56,91 @@ import org.osgi.service.cm.Configuration
 public class RegisteredResourceImpl
     implements RegisteredResource, Serializable {
 
+    /** Use own serial version ID as we control serialization. */
     private static final long serialVersionUID = 6L;
 
+    /** Serialization version. */
+    private static final int VERSION = 1;
+
     /** The resource url. */
     private final String url;
+
     /** The installer scheme. */
 	private final String urlScheme;
+
 	/** The digest for the resource. */
 	private final String digest;
+
 	/** The entity id. */
 	private final String entity;
+
 	/** The dictionary for configurations. */
 	private final Dictionary<String, Object> dictionary;
+
 	/** Additional attributes. */
 	private final Map<String, Object> attributes = new HashMap<String, Object>();
+
 	private final File dataFile;
-	private final int priority;
 
-	/** Serial number to create unique file names in the data storage. */
-	private static long serialNumberCounter = System.currentTimeMillis();
+	private final int priority;
 
     private final String resourceType;
 
+    /** The current state of this resource. */
     private State state = State.INSTALL;
 
+    /** Serial number to create unique file names in the data storage. */
+    private static long serialNumberCounter = System.currentTimeMillis();
+
     /** Temporary attributes. */
     private transient Map<String, Object> temporaryAttributes;
 
     /**
+     * Serialize the object
+     * - write version id
+     * - serialize each entry in the resources list
+     * @param out Object output stream
+     * @throws IOException
+     */
+    private void writeObject(final java.io.ObjectOutputStream out)
+    throws IOException {
+        out.writeInt(VERSION);
+        out.writeObject(url);
+        out.writeObject(urlScheme);
+        out.writeObject(digest);
+        out.writeObject(entity);
+        out.writeObject(dictionary);
+        out.writeObject(attributes);
+        out.writeObject(dataFile);
+        out.writeObject(resourceType);
+        out.writeInt(priority);
+        out.writeObject(state);
+    }
+
+    /**
+     * Deserialize the object
+     * - read version id
+     * - deserialize each entry in the resources list
+     */
+    private void readObject(final java.io.ObjectInputStream in)
+    throws IOException, ClassNotFoundException {
+        final int version = in.readInt();
+        if ( version != VERSION ) {
+            throw new ClassNotFoundException(this.getClass().getName());
+        }
+        Util.setField(this, "url", in.readObject());
+        Util.setField(this, "urlScheme", in.readObject());
+        Util.setField(this, "digest", in.readObject());
+        Util.setField(this, "entity", in.readObject());
+        Util.setField(this, "dictionary", in.readObject());
+        Util.setField(this, "attributes", in.readObject());
+        Util.setField(this, "dataFile", in.readObject());
+        Util.setField(this, "resourceType", in.readObject());
+        Util.setField(this, "priority", in.readInt());
+        this.state = (State) in.readObject();
+    }
+
+    /**
      * Try to create a registered resource.
      */
     public static RegisteredResourceImpl create(final BundleContext ctx,
@@ -243,7 +300,7 @@ public class RegisteredResourceImpl
 	    if (this.dataFile != null && this.dataFile.exists() ) {
 	        return new BufferedInputStream(new FileInputStream(this.dataFile));
 	    }
-        return  null;
+        return null;
 	}
 
 	/**
@@ -402,17 +459,14 @@ public class RegisteredResourceImpl
         if ( ! (obj instanceof RegisteredResource) ) {
             return false;
         }
-        if ( compareTo((RegisteredResource)obj) != 0 ) {
-            return false;
-        }
-        return this.getURL().equals(((RegisteredResource)obj).getURL());
+        return compareTo((RegisteredResource)obj) == 0;
     }
 
     /**
      * @see java.lang.Object#hashCode()
      */
     public int hashCode() {
-        return this.entity.hashCode();
+        return this.getURL().hashCode();
     }
 
     /**
@@ -445,6 +499,9 @@ public class RegisteredResourceImpl
                 }
             }
         }
+        if ( result == 0 ) {
+            result = a.getURL().compareTo(b.getURL());
+        }
         return result;
     }
 

Added: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/Util.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/Util.java?rev=1054571&view=auto
==============================================================================
--- sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/Util.java (added)
+++ sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/Util.java Mon Jan  3 10:14:32 2011
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.installer.core.impl;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+
+public class Util {
+
+    /** Set a (final) field during deserialization. */
+    public static void setField(final Object obj, final String name, final Object value)
+    throws IOException {
+        try {
+            final Field field = obj.getClass().getDeclaredField(name);
+            if ( field == null ) {
+                throw new IOException("Field " + name + " not found in class " + obj.getClass());
+            }
+            field.setAccessible(true);
+            field.set(obj, value);
+        } catch (final SecurityException e) {
+            throw (IOException)new IOException().initCause(e);
+        } catch (final NoSuchFieldException e) {
+            throw (IOException)new IOException().initCause(e);
+        } catch (final IllegalArgumentException e) {
+            throw (IOException)new IOException().initCause(e);
+        } catch (final IllegalAccessException e) {
+            throw (IOException)new IOException().initCause(e);
+        }
+    }
+}

Propchange: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/Util.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/Util.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Propchange: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/Util.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain