ArcObjects Library Reference  

Extension

About the Server spatial query server object extension Sample

[C#]

Extension.cs

using System;
using System.Runtime.InteropServices;
using System.EnterpriseServices;

namespace SpatialQuerySOE
{
    /// <summary>
    /// Implementation of the Spatial Query SOE.
    /// </summary>
    [AutomationProxy(true), ClassInterface(ClassInterfaceType.None), GuidAttribute("1932805D-7266-41a2-9428-0421A5617436")]
    public class Extension : ServicedComponent, SpatialQuerySOE.Interfaces.IExtension, ESRI.ArcGIS.Server.IServerObjectExtension, 
        ESRI.ArcGIS.esriSystem.IObjectConstruct, ESRI.ArcGIS.esriSystem.ILogSupport, ESRI.ArcGIS.esriSystem.IObjectActivate
    {
        #region Member Variables

        private ESRI.ArcGIS.Server.IServerObjectHelper m_ServerObjectHelper;
        private ESRI.ArcGIS.Carto.IFeatureLayer m_featureLayer;
        private string m_layerName;
        private string m_fieldName;
        private ESRI.ArcGIS.esriSystem.ILog m_log;

        #endregion

        #region IServerObjectExtension Members

        public void Init(ESRI.ArcGIS.Server.IServerObjectHelper pSOH)
        {
            m_ServerObjectHelper = pSOH;
            m_log.AddMessage(3,8000,"SpatialQuerySOE custom message. Init called");
        }

        public void Shutdown()
        {
            m_log.AddMessage(3, 8000, "SpatialQuerySOE custom message. Shutdown called");
            m_ServerObjectHelper = null;
            m_featureLayer = null;
            m_log = null;
        }
        
        #endregion

        #region SpatialQuerySOE.Interfaces.IExtension Members

        public SpatialQuerySOE.Interfaces.IResults QueryPoint(ESRI.ArcGIS.Geometry.IPoint point, double distance)
        {
            if (m_featureLayer == null)
            {
                m_log.AddMessage(1, 8000, "SpatialQuerySOE custom error: layer not found");
                return null;
            }

            ESRI.ArcGIS.Geodatabase.IFeatureClass featureClass = m_featureLayer.FeatureClass;

            // buffer the point
            ESRI.ArcGIS.Geometry.ITopologicalOperator topologicalOperator = (ESRI.ArcGIS.Geometry.ITopologicalOperator)point;
            ESRI.ArcGIS.Geometry.IGeometry queryGeometry = topologicalOperator.Buffer(distance);

            // query the feature class
            ESRI.ArcGIS.Geodatabase.ISpatialFilter spatialFilter = new ESRI.ArcGIS.Geodatabase.SpatialFilter();
            spatialFilter.Geometry = queryGeometry;
            spatialFilter.SpatialRel = ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelIntersects;
            spatialFilter.GeometryField = featureClass.ShapeFieldName;

            ESRI.ArcGIS.Geodatabase.IFeatureCursor resultsFeatureCursor = featureClass.Search(spatialFilter, true);

            // loop thourgh the features, clip each geometry to the buffer
            // and total areas by attribute value
            topologicalOperator = (ESRI.ArcGIS.Geometry.ITopologicalOperator)queryGeometry;
            int classFieldIndex = featureClass.FindField(m_fieldName);

            System.Collections.Specialized.ListDictionary summaryStatsDictionary = new System.Collections.Specialized.ListDictionary();

            // create the symbol and graphic elements collection for the graphics
            ESRI.ArcGIS.Display.ISimpleFillSymbol simpleFillSymbol = createFillSymbol();
            ESRI.ArcGIS.Carto.IGraphicElements resultsGraphics = new ESRI.ArcGIS.Carto.GraphicElements();

            ESRI.ArcGIS.Geodatabase.IFeature resultsFeature;
            while ((resultsFeature = resultsFeatureCursor.NextFeature()) != null)
            {
                // create the graphic
                ESRI.ArcGIS.Carto.IFillShapeElement fillShapeElement = new ESRI.ArcGIS.Carto.PolygonElement() as
                    ESRI.ArcGIS.Carto.IFillShapeElement;
                ESRI.ArcGIS.Carto.IElement element = fillShapeElement as ESRI.ArcGIS.Carto.IElement;

                // clip the geometry
                ESRI.ArcGIS.Geometry.IGeometry clippedResultsGeometry = topologicalOperator.Intersect(resultsFeature.Shape, 
                    ESRI.ArcGIS.Geometry.esriGeometryDimension.esriGeometry2Dimension);
                element.Geometry = clippedResultsGeometry;
                fillShapeElement.Symbol = simpleFillSymbol;
                ESRI.ArcGIS.Carto.IGraphicElement resultsGraphicElement = fillShapeElement as
                    ESRI.ArcGIS.Carto.IGraphicElement;
                resultsGraphics.Add(resultsGraphicElement);

                // get statistics and add to dictionary
                ESRI.ArcGIS.Geometry.IArea area = clippedResultsGeometry as ESRI.ArcGIS.Geometry.IArea;
                string resultsClass = resultsFeature.get_Value(classFieldIndex) as string;

                // If the class is already in the dictionary, add the current feature's area to the existing entry
                if (summaryStatsDictionary.Contains(resultsClass))
                    summaryStatsDictionary[resultsClass] = (double)summaryStatsDictionary[resultsClass] + area.Area;
                else
                    summaryStatsDictionary[resultsClass] = area.Area;
            }

            // create the summary statistics recordset
            ESRI.ArcGIS.Geodatabase.IRecordSet summaryStatsRecordSet = createSummaryRecordSet(summaryStatsDictionary);

            // create the results object
            SpatialQuerySOE.Interfaces.IResults results = new Results();
            results.ResultsGraphics = resultsGraphics;
            results.SummaryStatistics = summaryStatsRecordSet;

            return results;
        }

        private ESRI.ArcGIS.Geodatabase.IRecordSet createSummaryRecordSet(
            System.Collections.Specialized.ListDictionary summaryStatsDictionary)
        {
            // initialize the summary statistics record set
            ESRI.ArcGIS.Geodatabase.IRecordSet summaryStatsRecordSet = new ESRI.ArcGIS.Geodatabase.RecordSet();
            ESRI.ArcGIS.Geodatabase.IRecordSetInit recordSetInit = summaryStatsRecordSet as ESRI.ArcGIS.Geodatabase.IRecordSetInit;

            ESRI.ArcGIS.Geodatabase.IFields summaryFields = new ESRI.ArcGIS.Geodatabase.Fields();
            ESRI.ArcGIS.Geodatabase.IFieldsEdit summaryFieldsEdit = summaryFields as ESRI.ArcGIS.Geodatabase.IFieldsEdit;
            summaryFieldsEdit.FieldCount_2 = 2;

            ESRI.ArcGIS.Geodatabase.IField field = new ESRI.ArcGIS.Geodatabase.Field();
            ESRI.ArcGIS.Geodatabase.IFieldEdit fieldEdit = field as ESRI.ArcGIS.Geodatabase.IFieldEdit;
            fieldEdit.Name_2 = "Type";
            fieldEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeString;
            fieldEdit.Length_2 = 50;
            summaryFieldsEdit.set_Field(0, field);

            field = new ESRI.ArcGIS.Geodatabase.Field();
            fieldEdit = field as ESRI.ArcGIS.Geodatabase.IFieldEdit;

            fieldEdit.Name_2 = "Area";
            fieldEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeDouble;
            summaryFieldsEdit.set_Field(1, field);

            recordSetInit.CreateTable(summaryFields);

            ESRI.ArcGIS.Geodatabase.ICursor cursor = recordSetInit.Insert();
            ESRI.ArcGIS.Geodatabase.IRowBuffer rowBuffer = recordSetInit.CreateRowBuffer();

            // Copy the summary stats to the record set
            System.Collections.IDictionaryEnumerator summaryStatsEnumerator = summaryStatsDictionary.GetEnumerator();
            while (summaryStatsEnumerator.MoveNext())
            {
                rowBuffer.set_Value(0, summaryStatsEnumerator.Key);
                rowBuffer.set_Value(1, summaryStatsEnumerator.Value);
                cursor.InsertRow(rowBuffer);
            }

            return summaryStatsRecordSet;
        }

        private ESRI.ArcGIS.Display.ISimpleFillSymbol createFillSymbol()
        {
            ESRI.ArcGIS.Display.ISimpleLineSymbol simpleLineSymbol = new ESRI.ArcGIS.Display.SimpleLineSymbol();
            ESRI.ArcGIS.Display.IRgbColor rgbColor = new ESRI.ArcGIS.Display.RgbColor();
            rgbColor.Red = 0;
            rgbColor.Green = 255;
            rgbColor.Blue = 0;
            simpleLineSymbol.Color = rgbColor;
            simpleLineSymbol.Style = ESRI.ArcGIS.Display.esriSimpleLineStyle.esriSLSSolid;
            simpleLineSymbol.Width = 2;

            ESRI.ArcGIS.Display.ISimpleFillSymbol simpleFillSymbol = new ESRI.ArcGIS.Display.SimpleFillSymbol();
            simpleFillSymbol.Outline = simpleLineSymbol;
            simpleFillSymbol.Style = ESRI.ArcGIS.Display.esriSimpleFillStyle.esriSFSHollow;

            return simpleFillSymbol;
        }
        #endregion

        #region IObjectConstruct Members
        public void Construct(ESRI.ArcGIS.esriSystem.IPropertySet props)
        {
            try
            {
                m_layerName = props.GetProperty("LayerName") as string;
                m_fieldName = props.GetProperty("FieldName") as string;
            }
            catch (Exception ex)
            {
                m_log.AddMessage(1, 8000, "SpatialQuerySOE custom error. Error reading properties: " + ex.Message + " " + props.Count.ToString());
                return;
            }

            try
            {
                // Get the map underlying the map service and the IGeoFeatureLayers contained in the map
                ESRI.ArcGIS.Carto.IMapServer mapServer = (ESRI.ArcGIS.Carto.IMapServer) m_ServerObjectHelper.ServerObject;
                ESRI.ArcGIS.Carto.IMapServerObjects mapServerObjects = (ESRI.ArcGIS.Carto.IMapServerObjects) mapServer;
                ESRI.ArcGIS.Carto.IMap map = mapServerObjects.get_Map(mapServer.DefaultMapName);
                ESRI.ArcGIS.esriSystem.UID layerTypeID = new ESRI.ArcGIS.esriSystem.UIDClass();
                layerTypeID.Value = "{E156D7E5-22AF-11D3-9F99-00C04F6BC78E}";
                ESRI.ArcGIS.Carto.IEnumLayer enumLayer = map.get_Layers(layerTypeID, true);
                enumLayer.Reset();

                // Get the layer specified as the SOE layer
                while ((m_featureLayer = enumLayer.Next() as ESRI.ArcGIS.Carto.IFeatureLayer) != null)
                {
                    if (m_featureLayer.Name == m_layerName)
                        break;
                }

                if (m_featureLayer == null)
                {
                    m_log.AddMessage(1, 8000, "SpatialQuerySOE custom error: Layer " + m_layerName + " not found.");
                    return;
                }

                // Make sure the layer contains the field specified by the SOE's configuration
                if (m_featureLayer.FeatureClass.FindField(m_fieldName) == -1)
                    m_log.AddMessage(1, 8000, "SpatialQuerySOE custom error: Field " + m_fieldName + " not found in layer " + m_layerName);
                else
                    m_log.AddMessage(3, 8000, "SpatialQuerySOE successfully initialized.");

            }
            catch (Exception ex)
            {
                m_log.AddMessage(1, 8000, "SpatialQuerySOE custom error: Failed to initialize extension: " + ex.Message + "::" + ex.StackTrace.Length.ToString());
            }
        }
        #endregion

        #region ILogSupport Members
        public void InitLogging(ESRI.ArcGIS.esriSystem.ILog log)
        {
            m_log = log;
        }
        #endregion

        #region IObjectActivate Members

        void ESRI.ArcGIS.esriSystem.IObjectActivate.Activate()
        {
            m_log.AddMessage(3, 8000, "SpatialQuerySOE custom message. Activate called");
        }

        void ESRI.ArcGIS.esriSystem.IObjectActivate.Deactivate()
        {
            m_log.AddMessage(3, 8000, "SpatialQuerySOE custom message. Deactivate called");
        }

        #endregion
    }
}

[Visual Basic .NET]

Extension.vb

Imports Microsoft.VisualBasic
Imports System
Imports System.Runtime.InteropServices
Imports System.EnterpriseServices

Namespace SpatialQuerySOE_VBNet
  ''' <summary>
  ''' Implementation of the Spatial Query SOE.
  ''' </summary>
  <AutomationProxy(True), ClassInterface(ClassInterfaceType.None), Guid("3896A0F5-1028-489c-81CD-F7757D117C9E")> _
  Public Class Extension
    Inherits ServicedComponent
    Implements SpatialQuerySOE.Interfaces_VBNet.IExtension, ESRI.ArcGIS.Server.IServerObjectExtension, ESRI.ArcGIS.esriSystem.IObjectConstruct, ESRI.ArcGIS.esriSystem.ILogSupport, ESRI.ArcGIS.esriSystem.IObjectActivate


#Region "Member Variables"

    Private m_ServerObjectHelper As ESRI.ArcGIS.Server.IServerObjectHelper
    Private m_featureLayer As ESRI.ArcGIS.Carto.IFeatureLayer
    Private m_layerName As String
    Private m_fieldName As String
    Private m_log As ESRI.ArcGIS.esriSystem.ILog

#End Region

#Region "IServerObjectExtension Members"

    Public Sub Init(ByVal pSOH As ESRI.ArcGIS.Server.IServerObjectHelper) Implements ESRI.ArcGIS.Server.IServerObjectExtension.Init
      m_ServerObjectHelper = pSOH
      m_log.AddMessage(3, 8000, "SpatialQuerySOE custom message. Init called")
    End Sub

    Public Sub Shutdown() Implements ESRI.ArcGIS.Server.IServerObjectExtension.Shutdown
      m_log.AddMessage(3, 8000, "SpatialQuerySOE custom message. Shutdown called")
      m_ServerObjectHelper = Nothing
      m_featureLayer = Nothing
      m_log = Nothing
    End Sub

#End Region

#Region "SpatialQuerySOE.Interfaces_VBNet.IExtension Members"

    Public Function QueryPoint(ByVal point As ESRI.ArcGIS.Geometry.IPoint, ByVal distance As Double) As SpatialQuerySOE.Interfaces_VBNet.IResults Implements SpatialQuerySOE.Interfaces_VBNet.IExtension.QueryPoint
      If m_featureLayer Is Nothing Then
        m_log.AddMessage(1, 8000, "SpatialQuerySOE custom error: layer not found")
        Return Nothing
      End If

      Dim featureClass As ESRI.ArcGIS.Geodatabase.IFeatureClass = m_featureLayer.FeatureClass

      ' buffer the point
      Dim topologicalOperator As ESRI.ArcGIS.Geometry.ITopologicalOperator = CType(point, ESRI.ArcGIS.Geometry.ITopologicalOperator)
      Dim queryGeometry As ESRI.ArcGIS.Geometry.IGeometry = topologicalOperator.Buffer(distance)

      ' query the feature class
      Dim spatialFilter As ESRI.ArcGIS.Geodatabase.ISpatialFilter = New ESRI.ArcGIS.Geodatabase.SpatialFilter()
      spatialFilter.Geometry = queryGeometry
      spatialFilter.SpatialRel = ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelIntersects
      spatialFilter.GeometryField = featureClass.ShapeFieldName

      Dim resultsFeatureCursor As ESRI.ArcGIS.Geodatabase.IFeatureCursor = featureClass.Search(spatialFilter, True)

      ' loop thourgh the features, clip each geometry to the buffer
      ' and total areas by attribute value
      topologicalOperator = CType(queryGeometry, ESRI.ArcGIS.Geometry.ITopologicalOperator)
      Dim classFieldIndex As Integer = featureClass.FindField(m_fieldName)

      Dim summaryStatsDictionary As New System.Collections.Specialized.ListDictionary()

      ' create the symbol and graphic elements collection for the graphics
      Dim simpleFillSymbol As ESRI.ArcGIS.Display.ISimpleFillSymbol = createFillSymbol()
      Dim resultsGraphics As ESRI.ArcGIS.Carto.IGraphicElements = New ESRI.ArcGIS.Carto.GraphicElements()

      Dim resultsFeature As ESRI.ArcGIS.Geodatabase.IFeature
      resultsFeature = resultsFeatureCursor.NextFeature()
      Do While resultsFeature IsNot Nothing
        ' create the graphic
        Dim fillShapeElement As ESRI.ArcGIS.Carto.IFillShapeElement = TryCast(New ESRI.ArcGIS.Carto.PolygonElement, ESRI.ArcGIS.Carto.IFillShapeElement)
        Dim element As ESRI.ArcGIS.Carto.IElement = TryCast(fillShapeElement, ESRI.ArcGIS.Carto.IElement)

        ' clip the geometry
        Dim clippedResultsGeometry As ESRI.ArcGIS.Geometry.IGeometry = topologicalOperator.Intersect(resultsFeature.Shape, ESRI.ArcGIS.Geometry.esriGeometryDimension.esriGeometry2Dimension)
        element.Geometry = clippedResultsGeometry
        fillShapeElement.Symbol = simpleFillSymbol
        Dim resultsGraphicElement As ESRI.ArcGIS.Carto.IGraphicElement = TryCast(fillShapeElement, ESRI.ArcGIS.Carto.IGraphicElement)
        resultsGraphics.Add(resultsGraphicElement)

        ' get statistics and add to dictionary
        Dim area As ESRI.ArcGIS.Geometry.IArea = TryCast(clippedResultsGeometry, ESRI.ArcGIS.Geometry.IArea)
        Dim resultsClass As String = TryCast(resultsFeature.Value(classFieldIndex), String)

        ' If the class is already in the dictionary, add the current feature's area to the existing entry
        If summaryStatsDictionary.Contains(resultsClass) Then
          summaryStatsDictionary(resultsClass) = CDbl(summaryStatsDictionary(resultsClass)) + area.Area
        Else
          summaryStatsDictionary(resultsClass) = area.Area
        End If
        resultsFeature = resultsFeatureCursor.NextFeature()
      Loop

      ' create the summary statistics recordset
      Dim summaryStatsRecordSet As ESRI.ArcGIS.Geodatabase.IRecordSet = createSummaryRecordSet(summaryStatsDictionary)

      ' create the results object
      Dim results As SpatialQuerySOE.Interfaces_VBNet.IResults = New Results()
      results.ResultsGraphics = resultsGraphics
      results.SummaryStatistics = summaryStatsRecordSet

      Return results
    End Function

    Private Function createSummaryRecordSet(ByVal summaryStatsDictionary As System.Collections.Specialized.ListDictionary) As ESRI.ArcGIS.Geodatabase.IRecordSet
      ' initialize the summary statistics record set
      Dim summaryStatsRecordSet As ESRI.ArcGIS.Geodatabase.IRecordSet = New ESRI.ArcGIS.Geodatabase.RecordSet()
      Dim recordSetInit As ESRI.ArcGIS.Geodatabase.IRecordSetInit = TryCast(summaryStatsRecordSet, ESRI.ArcGIS.Geodatabase.IRecordSetInit)

      Dim summaryFields As ESRI.ArcGIS.Geodatabase.IFields = New ESRI.ArcGIS.Geodatabase.Fields()
      Dim summaryFieldsEdit As ESRI.ArcGIS.Geodatabase.IFieldsEdit = TryCast(summaryFields, ESRI.ArcGIS.Geodatabase.IFieldsEdit)
      summaryFieldsEdit.FieldCount_2 = 2

      Dim field As ESRI.ArcGIS.Geodatabase.IField = New ESRI.ArcGIS.Geodatabase.Field()
      Dim fieldEdit As ESRI.ArcGIS.Geodatabase.IFieldEdit = TryCast(field, ESRI.ArcGIS.Geodatabase.IFieldEdit)
      fieldEdit.Name_2 = "Type"
      fieldEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeString
      fieldEdit.Length_2 = 50
      summaryFieldsEdit.Field_2(0) = field

      field = New ESRI.ArcGIS.Geodatabase.Field()
      fieldEdit = TryCast(field, ESRI.ArcGIS.Geodatabase.IFieldEdit)

      fieldEdit.Name_2 = "Area"
      fieldEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeDouble
      summaryFieldsEdit.Field_2(1) = field

      recordSetInit.CreateTable(summaryFields)

      Dim cursor As ESRI.ArcGIS.Geodatabase.ICursor = recordSetInit.Insert()
      Dim rowBuffer As ESRI.ArcGIS.Geodatabase.IRowBuffer = recordSetInit.CreateRowBuffer()

      ' Copy the summary stats to the record set
      Dim summaryStatsEnumerator As System.Collections.IDictionaryEnumerator = summaryStatsDictionary.GetEnumerator()
      Do While summaryStatsEnumerator.MoveNext()
        rowBuffer.Value(0) = summaryStatsEnumerator.Key
        rowBuffer.Value(1) = summaryStatsEnumerator.Value
        cursor.InsertRow(rowBuffer)
      Loop

      Return summaryStatsRecordSet
    End Function

    Private Function createFillSymbol() As ESRI.ArcGIS.Display.ISimpleFillSymbol
      Dim simpleLineSymbol As ESRI.ArcGIS.Display.ISimpleLineSymbol = New ESRI.ArcGIS.Display.SimpleLineSymbol()
      Dim rgbColor As ESRI.ArcGIS.Display.IRgbColor = New ESRI.ArcGIS.Display.RgbColor()
      rgbColor.Red = 0
      rgbColor.Green = 255
      rgbColor.Blue = 0
      simpleLineSymbol.Color = rgbColor
      simpleLineSymbol.Style = ESRI.ArcGIS.Display.esriSimpleLineStyle.esriSLSSolid
      simpleLineSymbol.Width = 2

      Dim simpleFillSymbol As ESRI.ArcGIS.Display.ISimpleFillSymbol = New ESRI.ArcGIS.Display.SimpleFillSymbol()
      simpleFillSymbol.Outline = simpleLineSymbol
      simpleFillSymbol.Style = ESRI.ArcGIS.Display.esriSimpleFillStyle.esriSFSHollow

      Return simpleFillSymbol
    End Function
#End Region

#Region "IObjectConstruct Members"
    Public Overloads Sub Construct(ByVal props As ESRI.ArcGIS.esriSystem.IPropertySet) Implements ESRI.ArcGIS.esriSystem.IObjectConstruct.Construct
      Try
        m_layerName = TryCast(props.GetProperty("LayerName"), String)
        m_fieldName = TryCast(props.GetProperty("FieldName"), String)
      Catch ex As Exception
        m_log.AddMessage(1, 8000, "SpatialQuerySOE custom error. Error reading properties: " & ex.Message & " " & props.Count.ToString())
        Return
      End Try

      Try
        ' Get the map underlying the map service and the IGeoFeatureLayers contained in the map
        Dim mapServer As ESRI.ArcGIS.Carto.IMapServer = CType(m_ServerObjectHelper.ServerObject, ESRI.ArcGIS.Carto.IMapServer)
        Dim mapServerObjects As ESRI.ArcGIS.Carto.IMapServerObjects = CType(mapServer, ESRI.ArcGIS.Carto.IMapServerObjects)
        Dim map As ESRI.ArcGIS.Carto.IMap = mapServerObjects.Map(mapServer.DefaultMapName)
        Dim layerTypeID As ESRI.ArcGIS.esriSystem.UID = New ESRI.ArcGIS.esriSystem.UIDClass()
        layerTypeID.Value = "{E156D7E5-22AF-11D3-9F99-00C04F6BC78E}"
        Dim enumLayer As ESRI.ArcGIS.Carto.IEnumLayer = map.Layers(layerTypeID, True)
        enumLayer.Reset()

        ' Get the layer specified as the SOE layer
        m_featureLayer = TryCast(enumLayer.Next(), ESRI.ArcGIS.Carto.IFeatureLayer)
        Do While m_featureLayer IsNot Nothing
          If m_featureLayer.Name = m_layerName Then
            Exit Do
          End If
          m_featureLayer = TryCast(enumLayer.Next(), ESRI.ArcGIS.Carto.IFeatureLayer)
        Loop

        If m_featureLayer Is Nothing Then
          m_log.AddMessage(1, 8000, "SpatialQuerySOE custom error: Layer " & m_layerName & " not found.")
          Return
        End If

        ' Make sure the layer contains the field specified by the SOE's configuration
        If m_featureLayer.FeatureClass.FindField(m_fieldName) = -1 Then
          m_log.AddMessage(1, 8000, "SpatialQuerySOE custom error: Field " & m_fieldName & " not found in layer " & m_layerName)
        Else
          m_log.AddMessage(3, 8000, "SpatialQuerySOE successfully initialized.")
        End If

      Catch ex As Exception
        m_log.AddMessage(1, 8000, "SpatialQuerySOE custom error: Failed to initialize extension: " & ex.Message & "::" & ex.StackTrace.Length.ToString())
      End Try
    End Sub
#End Region

#Region "ILogSupport Members"
    Public Sub InitLogging(ByVal log As ESRI.ArcGIS.esriSystem.ILog) Implements ESRI.ArcGIS.esriSystem.ILogSupport.InitLogging
      m_log = log
    End Sub
#End Region

#Region "IObjectActivate Members"

    Private Sub IObjectActivate_Activate() Implements ESRI.ArcGIS.esriSystem.IObjectActivate.Activate
      m_log.AddMessage(3, 8000, "SpatialQuerySOE custom message. Activate called")
    End Sub

    Private Sub Deactivate() Implements ESRI.ArcGIS.esriSystem.IObjectActivate.Deactivate
      m_log.AddMessage(3, 8000, "SpatialQuerySOE custom message. Deactivate called")
    End Sub

#End Region




  End Class
End Namespace