[mapguide-commits] r5393 - trunk/MgDev/Server/src/Services/Rendering
svn_mapguide at osgeo.org
svn_mapguide at osgeo.org
Wed Nov 17 20:28:06 EST 2010
Author: hubu
Date: 2010-11-17 17:28:06 -0800 (Wed, 17 Nov 2010)
New Revision: 5393
Modified:
trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp
Log:
On behalf of: Spark Liu
Enhance the error handling so that error in watermark rendering will not affect layer rendering.
Fix ticket 1527.
Modified: trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp
===================================================================
--- trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp 2010-11-16 09:35:34 UTC (rev 5392)
+++ trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp 2010-11-18 01:28:06 UTC (rev 5393)
@@ -943,11 +943,12 @@
}
}
- if (renderWatermark && (behavior & MgRenderingOptions::RenderLayers))
+ if (renderWatermark && (behavior & MgRenderingOptions::RenderLayers) && map->GetWatermarkUsage() != 0)
{
- // Rendering watermark only when rendering layers and not set renderWatermark to false
-
- MgStringCollection watermarkIds; //ID list to load watermark definition
+ // Rendering watermark only when:
+ // 1. rendering layers
+ // 2. not set renderWatermark to false (not render tile)
+ // 3. Map's watermark usage is not 0, which means watermark usage is WMS and / or Viewer.
WatermarkInstanceCollection watermarkInstances; //Watermark list to render
WatermarkInstanceCollection tempWatermarkInstances; //Used to reverse list
auto_ptr<WatermarkInstance> tempInstance;
@@ -970,7 +971,6 @@
|| ((map->GetWatermarkUsage() & MgMap::WMS) != 0
&& (tempInstance->GetUsage() & WatermarkInstance::WMS) == 0))
continue;
-
bool alreadyInList = false;
for (int j=watermarkInstances.GetCount()-1; j >=0; j--)
{
@@ -983,7 +983,6 @@
if (!alreadyInList)
{
- watermarkIds.Add(tempInstance->GetResourceId().c_str());
watermarkInstances.Adopt(tempInstance.release());
}
}
@@ -996,7 +995,7 @@
{
Ptr<MgLayerBase> mapLayer(tempLayers->GetItem(i));
- // the layer resource content should be set during stylization
+ // the layer resource content should be set during stylization if visible
if (mapLayer->GetLayerResourceContent() == L"")
continue;
@@ -1028,44 +1027,92 @@
if (!alreadyInList)
{
- watermarkIds.Add(tempInstance->GetResourceId().c_str());
watermarkInstances.Adopt(tempInstance.release());
}
}
}
assert(tempWatermarkInstances.GetCount() == 0);
- // load watermark source
- if (watermarkIds.GetCount() != 0)
+ MgStringCollection watermarkIds; // ID list of loaded watermark definition
+ MgStringCollection watermarkDefinitions; // Loaded watermark definition
+ MgStringCollection failLoadedIds; // ID list of failed in loading resource
+
+ for (int i=watermarkInstances.GetCount()-1; i>=0; i--)
{
- Ptr<MgStringCollection> wdefs = m_svcResource->GetResourceContents(&watermarkIds, NULL);
- for (int i=watermarkIds.GetCount()-1; i>=0; i--)
+ WatermarkInstance* instance = watermarkInstances.GetAt(i);
+ STRING resourceId = instance->GetResourceId();
+ WatermarkDefinition* wdef = NULL;
+ MG_TRY()
+ for(int j = 0; j < watermarkIds.GetCount(); j++)
+ {
+ if(resourceId == watermarkIds.GetItem(j))
+ {
+ wdef = MgWatermark::GetWatermarkDefinition(watermarkDefinitions.GetItem(j));
+ break;
+ }
+ }
+ if(wdef == NULL)
+ {
+ Ptr<MgResourceIdentifier> resId = new MgResourceIdentifier(resourceId);
+ Ptr<MgByteReader> reader = m_svcResource->GetResourceContent(resId);
+ STRING content = reader->ToString();
+ watermarkIds.Add(resourceId);
+ watermarkDefinitions.Add(content);
+ wdef = MgWatermark::GetWatermarkDefinition(content);
+ }
+ assert(wdef != NULL);
+ if (instance->GetPositionOverride())
+ {
+ wdef->AdoptPosition(instance->OrphanPositionOverride());
+ }
+ if (instance->GetAppearanceOverride())
+ {
+ wdef->AdoptAppearance(instance->OrphanAppearanceOverride());
+ }
+ ds.StylizeWatermark(dr, wdef, drawWidth, drawHeight, saveWidth, saveHeight);
+
+ MG_CATCH(L"MgServerRenderingService.RenderMapInternal")
+ if(mgException.p)
{
- for (int j=watermarkInstances.GetCount()-1; j>=0; j--)
+ // Do not do anything if fail in resource loading and has logged error.
+ bool isExceptionLogged = false;
+ if(wdef == NULL) // Fail in resource loading
+ {
+ for(int i = 0; i < failLoadedIds.GetCount(); i++)
+ {
+ if(resourceId == failLoadedIds.GetItem(i))
+ {
+ isExceptionLogged = true;
+ break;
+ }
+ }
+ }
+ if(!isExceptionLogged)
{
- WatermarkInstance* instance = watermarkInstances.GetAt(j);
- if (instance->GetResourceId() == watermarkIds.GetItem(i))
+ // TODO: Eventually this should be used to indicate visually to the client what
+ // layer failed in addition to logging the error.
+ MgServerManager* serverManager = MgServerManager::GetInstance();
+ STRING locale = (NULL == serverManager)? MgResources::DefaultMessageLocale : serverManager->GetDefaultMessageLocale();
+ MG_LOG_EXCEPTION_ENTRY(mgException->GetExceptionMessage(locale).c_str(), mgException->GetStackTrace(locale).c_str());
+
+#if defined(_DEBUG) || defined(_DEBUG_PNG8)
+ STRING details = mgException->GetDetails(locale);
+
+ wstring err = L"\n %t Error during stylization of watermark:";
+ err += instance->GetName();
+ err += L"\n";
+ err += L"Details: ";
+ err += details;
+ err += L"\n";
+ ACE_DEBUG( (LM_DEBUG, err.c_str()) );
+#endif
+ if(wdef == NULL) // Failed in resource loading
{
- instance->AdoptWatermarkDefinition(MgWatermark::GetWatermarkDefinition(wdefs->GetItem(i)));
+ failLoadedIds.Add(resourceId);
}
}
}
}
-
- for (int i=watermarkInstances.GetCount()-1; i>=0; i--)
- {
- WatermarkInstance* instance = watermarkInstances.GetAt(i);
- WatermarkDefinition* wdef = instance->GetWatermarkDefinition();
- if (instance->GetPositionOverride())
- {
- wdef->AdoptPosition(instance->OrphanPositionOverride());
- }
- if (instance->GetAppearanceOverride())
- {
- wdef->AdoptAppearance(instance->OrphanAppearanceOverride());
- }
- ds.StylizeWatermark(dr, wdef, drawWidth, drawHeight, saveWidth, saveHeight);
- }
}
MG_CATCH(L"MgServerRenderingService.RenderMapInternal")
More information about the mapguide-commits
mailing list