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