From: shadowislord Date: Sat, 25 Jun 2011 23:49:18 +0000 (+0000) Subject: * XMLImporter can now read version numbers from XML J3O X-Git-Tag: v0.8.0~844 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=028aa7bd13d4207c9e8e0a89244f8645a3fb7b0a;p=mikumikustudio%2FMikuMikuStudio.git * XMLImporter can now read version numbers from XML J3O git-svn-id: http://jmonkeyengine.googlecode.com/svn/trunk@7736 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- diff --git a/engine/src/core-plugins/com/jme3/export/binary/BinaryInputCapsule.java b/engine/src/core-plugins/com/jme3/export/binary/BinaryInputCapsule.java index a7e0e2e06..b0b66efaa 100644 --- a/engine/src/core-plugins/com/jme3/export/binary/BinaryInputCapsule.java +++ b/engine/src/core-plugins/com/jme3/export/binary/BinaryInputCapsule.java @@ -34,6 +34,7 @@ package com.jme3.export.binary; import com.jme3.export.InputCapsule; import com.jme3.export.Savable; +import com.jme3.export.SavableClassUtil; import com.jme3.util.BufferUtils; import com.jme3.util.IntMap; import java.io.IOException; @@ -258,23 +259,8 @@ final class BinaryInputCapsule implements InputCapsule { } public int getSavableVersion(Class desiredClass){ - Class thisClass = savable.getClass(); - int count = 0; - while (thisClass != null && thisClass != desiredClass){ - thisClass = thisClass.getSuperclass(); - count ++; - } - if (thisClass == null){ - throw new IllegalArgumentException(savable.getClass().getName() + - " does not extend " + - desiredClass.getName() + "!"); - }else if (count > cObj.classHierarchyVersions.length){ - throw new IllegalArgumentException(savable.getClass().getName() + - " cannot access version of " + - desiredClass.getName() + - " because it doesn't implement Savable"); - } - return cObj.classHierarchyVersions[count]; + return SavableClassUtil.getSavedSavableVersion(savable, desiredClass, + cObj.classHierarchyVersions); } public BitSet readBitSet(String name, BitSet defVal) throws IOException { diff --git a/engine/src/core/com/jme3/export/SavableClassUtil.java b/engine/src/core/com/jme3/export/SavableClassUtil.java index a4c9c960c..6b29dafa9 100644 --- a/engine/src/core/com/jme3/export/SavableClassUtil.java +++ b/engine/src/core/com/jme3/export/SavableClassUtil.java @@ -124,6 +124,26 @@ public class SavableClassUtil { } } + public static int getSavedSavableVersion(Object savable, Class desiredClass, int[] versions){ + Class thisClass = savable.getClass(); + int count = 0; + while (thisClass != null && thisClass != desiredClass){ + thisClass = thisClass.getSuperclass(); + count ++; + } + if (thisClass == null){ + throw new IllegalArgumentException(savable.getClass().getName() + + " does not extend " + + desiredClass.getName() + "!"); + }else if (count > versions.length){ + throw new IllegalArgumentException(savable.getClass().getName() + + " cannot access version of " + + desiredClass.getName() + + " because it doesn't implement Savable"); + } + return versions[count]; + } + /** * fromName creates a new Savable from the provided class name. First registered modules * are checked to handle special cases, if the modules do not handle the class name, the diff --git a/engine/src/xml/com/jme3/export/xml/DOMInputCapsule.java b/engine/src/xml/com/jme3/export/xml/DOMInputCapsule.java index 97e9fdf9f..03678aaf8 100644 --- a/engine/src/xml/com/jme3/export/xml/DOMInputCapsule.java +++ b/engine/src/xml/com/jme3/export/xml/DOMInputCapsule.java @@ -71,6 +71,9 @@ public class DOMInputCapsule implements InputCapsule { private XMLImporter importer; private boolean isAtRoot = true; private Map referencedSavables = new HashMap(); + + private int[] classHierarchyVersions; + private Savable savable; public DOMInputCapsule(Document doc, XMLImporter importer) { this.doc = doc; @@ -78,8 +81,13 @@ public class DOMInputCapsule implements InputCapsule { currentElem = doc.getDocumentElement(); } - public int getSavableVersion(Class clazz) { - return 0; // TODO: figure this out ... + public int getSavableVersion(Class desiredClass) { + if (classHierarchyVersions != null){ + return SavableClassUtil.getSavedSavableVersion(savable, desiredClass, + classHierarchyVersions); + }else{ + return 0; + } } private static String decodeString(String s) { @@ -978,10 +986,25 @@ public class DOMInputCapsule implements InputCapsule { className = currentElem.getAttribute("class"); } tmp = SavableClassUtil.fromName(className, null); + + + String versionsStr = currentElem.getAttribute("savable_versions"); + if (versionsStr != null && !versionsStr.equals("")){ + String[] versionStr = versionsStr.split(","); + classHierarchyVersions = new int[versionStr.length]; + for (int i = 0; i < classHierarchyVersions.length; i++){ + classHierarchyVersions[i] = Integer.parseInt(versionStr[i].trim()); + } + }else{ + classHierarchyVersions = null; + } + String refID = currentElem.getAttribute("reference_ID"); if (refID.length() < 1) refID = currentElem.getAttribute("id"); if (refID.length() > 0) referencedSavables.put(refID, tmp); if (tmp != null) { + // Allows reading versions from this savable + savable = tmp; tmp.read(importer); ret = tmp; } diff --git a/engine/src/xml/com/jme3/export/xml/DOMOutputCapsule.java b/engine/src/xml/com/jme3/export/xml/DOMOutputCapsule.java index 20ff3eb9d..a4eddecca 100644 --- a/engine/src/xml/com/jme3/export/xml/DOMOutputCapsule.java +++ b/engine/src/xml/com/jme3/export/xml/DOMOutputCapsule.java @@ -495,7 +495,7 @@ public class DOMOutputCapsule implements OutputCapsule { sb.append(", "); } } - el.setAttribute("savable_version", sb.toString()); + el.setAttribute("savable_versions", sb.toString()); writtenSavables.put(object, el); object.write(exporter);