aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/DataSnapshot/DataSnapshotManager.cs')
-rw-r--r--OpenSim/Region/DataSnapshot/DataSnapshotManager.cs158
1 files changed, 87 insertions, 71 deletions
diff --git a/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs b/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs
index 5540656..9794549 100644
--- a/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs
+++ b/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs
@@ -35,15 +35,20 @@ using System.Xml;
35using log4net; 35using log4net;
36using Nini.Config; 36using Nini.Config;
37using OpenMetaverse; 37using OpenMetaverse;
38using Mono.Addins;
38using OpenSim.Framework; 39using OpenSim.Framework;
39using OpenSim.Framework.Communications; 40using OpenSim.Framework.Communications;
40using OpenSim.Region.DataSnapshot.Interfaces; 41using OpenSim.Region.DataSnapshot.Interfaces;
41using OpenSim.Region.Framework.Interfaces; 42using OpenSim.Region.Framework.Interfaces;
42using OpenSim.Region.Framework.Scenes; 43using OpenSim.Region.Framework.Scenes;
43 44
45[assembly: Addin("DataSnapshot", "0.1")]
46[assembly: AddinDependency("OpenSim", "0.5")]
47
44namespace OpenSim.Region.DataSnapshot 48namespace OpenSim.Region.DataSnapshot
45{ 49{
46 public class DataSnapshotManager : IRegionModule, IDataSnapshot 50 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
51 public class DataSnapshotManager : ISharedRegionModule, IDataSnapshot
47 { 52 {
48 #region Class members 53 #region Class members
49 //Information from config 54 //Information from config
@@ -95,7 +100,7 @@ namespace OpenSim.Region.DataSnapshot
95 100
96 #region IRegionModule 101 #region IRegionModule
97 102
98 public void Initialise(Scene scene, IConfigSource config) 103 public void Initialise(IConfigSource config)
99 { 104 {
100 if (!m_configLoaded) 105 if (!m_configLoaded)
101 { 106 {
@@ -133,82 +138,121 @@ namespace OpenSim.Region.DataSnapshot
133 m_enabled = false; 138 m_enabled = false;
134 return; 139 return;
135 } 140 }
136 }
137 141
138 if (m_enabled) 142 if (m_enabled)
139 { 143 m_snapStore = new SnapshotStore(m_snapsDir, m_gridinfo, m_listener_port, m_hostname);
140 //Hand it the first scene, assuming that all scenes have the same BaseHTTPServer 144 }
141 new DataRequestHandler(scene, this);
142 145
143 m_hostname = scene.RegionInfo.ExternalHostName; 146 }
144 m_snapStore = new SnapshotStore(m_snapsDir, m_gridinfo, m_listener_port, m_hostname);
145 147
146 MakeEverythingStale(); 148 }
147 149
148 if (m_dataServices != "" && m_dataServices != "noservices") 150 public void AddRegion(Scene scene)
149 NotifyDataServices(m_dataServices, "online"); 151 {
150 } 152 if (!m_enabled)
151 } 153 return;
152 154
153 if (m_enabled) 155 m_log.DebugFormat("[DATASNAPSHOT]: Module added to Scene {0}.", scene.RegionInfo.RegionName);
154 {
155 m_log.Info("[DATASNAPSHOT]: Scene added to module.");
156 156
157 m_snapStore.AddScene(scene); 157 m_snapStore.AddScene(scene);
158 m_scenes.Add(scene); 158 m_scenes.Add(scene);
159 159
160 Assembly currentasm = Assembly.GetExecutingAssembly(); 160 Assembly currentasm = Assembly.GetExecutingAssembly();
161 161
162 foreach (Type pluginType in currentasm.GetTypes()) 162 foreach (Type pluginType in currentasm.GetTypes())
163 {
164 if (pluginType.IsPublic)
163 { 165 {
164 if (pluginType.IsPublic) 166 if (!pluginType.IsAbstract)
165 { 167 {
166 if (!pluginType.IsAbstract) 168 if (pluginType.GetInterface("IDataSnapshotProvider") != null)
167 { 169 {
168 if (pluginType.GetInterface("IDataSnapshotProvider") != null) 170 IDataSnapshotProvider module = (IDataSnapshotProvider)Activator.CreateInstance(pluginType);
169 { 171 module.Initialize(scene, this);
170 IDataSnapshotProvider module = (IDataSnapshotProvider)Activator.CreateInstance(pluginType); 172 module.OnStale += MarkDataStale;
171 module.Initialize(scene, this);
172 module.OnStale += MarkDataStale;
173 173
174 m_dataproviders.Add(module); 174 m_dataproviders.Add(module);
175 m_snapStore.AddProvider(module); 175 m_snapStore.AddProvider(module);
176 176
177 m_log.Info("[DATASNAPSHOT]: Added new data provider type: " + pluginType.Name); 177 m_log.Debug("[DATASNAPSHOT]: Added new data provider type: " + pluginType.Name);
178 }
179 } 178 }
180 } 179 }
181 } 180 }
181 }
182 }
183
184 public void RemoveRegion(Scene scene)
185 {
186 if (!m_enabled)
187 return;
188
189 m_log.Info("[DATASNAPSHOT]: Region " + scene.RegionInfo.RegionName + " is being removed, removing from indexing");
190 Scene restartedScene = SceneForUUID(scene.RegionInfo.RegionID);
191
192 m_scenes.Remove(restartedScene);
193 m_snapStore.RemoveScene(restartedScene);
182 194
183 //scene.OnRestart += OnSimRestart; 195 //Getting around the fact that we can't remove objects from a collection we are enumerating over
184 scene.EventManager.OnShutdown += delegate() { OnSimRestart(scene.RegionInfo); }; 196 List<IDataSnapshotProvider> providersToRemove = new List<IDataSnapshotProvider>();
197
198 foreach (IDataSnapshotProvider provider in m_dataproviders)
199 {
200 if (provider.GetParentScene == restartedScene)
201 {
202 providersToRemove.Add(provider);
203 }
185 } 204 }
186 else 205
206 foreach (IDataSnapshotProvider provider in providersToRemove)
187 { 207 {
188 //m_log.Debug("[DATASNAPSHOT]: Data snapshot disabled, not adding scene to module (or anything else)."); 208 m_dataproviders.Remove(provider);
209 m_snapStore.RemoveProvider(provider);
189 } 210 }
211
212 m_snapStore.RemoveScene(restartedScene);
190 } 213 }
191 214
192 public void Close() 215 public void PostInitialise()
193 { 216 {
194 if (m_enabled && m_dataServices != "" && m_dataServices != "noservices") 217 if (!m_enabled)
195 NotifyDataServices(m_dataServices, "offline"); 218 return;
219
220 //Hand it the first scene, assuming that all scenes have the same BaseHTTPServer
221 new DataRequestHandler(m_scenes[0], this);
222
223 m_hostname = m_scenes[0].RegionInfo.ExternalHostName;
224
225 if (m_dataServices != "" && m_dataServices != "noservices")
226 NotifyDataServices(m_dataServices, "online");
196 } 227 }
197 228
229 public void RegionLoaded(Scene scene)
230 {
231 if (!m_enabled)
232 return;
233
234 m_log.DebugFormat("[DATASNAPSHOT]: Marking scene {0} as stale.", scene.RegionInfo.RegionName);
235 m_snapStore.ForceSceneStale(scene);
236 }
198 237
199 public bool IsSharedModule 238 public void Close()
200 { 239 {
201 get { return true; } 240 if (!m_enabled)
241 return;
242
243 if (m_enabled && m_dataServices != "" && m_dataServices != "noservices")
244 NotifyDataServices(m_dataServices, "offline");
202 } 245 }
203 246
247
204 public string Name 248 public string Name
205 { 249 {
206 get { return "External Data Generator"; } 250 get { return "External Data Generator"; }
207 } 251 }
208 252
209 public void PostInitialise() 253 public Type ReplaceableInterface
210 { 254 {
211 255 get { return null; }
212 } 256 }
213 257
214 #endregion 258 #endregion
@@ -399,35 +443,7 @@ namespace OpenSim.Region.DataSnapshot
399 m_snapStore.ForceSceneStale(scene); 443 m_snapStore.ForceSceneStale(scene);
400 } 444 }
401 } 445 }
402
403 #endregion 446 #endregion
404 447
405 public void OnSimRestart(RegionInfo thisRegion)
406 {
407 m_log.Info("[DATASNAPSHOT]: Region " + thisRegion.RegionName + " is restarting, removing from indexing");
408 Scene restartedScene = SceneForUUID(thisRegion.RegionID);
409
410 m_scenes.Remove(restartedScene);
411 m_snapStore.RemoveScene(restartedScene);
412
413 //Getting around the fact that we can't remove objects from a collection we are enumerating over
414 List<IDataSnapshotProvider> providersToRemove = new List<IDataSnapshotProvider>();
415
416 foreach (IDataSnapshotProvider provider in m_dataproviders)
417 {
418 if (provider.GetParentScene == restartedScene)
419 {
420 providersToRemove.Add(provider);
421 }
422 }
423
424 foreach (IDataSnapshotProvider provider in providersToRemove)
425 {
426 m_dataproviders.Remove(provider);
427 m_snapStore.RemoveProvider(provider);
428 }
429
430 m_snapStore.RemoveScene(restartedScene);
431 }
432 } 448 }
433} 449}