aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/World/Land
diff options
context:
space:
mode:
authorMelanie2011-03-27 21:41:54 +0100
committerMelanie2011-03-27 21:41:54 +0100
commita62b435a396a5837fd1e26ac905520f895d8610a (patch)
tree743b8cb91fa101ce461b2fc8ebf7078165e3c7d1 /OpenSim/Region/CoreModules/World/Land
parentUpgrade terse to full update on root rotation change. Not entirely sure why, ... (diff)
parentMerge branch 'master' of melanie@opensimulator.org:/var/git/opensim (diff)
downloadopensim-SC-a62b435a396a5837fd1e26ac905520f895d8610a.zip
opensim-SC-a62b435a396a5837fd1e26ac905520f895d8610a.tar.gz
opensim-SC-a62b435a396a5837fd1e26ac905520f895d8610a.tar.bz2
opensim-SC-a62b435a396a5837fd1e26ac905520f895d8610a.tar.xz
Merge branch 'master' into careminster-presence-refactor
Diffstat (limited to 'OpenSim/Region/CoreModules/World/Land')
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs45
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandObject.cs4
-rw-r--r--OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs61
-rw-r--r--OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs131
4 files changed, 217 insertions, 24 deletions
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
index ad75ea5..50040ff 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
@@ -72,6 +72,7 @@ namespace OpenSim.Region.CoreModules.World.Land
72 protected Commander m_commander = new Commander("land"); 72 protected Commander m_commander = new Commander("land");
73 73
74 protected IUserManagement m_userManager; 74 protected IUserManagement m_userManager;
75 protected IPrimCountModule m_primCountModule;
75 76
76 // Minimum for parcels to work is 64m even if we don't actually use them. 77 // Minimum for parcels to work is 64m even if we don't actually use them.
77 #pragma warning disable 0429 78 #pragma warning disable 0429
@@ -153,6 +154,7 @@ namespace OpenSim.Region.CoreModules.World.Land
153 public void RegionLoaded(Scene scene) 154 public void RegionLoaded(Scene scene)
154 { 155 {
155 m_userManager = m_scene.RequestModuleInterface<IUserManagement>(); 156 m_userManager = m_scene.RequestModuleInterface<IUserManagement>();
157 m_primCountModule = m_scene.RequestModuleInterface<IPrimCountModule>();
156 } 158 }
157 159
158 public void RemoveRegion(Scene scene) 160 public void RemoveRegion(Scene scene)
@@ -275,10 +277,14 @@ namespace OpenSim.Region.CoreModules.World.Land
275 /// <returns>The parcel created.</returns> 277 /// <returns>The parcel created.</returns>
276 protected ILandObject CreateDefaultParcel() 278 protected ILandObject CreateDefaultParcel()
277 { 279 {
278 ILandObject fullSimParcel = new LandObject(UUID.Zero, false, m_scene); 280// m_log.DebugFormat(
281// "[LAND MANAGEMENT MODULE]: Creating default parcel for region {0}", m_scene.RegionInfo.RegionName);
282
283 ILandObject fullSimParcel = new LandObject(UUID.Zero, false, m_scene);
279 fullSimParcel.SetLandBitmap(fullSimParcel.GetSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize)); 284 fullSimParcel.SetLandBitmap(fullSimParcel.GetSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize));
280 fullSimParcel.LandData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; 285 fullSimParcel.LandData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
281 fullSimParcel.LandData.ClaimDate = Util.UnixTimeSinceEpoch(); 286 fullSimParcel.LandData.ClaimDate = Util.UnixTimeSinceEpoch();
287
282 return AddLandObject(fullSimParcel); 288 return AddLandObject(fullSimParcel);
283 } 289 }
284 290
@@ -496,7 +502,7 @@ namespace OpenSim.Region.CoreModules.World.Land
496 } 502 }
497 else 503 else
498 { 504 {
499 m_log.WarnFormat("[LAND]: Invalid local land ID {0}", landLocalID); 505 m_log.WarnFormat("[LAND MANAGEMENT MODULE]: Invalid local land ID {0}", landLocalID);
500 } 506 }
501 } 507 }
502 508
@@ -507,6 +513,11 @@ namespace OpenSim.Region.CoreModules.World.Land
507 public ILandObject AddLandObject(ILandObject land) 513 public ILandObject AddLandObject(ILandObject land)
508 { 514 {
509 ILandObject new_land = land.Copy(); 515 ILandObject new_land = land.Copy();
516
517 // Only now can we add the prim counts to the land object - we rely on the global ID which is generated
518 // as a random UUID inside LandData initialization
519 if (m_primCountModule != null)
520 new_land.PrimCounts = m_primCountModule.GetPrimCounts(new_land.LandData.GlobalID);
510 521
511 lock (m_landList) 522 lock (m_landList)
512 { 523 {
@@ -547,7 +558,7 @@ namespace OpenSim.Region.CoreModules.World.Land
547 { 558 {
548 if (m_landIDList[x, y] == local_id) 559 if (m_landIDList[x, y] == local_id)
549 { 560 {
550 m_log.WarnFormat("[LAND]: Not removing land object {0}; still being used at {1}, {2}", 561 m_log.WarnFormat("[LAND MANAGEMENT MODULE]: Not removing land object {0}; still being used at {1}, {2}",
551 local_id, x, y); 562 local_id, x, y);
552 return; 563 return;
553 //throw new Exception("Could not remove land object. Still being used at " + x + ", " + y); 564 //throw new Exception("Could not remove land object. Still being used at " + x + ", " + y);
@@ -768,6 +779,10 @@ namespace OpenSim.Region.CoreModules.World.Land
768 779
769 public void EventManagerOnParcelPrimCountUpdate() 780 public void EventManagerOnParcelPrimCountUpdate()
770 { 781 {
782// m_log.DebugFormat(
783// "[LAND MANAGEMENT MODULE]: Triggered EventManagerOnParcelPrimCountUpdate() for {0}",
784// m_scene.RegionInfo.RegionName);
785
771 ResetAllLandPrimCounts(); 786 ResetAllLandPrimCounts();
772 EntityBase[] entities = m_scene.Entities.GetEntities(); 787 EntityBase[] entities = m_scene.Entities.GetEntities();
773 foreach (EntityBase obj in entities) 788 foreach (EntityBase obj in entities)
@@ -1119,7 +1134,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1119 } 1134 }
1120 else 1135 else
1121 { 1136 {
1122 m_log.WarnFormat("[PARCEL]: Invalid land object {0} passed for parcel object owner request", local_id); 1137 m_log.WarnFormat("[LAND MANAGEMENT MODULE]: Invalid land object {0} passed for parcel object owner request", local_id);
1123 } 1138 }
1124 } 1139 }
1125 1140
@@ -1295,7 +1310,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1295 1310
1296 ILandObject new_land = new LandObject(data.OwnerID, data.IsGroupOwned, m_scene); 1311 ILandObject new_land = new LandObject(data.OwnerID, data.IsGroupOwned, m_scene);
1297 new_land.LandData = data.Copy(); 1312 new_land.LandData = data.Copy();
1298 new_land.SetLandBitmapFromByteArray(); 1313 new_land.SetLandBitmapFromByteArray();
1299 AddLandObject(new_land); 1314 AddLandObject(new_land);
1300 new_land.SendLandUpdateToAvatarsOverMe(); 1315 new_land.SendLandUpdateToAvatarsOverMe();
1301 } 1316 }
@@ -1361,7 +1376,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1361 { 1376 {
1362 IClientAPI client; 1377 IClientAPI client;
1363 if (! m_scene.TryGetClient(agentID, out client)) { 1378 if (! m_scene.TryGetClient(agentID, out client)) {
1364 m_log.WarnFormat("[LAND] unable to retrieve IClientAPI for {0}", agentID.ToString()); 1379 m_log.WarnFormat("[LAND MANAGEMENT MODULE]: Unable to retrieve IClientAPI for {0}", agentID);
1365 return LLSDHelpers.SerialiseLLSDReply(new LLSDEmpty()); 1380 return LLSDHelpers.SerialiseLLSDReply(new LLSDEmpty());
1366 } 1381 }
1367 1382
@@ -1410,7 +1425,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1410 } 1425 }
1411 else 1426 else
1412 { 1427 {
1413 m_log.WarnFormat("[LAND] unable to find parcelID {0}", parcelID); 1428 m_log.WarnFormat("[LAND MANAGEMENT MODULE]: Unable to find parcelID {0}", parcelID);
1414 } 1429 }
1415 return LLSDHelpers.SerialiseLLSDReply(new LLSDEmpty()); 1430 return LLSDHelpers.SerialiseLLSDReply(new LLSDEmpty());
1416 } 1431 }
@@ -1468,17 +1483,17 @@ namespace OpenSim.Region.CoreModules.World.Land
1468 } 1483 }
1469 catch (LLSD.LLSDParseException e) 1484 catch (LLSD.LLSDParseException e)
1470 { 1485 {
1471 m_log.ErrorFormat("[LAND] Fetch error: {0}", e.Message); 1486 m_log.ErrorFormat("[LAND MANAGEMENT MODULE]: Fetch error: {0}", e.Message);
1472 m_log.ErrorFormat("[LAND] ... in request {0}", request); 1487 m_log.ErrorFormat("[LAND MANAGEMENT MODULE]: ... in request {0}", request);
1473 } 1488 }
1474 catch(InvalidCastException) 1489 catch (InvalidCastException)
1475 { 1490 {
1476 m_log.ErrorFormat("[LAND] Wrong type in request {0}", request); 1491 m_log.ErrorFormat("[LAND MANAGEMENT MODULE]: Wrong type in request {0}", request);
1477 } 1492 }
1478 1493
1479 LLSDRemoteParcelResponse response = new LLSDRemoteParcelResponse(); 1494 LLSDRemoteParcelResponse response = new LLSDRemoteParcelResponse();
1480 response.parcel_id = parcelID; 1495 response.parcel_id = parcelID;
1481 m_log.DebugFormat("[LAND] got parcelID {0}", parcelID); 1496 m_log.DebugFormat("[LAND MANAGEMENT MODULE]: Got parcelID {0}", parcelID);
1482 1497
1483 return LLSDHelpers.SerialiseLLSDReply(response); 1498 return LLSDHelpers.SerialiseLLSDReply(response);
1484 } 1499 }
@@ -1499,7 +1514,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1499 ExtendedLandData extLandData = new ExtendedLandData(); 1514 ExtendedLandData extLandData = new ExtendedLandData();
1500 Util.ParseFakeParcelID(parcel, out extLandData.RegionHandle, 1515 Util.ParseFakeParcelID(parcel, out extLandData.RegionHandle,
1501 out extLandData.X, out extLandData.Y); 1516 out extLandData.X, out extLandData.Y);
1502 m_log.DebugFormat("[LAND] got parcelinfo request for regionHandle {0}, x/y {1}/{2}", 1517 m_log.DebugFormat("[LAND MANAGEMENT MODULE]: Got parcelinfo request for regionHandle {0}, x/y {1}/{2}",
1503 extLandData.RegionHandle, extLandData.X, extLandData.Y); 1518 extLandData.RegionHandle, extLandData.X, extLandData.Y);
1504 1519
1505 // for this region or for somewhere else? 1520 // for this region or for somewhere else?
@@ -1540,7 +1555,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1540 info = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y); 1555 info = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y);
1541 } 1556 }
1542 // we need to transfer the fake parcelID, not the one in landData, so the viewer can match it to the landmark. 1557 // we need to transfer the fake parcelID, not the one in landData, so the viewer can match it to the landmark.
1543 m_log.DebugFormat("[LAND] got parcelinfo for parcel {0} in region {1}; sending...", 1558 m_log.DebugFormat("[LAND MANAGEMENT MODULE]: got parcelinfo for parcel {0} in region {1}; sending...",
1544 data.LandData.Name, data.RegionHandle); 1559 data.LandData.Name, data.RegionHandle);
1545 // HACK for now 1560 // HACK for now
1546 RegionInfo r = new RegionInfo(); 1561 RegionInfo r = new RegionInfo();
@@ -1551,7 +1566,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1551 remoteClient.SendParcelInfo(r, data.LandData, parcelID, data.X, data.Y); 1566 remoteClient.SendParcelInfo(r, data.LandData, parcelID, data.X, data.Y);
1552 } 1567 }
1553 else 1568 else
1554 m_log.Debug("[LAND] got no parcelinfo; not sending"); 1569 m_log.Debug("[LAND MANAGEMENT MODULE]: got no parcelinfo; not sending");
1555 } 1570 }
1556 1571
1557 public void setParcelOtherCleanTime(IClientAPI remoteClient, int localID, int otherCleanTime) 1572 public void setParcelOtherCleanTime(IClientAPI remoteClient, int localID, int otherCleanTime)
diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
index b114db1..1e824bd 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
@@ -51,7 +51,7 @@ namespace OpenSim.Region.CoreModules.World.Land
51 51
52 private int m_lastSeqId = 0; 52 private int m_lastSeqId = 0;
53 53
54 protected LandData m_landData = new LandData(); 54 protected LandData m_landData = new LandData();
55 protected Scene m_scene; 55 protected Scene m_scene;
56 protected List<SceneObjectGroup> primsOverMe = new List<SceneObjectGroup>(); 56 protected List<SceneObjectGroup> primsOverMe = new List<SceneObjectGroup>();
57 protected Dictionary<uint, UUID> m_listTransactions = new Dictionary<uint, UUID>(); 57 protected Dictionary<uint, UUID> m_listTransactions = new Dictionary<uint, UUID>();
@@ -79,6 +79,8 @@ namespace OpenSim.Region.CoreModules.World.Land
79 79
80 set { m_landData = value; } 80 set { m_landData = value; }
81 } 81 }
82
83 public IPrimCounts PrimCounts { get; set; }
82 84
83 public UUID RegionUUID 85 public UUID RegionUUID
84 { 86 {
diff --git a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs
index 2d1979f..62fd2b0 100644
--- a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs
@@ -51,8 +51,8 @@ namespace OpenSim.Region.CoreModules.World.Land
51 51
52 public class PrimCountModule : IPrimCountModule, INonSharedRegionModule 52 public class PrimCountModule : IPrimCountModule, INonSharedRegionModule
53 { 53 {
54 private static readonly ILog m_log = 54// private static readonly ILog m_log =
55 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 55// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
56 56
57 private Scene m_Scene; 57 private Scene m_Scene;
58 private Dictionary<UUID, PrimCounts> m_PrimCounts = 58 private Dictionary<UUID, PrimCounts> m_PrimCounts =
@@ -64,10 +64,16 @@ namespace OpenSim.Region.CoreModules.World.Land
64 private Dictionary<UUID, ParcelCounts> m_ParcelCounts = 64 private Dictionary<UUID, ParcelCounts> m_ParcelCounts =
65 new Dictionary<UUID, ParcelCounts>(); 65 new Dictionary<UUID, ParcelCounts>();
66 66
67 // For now, a simple simwide taint to get this up. Later parcel based 67
68 // taint to allow recounting a parcel if only ownership has changed 68 /// <value>
69 // without recounting the whole sim. 69 /// For now, a simple simwide taint to get this up. Later parcel based
70 /// taint to allow recounting a parcel if only ownership has changed
71 /// without recounting the whole sim.
72 ///
73 /// We start out tainted so that the first get call resets the various prim counts.
74 /// <value>
70 private bool m_Tainted = true; 75 private bool m_Tainted = true;
76
71 private Object m_TaintLock = new Object(); 77 private Object m_TaintLock = new Object();
72 78
73 public Type ReplaceableInterface 79 public Type ReplaceableInterface
@@ -82,9 +88,10 @@ namespace OpenSim.Region.CoreModules.World.Land
82 public void AddRegion(Scene scene) 88 public void AddRegion(Scene scene)
83 { 89 {
84 m_Scene = scene; 90 m_Scene = scene;
91
92 m_Scene.RegisterModuleInterface<IPrimCountModule>(this);
85 93
86 m_Scene.EventManager.OnParcelPrimCountAdd += 94 m_Scene.EventManager.OnObjectAddedToScene += OnParcelPrimCountAdd;
87 OnParcelPrimCountAdd;
88 m_Scene.EventManager.OnObjectBeingRemovedFromScene += 95 m_Scene.EventManager.OnObjectBeingRemovedFromScene +=
89 OnObjectBeingRemovedFromScene; 96 OnObjectBeingRemovedFromScene;
90 m_Scene.EventManager.OnParcelPrimCountTainted += 97 m_Scene.EventManager.OnParcelPrimCountTainted +=
@@ -156,6 +163,8 @@ namespace OpenSim.Region.CoreModules.World.Land
156 // NOTE: Call under Taint Lock 163 // NOTE: Call under Taint Lock
157 private void AddObject(SceneObjectGroup obj) 164 private void AddObject(SceneObjectGroup obj)
158 { 165 {
166// m_log.DebugFormat("[PRIM COUNT MODULE]: Adding object {0} to prim count", obj.Name);
167
159 if (obj.IsAttachment) 168 if (obj.IsAttachment)
160 return; 169 return;
161 if (((obj.RootPart.Flags & PrimFlags.TemporaryOnRez) != 0)) 170 if (((obj.RootPart.Flags & PrimFlags.TemporaryOnRez) != 0))
@@ -164,6 +173,10 @@ namespace OpenSim.Region.CoreModules.World.Land
164 Vector3 pos = obj.AbsolutePosition; 173 Vector3 pos = obj.AbsolutePosition;
165 ILandObject landObject = m_Scene.LandChannel.GetLandObject(pos.X, pos.Y); 174 ILandObject landObject = m_Scene.LandChannel.GetLandObject(pos.X, pos.Y);
166 LandData landData = landObject.LandData; 175 LandData landData = landObject.LandData;
176
177// m_log.DebugFormat(
178// "[PRIM COUNT MODULE]: Object {0} is owned by {1} over land owned by {2}",
179// obj.Name, obj.OwnerID, landData.OwnerID);
167 180
168 ParcelCounts parcelCounts; 181 ParcelCounts parcelCounts;
169 if (m_ParcelCounts.TryGetValue(landData.GlobalID, out parcelCounts)) 182 if (m_ParcelCounts.TryGetValue(landData.GlobalID, out parcelCounts))
@@ -218,8 +231,16 @@ namespace OpenSim.Region.CoreModules.World.Land
218 return primCounts; 231 return primCounts;
219 } 232 }
220 233
234
235 /// <summary>
236 /// Get the number of prims on the parcel that are owned by the parcel owner.
237 /// </summary>
238 /// <param name="parcelID"></param>
239 /// <returns></returns>
221 public int GetOwnerCount(UUID parcelID) 240 public int GetOwnerCount(UUID parcelID)
222 { 241 {
242// m_log.DebugFormat("[PRIM COUNT MODULE]: GetOwnerCount for {0}", parcelID);
243
223 lock (m_TaintLock) 244 lock (m_TaintLock)
224 { 245 {
225 if (m_Tainted) 246 if (m_Tainted)
@@ -232,6 +253,11 @@ namespace OpenSim.Region.CoreModules.World.Land
232 return 0; 253 return 0;
233 } 254 }
234 255
256 /// <summary>
257 /// Get the number of prims on the parcel that have been set to the group that owns the parcel.
258 /// </summary>
259 /// <param name="parcelID"></param>
260 /// <returns></returns>
235 public int GetGroupCount(UUID parcelID) 261 public int GetGroupCount(UUID parcelID)
236 { 262 {
237 lock (m_TaintLock) 263 lock (m_TaintLock)
@@ -246,6 +272,11 @@ namespace OpenSim.Region.CoreModules.World.Land
246 return 0; 272 return 0;
247 } 273 }
248 274
275 /// <summary>
276 /// Get the number of prims on the parcel that are not owned by the parcel owner or set to the parcel group.
277 /// </summary>
278 /// <param name="parcelID"></param>
279 /// <returns></returns>
249 public int GetOthersCount(UUID parcelID) 280 public int GetOthersCount(UUID parcelID)
250 { 281 {
251 lock (m_TaintLock) 282 lock (m_TaintLock)
@@ -260,6 +291,11 @@ namespace OpenSim.Region.CoreModules.World.Land
260 return 0; 291 return 0;
261 } 292 }
262 293
294 /// <summary>
295 /// Get the number of prims that are in the entire simulator for the owner of this parcel.
296 /// </summary>
297 /// <param name="parcelID"></param>
298 /// <returns></returns>
263 public int GetSimulatorCount(UUID parcelID) 299 public int GetSimulatorCount(UUID parcelID)
264 { 300 {
265 lock (m_TaintLock) 301 lock (m_TaintLock)
@@ -278,6 +314,12 @@ namespace OpenSim.Region.CoreModules.World.Land
278 return 0; 314 return 0;
279 } 315 }
280 316
317 /// <summary>
318 /// Get the number of prims that a particular user owns on this parcel.
319 /// </summary>
320 /// <param name="parcelID"></param>
321 /// <param name="userID"></param>
322 /// <returns></returns>
281 public int GetUserCount(UUID parcelID, UUID userID) 323 public int GetUserCount(UUID parcelID, UUID userID)
282 { 324 {
283 lock (m_TaintLock) 325 lock (m_TaintLock)
@@ -299,18 +341,21 @@ namespace OpenSim.Region.CoreModules.World.Land
299 // NOTE: This method MUST be called while holding the taint lock! 341 // NOTE: This method MUST be called while holding the taint lock!
300 private void Recount() 342 private void Recount()
301 { 343 {
344// m_log.DebugFormat("[PRIM COUNT MODULE]: Recounting prims on {0}", m_Scene.RegionInfo.RegionName);
345
302 m_OwnerMap.Clear(); 346 m_OwnerMap.Clear();
303 m_SimwideCounts.Clear(); 347 m_SimwideCounts.Clear();
304 m_ParcelCounts.Clear(); 348 m_ParcelCounts.Clear();
305 349
306 List<ILandObject> land = m_Scene.LandChannel.AllParcels(); 350 List<ILandObject> land = m_Scene.LandChannel.AllParcels();
307 351
308 foreach (ILandObject l in land) 352 foreach (ILandObject l in land)
309 { 353 {
310 LandData landData = l.LandData; 354 LandData landData = l.LandData;
311 355
312 m_OwnerMap[landData.GlobalID] = landData.OwnerID; 356 m_OwnerMap[landData.GlobalID] = landData.OwnerID;
313 m_SimwideCounts[landData.OwnerID] = 0; 357 m_SimwideCounts[landData.OwnerID] = 0;
358// m_log.DebugFormat("[PRIM COUNT MODULE]: Adding parcel count for {0}", landData.GlobalID);
314 m_ParcelCounts[landData.GlobalID] = new ParcelCounts(); 359 m_ParcelCounts[landData.GlobalID] = new ParcelCounts();
315 } 360 }
316 361
diff --git a/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs b/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs
new file mode 100644
index 0000000..c9d393f
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs
@@ -0,0 +1,131 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Reflection;
31using log4net.Config;
32using NUnit.Framework;
33using OpenMetaverse;
34using OpenMetaverse.Assets;
35using OpenSim.Framework;
36using OpenSim.Region.Framework.Interfaces;
37using OpenSim.Region.Framework.Scenes;
38using OpenSim.Tests.Common;
39using OpenSim.Tests.Common.Mock;
40using OpenSim.Tests.Common.Setup;
41
42namespace OpenSim.Region.CoreModules.World.Land.Tests
43{
44 [TestFixture]
45 public class PrimCountModuleTests
46 {
47 protected UUID m_userId = new UUID("00000000-0000-0000-0000-100000000000");
48 protected UUID m_dummyUserId = new UUID("99999999-9999-9999-9999-999999999999");
49 protected TestScene m_scene;
50 protected PrimCountModule m_pcm;
51 protected ILandObject m_lo;
52
53 [SetUp]
54 public void SetUp()
55 {
56 m_pcm = new PrimCountModule();
57 LandManagementModule lmm = new LandManagementModule();
58 m_scene = SceneSetupHelpers.SetupScene();
59 SceneSetupHelpers.SetupSceneModules(m_scene, lmm, m_pcm);
60
61 ILandObject lo = new LandObject(m_userId, false, m_scene);
62 lo.SetLandBitmap(lo.GetSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize));
63 m_lo = lmm.AddLandObject(lo);
64 //scene.loadAllLandObjectsFromStorage(scene.RegionInfo.originRegionID);
65 }
66
67 /// <summary>
68 /// Test count after a parcel owner owned object is added.
69 /// </summary>
70 [Test]
71 public void TestAddOwnerObject()
72 {
73 TestHelper.InMethod();
74// log4net.Config.XmlConfigurator.Configure();
75
76 IPrimCounts pc = m_lo.PrimCounts;
77
78 Assert.That(pc.Owner, Is.EqualTo(0));
79 Assert.That(pc.Group, Is.EqualTo(0));
80 Assert.That(pc.Others, Is.EqualTo(0));
81 Assert.That(pc.Users[m_userId], Is.EqualTo(0));
82 Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0));
83 Assert.That(pc.Simulator, Is.EqualTo(0));
84
85 SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_userId, 0x01);
86 m_scene.AddNewSceneObject(sog, false);
87
88 Assert.That(pc.Owner, Is.EqualTo(3));
89 Assert.That(pc.Group, Is.EqualTo(0));
90 Assert.That(pc.Others, Is.EqualTo(0));
91 Assert.That(pc.Users[m_userId], Is.EqualTo(3));
92 Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0));
93 Assert.That(pc.Simulator, Is.EqualTo(3));
94
95 // Add a second object and retest
96 SceneObjectGroup sog2 = SceneSetupHelpers.CreateSceneObject(2, m_userId, 0x10);
97 m_scene.AddNewSceneObject(sog2, false);
98
99 Assert.That(pc.Owner, Is.EqualTo(5));
100 Assert.That(pc.Group, Is.EqualTo(0));
101 Assert.That(pc.Others, Is.EqualTo(0));
102 Assert.That(pc.Users[m_userId], Is.EqualTo(5));
103 Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0));
104 Assert.That(pc.Simulator, Is.EqualTo(5));
105 }
106
107 /// <summary>
108 /// Test count after a parcel owner owned object is removed.
109 /// </summary>
110 [Test]
111 public void TestRemoveOwnerObject()
112 {
113 TestHelper.InMethod();
114// log4net.Config.XmlConfigurator.Configure();
115
116 IPrimCounts pc = m_lo.PrimCounts;
117
118 m_scene.AddNewSceneObject(SceneSetupHelpers.CreateSceneObject(1, m_userId, 0x1), false);
119 SceneObjectGroup sogToDelete = SceneSetupHelpers.CreateSceneObject(3, m_userId, 0x10);
120 m_scene.AddNewSceneObject(sogToDelete, false);
121 m_scene.DeleteSceneObject(sogToDelete, false);
122
123 Assert.That(pc.Owner, Is.EqualTo(1));
124 Assert.That(pc.Group, Is.EqualTo(0));
125 Assert.That(pc.Others, Is.EqualTo(0));
126 Assert.That(pc.Users[m_userId], Is.EqualTo(1));
127 Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0));
128 Assert.That(pc.Simulator, Is.EqualTo(1));
129 }
130 }
131} \ No newline at end of file