1 /* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ 2 3 using System; 4 using System.Collections; 5 using Db4objects.Db4o.Internal.Convert; 6 using Db4objects.Db4o.Internal.Convert.Conversions; 7 8 namespace Db4objects.Db4o.Internal.Convert 9 { 10 /// <exclude></exclude> 11 public class Converter 12 { 13 public const int Version = VersionNumberToCommitTimestamp_8_0.Version; 14 Convert(ConversionStage stage)15 public static bool Convert(ConversionStage stage) 16 { 17 if (!NeedsConversion(stage.ConverterVersion())) 18 { 19 return false; 20 } 21 return Instance().RunConversions(stage); 22 } 23 24 private static Db4objects.Db4o.Internal.Convert.Converter _instance; 25 26 private IDictionary _conversions; 27 28 private int _minimumVersion = int.MaxValue; 29 Converter()30 private Converter() 31 { 32 _conversions = new Hashtable(); 33 // TODO: There probably will be Java and .NET conversions 34 // Create Platform4.registerConversions() method ann 35 // call from here when needed. 36 CommonConversions.Register(this); 37 } 38 Instance()39 public static Db4objects.Db4o.Internal.Convert.Converter Instance() 40 { 41 if (_instance == null) 42 { 43 _instance = new Db4objects.Db4o.Internal.Convert.Converter(); 44 } 45 return _instance; 46 } 47 ConversionFor(int version)48 public virtual Conversion ConversionFor(int version) 49 { 50 return ((Conversion)_conversions[version]); 51 } 52 NeedsConversion(int converterVersion)53 private static bool NeedsConversion(int converterVersion) 54 { 55 return converterVersion < Version; 56 } 57 Register(int introducedVersion, Conversion conversion)58 public virtual void Register(int introducedVersion, Conversion conversion) 59 { 60 if (_conversions.Contains(introducedVersion)) 61 { 62 throw new InvalidOperationException(); 63 } 64 if (introducedVersion < _minimumVersion) 65 { 66 _minimumVersion = introducedVersion; 67 } 68 _conversions[introducedVersion] = conversion; 69 } 70 RunConversions(ConversionStage stage)71 public virtual bool RunConversions(ConversionStage stage) 72 { 73 int startingVersion = Math.Max(stage.ConverterVersion() + 1, _minimumVersion); 74 for (int version = startingVersion; version <= Version; version++) 75 { 76 Conversion conversion = ConversionFor(version); 77 if (conversion == null) 78 { 79 throw new InvalidOperationException("Could not find a conversion for version " + 80 version); 81 } 82 stage.Accept(conversion); 83 } 84 return true; 85 } 86 } 87 } 88