Statistics
| Branch: | Revision:

root / trunk / Pithos.Client.WPF / AppBootstrapper.cs @ ac8b664d

History | View | Annotate | Download (5.2 kB)

1
#region
2
/* -----------------------------------------------------------------------
3
 * <copyright file="AppBootstrapper.cs" company="GRNet">
4
 * 
5
 * Copyright 2011-2012 GRNET S.A. All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or
8
 * without modification, are permitted provided that the following
9
 * conditions are met:
10
 *
11
 *   1. Redistributions of source code must retain the above
12
 *      copyright notice, this list of conditions and the following
13
 *      disclaimer.
14
 *
15
 *   2. Redistributions in binary form must reproduce the above
16
 *      copyright notice, this list of conditions and the following
17
 *      disclaimer in the documentation and/or other materials
18
 *      provided with the distribution.
19
 *
20
 *
21
 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
22
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
25
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
 * POSSIBILITY OF SUCH DAMAGE.
33
 *
34
 * The views and conclusions contained in the software and
35
 * documentation are those of the authors and should not be
36
 * interpreted as representing official policies, either expressed
37
 * or implied, of GRNET S.A.
38
 * </copyright>
39
 * -----------------------------------------------------------------------
40
 */
41
#endregion
42
using System.Windows;
43
using System.Windows.Controls;
44
using System.Windows.Navigation;
45
using Caliburn.Micro;
46
using Caliburn.Micro.Logging;
47
using Pithos.Client.WPF.Properties;
48
using Pithos.Core;
49
using Pithos.Network;
50
using Xceed.Wpf.Toolkit;
51
using log4net.Appender;
52
using log4net.Config;
53
using log4net.Filter;
54
using log4net.Layout;
55

    
56
namespace Pithos.Client.WPF
57
{
58
	using System;
59
	using System.Collections.Generic;
60
	using System.ComponentModel.Composition;
61
	using System.ComponentModel.Composition.Hosting;
62
	using System.ComponentModel.Composition.Primitives;
63
	using System.Linq;
64
	using Caliburn.Micro;
65

    
66
	public class AppBootstrapper : Bootstrapper<IShell>
67
	{
68

    
69
		CompositionContainer container;
70

    
71
		public AppBootstrapper()
72
		{
73
			LogManager.GetLog = type => new log4netLogger(type);
74
			UpgradeSettings();
75
		}
76

    
77
		private void UpgradeSettings()
78
		{
79
			if (Settings.Default.MustUpgrade)
80
			{
81
			    Settings.Default.HashingParallelism = (byte) (Environment.ProcessorCount/2);
82
				Settings.Default.Upgrade();
83
				Settings.Default.MustUpgrade = false;
84
				Settings.Default.Save();
85
			}
86
		}
87

    
88
        protected override IEnumerable<System.Reflection.Assembly> SelectAssemblies()
89
        {
90
            var assemblies= base.SelectAssemblies();
91
            return assemblies.Union(new[]
92
                {
93
                    typeof(PithosMonitor).Assembly, 
94
                    typeof(CloudFilesClient).Assembly,
95
                    typeof (OFM.FileManagerViewModel).Assembly
96
                });
97
        }
98

    
99
		/// <summary>
100
		/// By default, we are configured to use MEF
101
		/// </summary>
102
		protected override void Configure() {
103
			var catalog = new AggregateCatalog(
104
				AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()
105
				);
106

    
107
			/*Type[] types = { typeof(PithosMonitor), typeof(CloudFilesClient),typeof(OFM.FileManagerViewModel) };
108
			foreach (var type in types)
109
			{
110
				catalog.Catalogs.Add(new AssemblyCatalog(type.Assembly));
111
			}
112
*/
113
			container = new CompositionContainer(catalog,true);
114

    
115
			var batch = new CompositionBatch();
116

    
117
			batch.AddExportedValue<IWindowManager>(new WindowManager());
118
			batch.AddExportedValue<IEventAggregator>(new EventAggregator());
119
			batch.AddExportedValue(container);
120
			batch.AddExportedValue(catalog);
121

    
122

    
123
			container.Compose(batch);
124
		    
125
			ConventionManager.AddElementConvention<MenuItem>(ItemsControl.ItemsSourceProperty, "DataContext", "Click");
126
			ConventionManager.AddElementConvention<IntegerUpDown>(IntegerUpDown.ValueProperty, "Value", "ValueChanged");
127
		    ConventionManager.AddElementConvention<BusyIndicator>(BusyIndicator.IsBusyProperty, "IsBusy", "DataContextChanged");
128
		}
129

    
130
		protected override object GetInstance(Type serviceType, string key)
131
		{
132
			string contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(serviceType) : key;
133
			var exports = container.GetExportedValues<object>(contract);            
134

    
135
			if (exports.Any())
136
				return exports.First();
137

    
138
			throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract));
139
		}
140

    
141
		protected override IEnumerable<object> GetAllInstances(Type serviceType)
142
		{
143
			return container.GetExportedValues<object>(AttributedModelServices.GetContractName(serviceType));
144
		}
145

    
146
		protected override void BuildUp(object instance)
147
		{
148
			container.SatisfyImportsOnce(instance);
149
		}
150
	}
151
}