/// <summary>
        /// Populate species observation project parameter with content from data reader.
        /// </summary>
        /// <param name="dataReader">Data source that will populate the species observation project parameter.</param>
        public void LoadData(DataReader dataReader)
        {
            WebDataField dataField;

            ClassIdentifier      = dataReader.GetString(SpeciesObservationProjectParameterData.CLASS_IDENTIFIER);
            PropertyIdentifier   = dataReader.GetString(SpeciesObservationProjectParameterData.PROPERTY_IDENTIFIER);
            SpeciesObservationId = dataReader.GetInt64(SpeciesObservationProjectParameterData.SPECIES_OBSERVATION_ID);
            Type = (WebDataType)(dataReader.GetInt32(SpeciesObservationProjectParameterData.DATA_TYPE));
            if (dataReader.IsNotDbNull(SpeciesObservationProjectParameterData.UNIT))
            {
                if (DataFields.IsNull())
                {
                    DataFields = new List <WebDataField>();
                }

                dataField       = new WebDataField();
                dataField.Name  = Settings.Default.WebDataUnit;
                dataField.Type  = WebDataType.String;
                dataField.Value = dataReader.GetString(SpeciesObservationProjectParameterData.UNIT);
                if (dataField.Value.IsNotEmpty())
                {
                    DataFields.Add(dataField);
                }
            }

            Value = dataReader.GetString(SpeciesObservationProjectParameterData.VALUE);
        }
예제 #2
0
        public static WebDataField GetOneDataField(WebDataType dataType)
        {
            WebDataField dataField;

            dataField      = new WebDataField();
            dataField.Name = "Test";
            dataField.Type = dataType;
            switch (dataType)
            {
            case WebDataType.Boolean:
                dataField.Value = true.WebToString();
                break;

            case WebDataType.DateTime:
                dataField.Value = DateTime.Now.WebToString();
                break;

            case WebDataType.Float64:
                dataField.Value = Math.PI.WebToString();
                break;

            case WebDataType.Int32:
                dataField.Value = Int32.MaxValue.WebToString();
                break;

            case WebDataType.Int64:
                dataField.Value = Int64.MaxValue.WebToString();
                break;

            case WebDataType.String:
                dataField.Value = "Testing";
                break;
            }
            return(dataField);
        }
        public void WebToString()
        {
            String       dataFieldsString;
            WebDataField dataField;

            dataFieldsString = GetDataFields(true).WebToString();
            Assert.IsTrue(dataFieldsString.IsEmpty());

            dataField       = new WebDataField();
            dataField.Name  = "Test boolean";
            dataField.Type  = WebDataType.Boolean;
            dataField.Value = Boolean.TrueString;
            GetDataFields().Add(dataField);
            dataFieldsString = GetDataFields().WebToString();
            Assert.IsTrue(dataFieldsString.IsNotEmpty());

            dataField             = new WebDataField();
            dataField.Name        = "Test int";
            dataField.Information = "Något att fundera på.";
            dataField.Type        = WebDataType.Int32;
            dataField.Value       = 4234234.WebToString();
            GetDataFields().Add(dataField);
            dataFieldsString = GetDataFields().WebToString();
            Assert.IsTrue(dataFieldsString.IsNotEmpty());

            dataField       = new WebDataField();
            dataField.Name  = "Test string";
            dataField.Unit  = "Area";
            dataField.Type  = WebDataType.String;
            dataField.Value = "Stort område";
            GetDataFields().Add(dataField);
            dataFieldsString = GetDataFields().WebToString();
            Assert.IsTrue(dataFieldsString.IsNotEmpty());
        }
        public void GetBoolean()
        {
            Boolean value;

            Data.ArtDatabankenService.DataFieldList dataFields;
            WebDataField        webDataField;
            List <WebDataField> webDataFields;

            value             = false;
            webDataField      = new WebDataField();
            webDataField.Name = "Test";
            webDataField.Type = WebDataType.Boolean;
#if DATA_SPECIFIED_EXISTS
            webDataField.TypeSpecified = true;
#endif
            webDataField.Value = value.ToString();
            webDataFields      = new List <WebDataField>();
            webDataFields.Add(webDataField);
            dataFields = new Data.ArtDatabankenService.DataFieldList(webDataFields);
            Assert.AreEqual(dataFields.GetBoolean("Test"), value);

            value             = true;
            webDataField      = new WebDataField();
            webDataField.Name = "Test";
            webDataField.Type = WebDataType.Boolean;
#if DATA_SPECIFIED_EXISTS
            webDataField.TypeSpecified = true;
#endif
            webDataField.Value = value.ToString();
            webDataFields      = new List <WebDataField>();
            webDataFields.Add(webDataField);
            dataFields = new Data.ArtDatabankenService.DataFieldList(webDataFields);
            Assert.AreEqual(dataFields.GetBoolean("Test"), value);
        }
예제 #5
0
 private WebDataField GetDataField(Boolean refresh = false)
 {
     if (_dataField.IsNull() || refresh)
     {
         _dataField = GetOneDataField(WebDataType.Int32);
     }
     return(_dataField);
 }
예제 #6
0
        public WebDataField GetDataField(Boolean refresh = false)
        {
            if (_dataField.IsNull() || refresh)
            {
                _dataField = new WebDataField();
            }

            return(_dataField);
        }
예제 #7
0
 /// <summary>
 /// Load data into WebDataField.
 /// </summary>
 /// <param name='webDataField'>Data field object.</param>
 /// <param name='webSpeciesObservationField'>A WramService WebSpeciesObservationField object.</param>
 public static void LoadData(this WebDataField webDataField,
                             Proxy.WramService.WebSpeciesObservationField webSpeciesObservationField)
 {
     webDataField.Information = webSpeciesObservationField.Information;
     webDataField.Name        = webSpeciesObservationField.Property.Id.ToString();
     webDataField.Type        = (WebDataType)webSpeciesObservationField.Type;
     webDataField.Unit        = webSpeciesObservationField.Unit;
     webDataField.Value       = webSpeciesObservationField.Value.CheckInjection();
 }
예제 #8
0
        public static List <WebDataField> GetOneDataFieldList()
        {
            Boolean             booleanValue;
            List <WebDataField> dataFields;
            WebDataField        dataField;

            dataFields = new List <WebDataField>();

            // Add boolean value.
            dataField       = new WebDataField();
            dataField.Name  = BOOLEAN_DATA_FIELD_NAME;
            dataField.Type  = WebDataType.Boolean;
            booleanValue    = true;
            dataField.Value = booleanValue.WebToString();
            dataFields.Add(dataField);

            // Add DateTime value.
            dataField       = new WebDataField();
            dataField.Name  = DATE_TIME_DATA_FIELD_NAME;
            dataField.Type  = WebDataType.DateTime;
            dataField.Value = DateTime.Now.WebToString();
            dataFields.Add(dataField);

            // Add float value.
            dataField       = new WebDataField();
            dataField.Name  = FLOAT64_DATA_FIELD_NAME;
            dataField.Type  = WebDataType.Float64;
            dataField.Value = Math.PI.WebToString();
            dataFields.Add(dataField);

            // Add Int32 value.
            dataField       = new WebDataField();
            dataField.Name  = INT32_DATA_FIELD_NAME;
            dataField.Type  = WebDataType.Int32;
            dataField.Value = Int32.MaxValue.WebToString();
            dataFields.Add(dataField);

            // Add Int64 value.
            dataField       = new WebDataField();
            dataField.Name  = INT64_DATA_FIELD_NAME;
            dataField.Type  = WebDataType.Int64;
            dataField.Value = Int64.MaxValue.WebToString();
            dataFields.Add(dataField);

            // Add String value.
            dataField       = new WebDataField();
            dataField.Name  = STRING_DATA_FIELD_NAME;
            dataField.Type  = WebDataType.String;
            dataField.Value = "Testing data fields";
            dataFields.Add(dataField);

            return(dataFields);
        }
        /// <summary>
        /// Set dynamic data property SwedishReproCount in TaxonChildStatistics.
        /// </summary>
        /// <param name='taxonChildStatistics'>TaxonChildStatistics.</param>
        /// <param name='swedishReproCount'>SwedishReproCount.</param>
        public static void SetSwedishReproCount(this WebTaxonChildStatistics taxonChildStatistics, Int32 swedishReproCount)
        {
            // Add version as dynamic property.
            WebDataField dataField = new WebDataField();

            dataField.Name  = "SwedishReproCount";
            dataField.Type  = WebDataType.Int32;
            dataField.Value = swedishReproCount.WebToString();
            if (taxonChildStatistics.DataFields.IsNull())
            {
                taxonChildStatistics.DataFields = new List <WebDataField>();
            }
            taxonChildStatistics.DataFields.Add(dataField);
        }
예제 #10
0
        public void GetDyntaxaTaxonId()
        {
            Dictionary <string, WebDataField> dictionaryWebData = new Dictionary <string, WebDataField>();
            WebDataField dataField = new WebDataField();

            dataField.Name  = "scientificname";
            dataField.Type  = WebDataType.String;
            dataField.Value = "Timmia bavarica";
            dictionaryWebData[dataField.Name] = dataField;

            GbifProcess gbifProcess = new GbifProcess();
            string      taxonId     = gbifProcess.GetTaxonId(dictionaryWebData, GetContext());

            Assert.IsTrue(taxonId.IsNotEmpty());
        }
예제 #11
0
        /// <summary>
        /// Set created by person in WebLumpSplitEvent.
        /// </summary>
        /// <param name='lumpSplitEvent'>Lump split event.</param>
        /// <param name='createdByPerson'>Created by person.</param>
        public static void SetCreatedByPerson(this WebLumpSplitEvent lumpSplitEvent,
                                              String createdByPerson)
        {
            WebDataField dataField;

            // Add created by person as dynamic property.
            dataField       = new WebDataField();
            dataField.Name  = Settings.Default.WebDataCreatedByPerson;
            dataField.Type  = WebDataType.String;
            dataField.Value = createdByPerson;
            if (lumpSplitEvent.DataFields.IsNull())
            {
                lumpSplitEvent.DataFields = new List <WebDataField>();
            }
            lumpSplitEvent.DataFields.Add(dataField);
        }
예제 #12
0
        /// <summary>
        /// Set Taxon Revision Id in WebTaxon.
        /// </summary>
        /// <param name="taxon">The taxon.</param>
        /// <param name="taxonRevisionId">The taxon revision identifier.</param>
        public static void SetTaxonRevisionId(this WebTaxon taxon, Int32 taxonRevisionId)
        {
            WebDataField dataField;

            // Add taxon revision id property.
            dataField       = new WebDataField();
            dataField.Name  = Settings.Default.WebDataTaxonRevisionId;
            dataField.Type  = WebDataType.Int32;
            dataField.Value = taxonRevisionId.WebToString();
            if (taxon.DataFields.IsNull())
            {
                taxon.DataFields = new List <WebDataField>();
            }

            taxon.DataFields.Add(dataField);
        }
예제 #13
0
        /// <summary>
        /// Set modified by person in WebTaxonName.
        /// </summary>
        /// <param name='taxonName'>Taxon name.</param>
        /// <param name='modifiedByPerson'>Modified by person.</param>
        public static void SetModifiedByPerson(this WebTaxonName taxonName,
                                               String modifiedByPerson)
        {
            WebDataField dataField;

            // Add modified by person as dynamic property.
            dataField       = new WebDataField();
            dataField.Name  = Settings.Default.WebDataModifiedByPerson;
            dataField.Type  = WebDataType.String;
            dataField.Value = modifiedByPerson;
            if (taxonName.DataFields.IsNull())
            {
                taxonName.DataFields = new List <WebDataField>();
            }
            taxonName.DataFields.Add(dataField);
        }
예제 #14
0
        /// <summary>
        /// Set version in WebTaxonName.
        /// </summary>
        /// <param name='taxonName'>TaxonName.</param>
        /// <param name='version'>Version.</param>
        public static void SetVersion(this WebTaxonName taxonName,
                                      Int32 version)
        {
            WebDataField dataField;

            // Add version as dynamic property.
            dataField       = new WebDataField();
            dataField.Name  = "Version";
            dataField.Type  = WebDataType.Int32;
            dataField.Value = version.WebToString();
            if (taxonName.DataFields.IsNull())
            {
                taxonName.DataFields = new List <WebDataField>();
            }
            taxonName.DataFields.Add(dataField);
        }
예제 #15
0
        /// <summary>
        /// Set name usage id in WebTaxonName.
        /// </summary>
        /// <param name='taxonName'>TaxonName.</param>
        /// <param name='nameUsageId'>Name usage id.</param>
        public static void SetNameUsageId(this WebTaxonName taxonName,
                                          Int32 nameUsageId)
        {
            WebDataField dataField;

            // Add name usage as dynamic property.
            dataField       = new WebDataField();
            dataField.Name  = "NameUsageId";
            dataField.Type  = WebDataType.Int32;
            dataField.Value = nameUsageId.WebToString();
            if (taxonName.DataFields.IsNull())
            {
                taxonName.DataFields = new List <WebDataField>();
            }

            taxonName.DataFields.Add(dataField);
        }
예제 #16
0
        public void LoadData()
        {
            WebDataField dataField;

            using (DataReader dataReader = GetContext().GetDatabase().GetLog(null, null, 10))
            {
                if (dataReader.Read() && dataReader.NextUnreadColumn())
                {
                    do
                    {
                        dataField = new WebDataField();
                        dataField.LoadData(dataReader);
                        Assert.IsNotNull(dataField);
                        Assert.IsTrue(dataField.Name.IsNotEmpty());
                    }while (dataReader.NextUnreadColumn());
                }
            }
        }
예제 #17
0
        /// <summary>
        /// Get the project id value, it is the id of the related project,
        /// used for columns of a ProjectParameter type.
        /// </summary>
        /// <param name="webSpeciesObservationFieldMapping">The object</param>
        /// <returns>The project id value, if none found null is returned</returns>
        public static Int32?GetProjectId(this WebSpeciesObservationFieldMapping webSpeciesObservationFieldMapping)
        {
            if (webSpeciesObservationFieldMapping.DataFields.IsEmpty())
            {
                return(null);
            }

            WebDataField field = webSpeciesObservationFieldMapping.DataFields.FirstOrDefault(item => item.Name == "ProjectId");

            if (field.IsNull())
            {
                return(null);
            }
            else
            {
                // ReSharper disable once PossibleNullReferenceException
                return(field.Value.WebParseInt32());
            }
        }
        public void GetInt64()
        {
            Data.ArtDatabankenService.DataFieldList dataFields;
            Int64               value;
            WebDataField        webDataField;
            List <WebDataField> webDataFields;

            value             = 27343654645654645;
            webDataField      = new WebDataField();
            webDataField.Name = "Test";
            webDataField.Type = WebDataType.Int64;
#if DATA_SPECIFIED_EXISTS
            webDataField.TypeSpecified = true;
#endif
            webDataField.Value = value.ToString();
            webDataFields      = new List <WebDataField>();
            webDataFields.Add(webDataField);
            dataFields = new Data.ArtDatabankenService.DataFieldList(webDataFields);

            Assert.AreEqual(dataFields.GetInt64("Test"), value);
        }
예제 #19
0
 public WebDataFieldTest()
 {
     _dataField = null;
 }
예제 #20
0
        /// <summary>
        /// Get information about species observations that has changed.
        /// The service contains observations that are aggregated and has start
        /// and end dates that are set to the first and last day of every month.
        /// </summary>
        /// <param name="changedFrom">Start date for changes.</param>
        /// <param name="changedTo">End date for changes.</param>
        /// <param name="mappings">The mappings.</param>
        /// <param name="context">Web service context.</param>
        /// <param name="connectorServer">The connector server.</param>
        /// <returns>
        /// Returns true if there are more species
        /// observations to retrieve for current date.
        /// </returns>
        public Boolean GetSpeciesObservationChange(DateTime changedFrom,
                                                   DateTime changedTo,
                                                   List <HarvestMapping> mappings,
                                                   WebServiceContext context,
                                                   IConnectorServer connectorServer)
        {
            Dictionary <String, WebSpeciesObservation> updatedSpeciesObservations;
            SpeciesObservationChange speciesObservationChange = new SpeciesObservationChange();

            speciesObservationChange.CreatedSpeciesObservations = new List <HarvestSpeciesObservation>();

            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

            WramProcess wramProcess = new WramProcess();
            WebSpeciesObservationDataProvider dataProvider = GetSpeciesObservationDataProvider(context);
            WebSpeciesObservationChange       webSpeciesObservationChange = WebServiceProxy.WramService.GetSpeciesObservationChangeAsSpecies(DateTime.Now,
                                                                                                                                             false,
                                                                                                                                             DateTime.Now,
                                                                                                                                             false,
                                                                                                                                             dataProvider.MaxChangeId,
                                                                                                                                             true,
                                                                                                                                             Settings.Default.MaxSpeciesObservationsFromWram);

            // Run all created and updated together as one list.
            updatedSpeciesObservations = new Dictionary <String, WebSpeciesObservation>();
            AddSpeciesObservations(updatedSpeciesObservations, webSpeciesObservationChange.UpdatedSpeciesObservations);
            AddSpeciesObservations(updatedSpeciesObservations, webSpeciesObservationChange.CreatedSpeciesObservations);
            List <WebSpeciesObservation> createdAndUpdatedObservations = new List <WebSpeciesObservation>();

            createdAndUpdatedObservations.AddRange(updatedSpeciesObservations.Values);

            // Handle created and updated species observations.
            int noOfCreated = 0, noOfCreatedErrors = 0;

            if (createdAndUpdatedObservations.IsNotEmpty())
            {
                foreach (WebSpeciesObservation wramSpeciesObservation in createdAndUpdatedObservations)
                {
                    WebData webData = new WebData {
                        DataFields = new List <WebDataField>()
                    };
                    foreach (WebSpeciesObservationField webSpeciesObservationField in wramSpeciesObservation.Fields)
                    {
                        WebDataField webDataField = new WebDataField();
                        webDataField.LoadData(webSpeciesObservationField);
                        webData.DataFields.Add(webDataField);
                    }

                    // Map and add webdata to the 'created collection'
                    speciesObservationChange.CreatedSpeciesObservations.Add(wramProcess.ProcessObservation(webData, mappings, context));
                }

                connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors);
            }

            // Handle deleted species observtions.
            int noOfDeleted = 0, noOfDeletedErrors = 0;

            speciesObservationChange.DeletedSpeciesObservationGuids = new List <String>();

            if (webSpeciesObservationChange.DeletedSpeciesObservationGuids.IsNotEmpty())
            {
                foreach (String wramSpeciesObservation in webSpeciesObservationChange.DeletedSpeciesObservationGuids)
                {
                    String id = wramSpeciesObservation.Substring(wramSpeciesObservation.LastIndexOf(':') + 1);
                    speciesObservationChange.DeletedSpeciesObservationGuids.Add(id);
                }

                connectorServer.DeleteSpeciesObservations(context, speciesObservationChange.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors);
            }

            Debug.WriteLine(webSpeciesObservationChange.MaxChangeId + " : count created: " + noOfCreated);

            context.GetSpeciesObservationDatabase().LogHarvestRead(
                context,
                dataProvider,
                changedFrom,
                changedTo,
                stopwatch.ElapsedMilliseconds,
                noOfCreated,
                noOfCreatedErrors,
                0,
                0,
                noOfDeleted,
                noOfDeletedErrors,
                webSpeciesObservationChange.MaxChangeId);
            stopwatch.Stop();

            if (webSpeciesObservationChange.MaxChangeId > 0)
            {
//                context.GetSpeciesObservationDatabase().SetMaxChangeId(dataProvider.Id, webSpeciesObservationChange.MaxChangeId);

                // Testing if WRAM has a problem with handling of change id.
                context.GetSpeciesObservationDatabase().SetMaxChangeId(dataProvider.Id, webSpeciesObservationChange.MaxChangeId - 1);
            }
            // else: No changes was retrieved. There are no more changes available right now.

            return(false);
        }
        /// <summary>
        /// Convert a SpeciesObservationSearchCriteria to a
        /// WebSpeciesObservationSearchCriteria.
        /// </summary>
        /// <param name="searchCriteria">The SpeciesObservationSearchCriteria.</param>
        /// <returns>The WebSpeciesObservationSearchCriteria.</returns>
        private static WebSpeciesObservationSearchCriteria GetSpeciesObservationSearchCriteria(SpeciesObservationSearchCriteria searchCriteria)
        {
            WebDataField dataField;
            WebSpeciesObservationSearchCriteria webSearchCriteria;

            webSearchCriteria = new WebSpeciesObservationSearchCriteria();
            webSearchCriteria.IsAccuracySpecified = searchCriteria.HasAccuracy;
#if DATA_SPECIFIED_EXISTS
            webSearchCriteria.IsAccuracySpecifiedSpecified = true;
#endif
            if (webSearchCriteria.IsAccuracySpecified)
            {
                webSearchCriteria.Accuracy = searchCriteria.Accuracy;
#if DATA_SPECIFIED_EXISTS
                webSearchCriteria.AccuracySpecified = true;
#endif
            }

            webSearchCriteria.IsBirdNestActivityLevelSpecified = searchCriteria.HasBirdNestActivityLevel;
#if DATA_SPECIFIED_EXISTS
            webSearchCriteria.IsBirdNestActivityLevelSpecifiedSpecified = true;
#endif
            if (webSearchCriteria.IsBirdNestActivityLevelSpecified)
            {
                webSearchCriteria.BirdNestActivityLevel = searchCriteria.BirdNestActivityLevel;
#if DATA_SPECIFIED_EXISTS
                webSearchCriteria.BirdNestActivityLevelSpecified = true;
#endif
            }

            webSearchCriteria.Counties = GeographicManager.GetCounties(searchCriteria.Counties);

            webSearchCriteria.DatabaseIds = null;
            if (searchCriteria.DatabaseIds.IsNotEmpty())
            {
                webSearchCriteria.DatabaseIds = searchCriteria.DatabaseIds;
            }

            webSearchCriteria.IncludeNeverFoundObservations = searchCriteria.IncludeNeverFoundObservations;
#if DATA_SPECIFIED_EXISTS
            webSearchCriteria.IncludeNeverFoundObservationsSpecified = true;
#endif
            webSearchCriteria.IncludeNotRediscoveredObservations = searchCriteria.IncludeNotRediscoveredObservations;
#if DATA_SPECIFIED_EXISTS
            webSearchCriteria.IncludeNotRediscoveredObservationsSpecified = true;
#endif
            webSearchCriteria.IncludePositiveObservations = searchCriteria.IncludePositiveObservations;
#if DATA_SPECIFIED_EXISTS
            webSearchCriteria.IncludePositiveObservationsSpecified = true;
#endif

            if (webSearchCriteria.DataFields.IsNull())
            {
                webSearchCriteria.DataFields = new List <WebDataField>();
            }

            dataField       = new WebDataField();
            dataField.Name  = "IncludeUncertainTaxonDetermination";
            dataField.Type  = WebDataType.Boolean;
            dataField.Value = searchCriteria.IncludeUncertainTaxonDetermination.WebToString();
            webSearchCriteria.DataFields.Add(dataField);

            webSearchCriteria.LocationSearchString = searchCriteria.LocalitySearchString;

            webSearchCriteria.IsRectangleSpecified = searchCriteria.HasBoundingBox;
#if DATA_SPECIFIED_EXISTS
            webSearchCriteria.IsRectangleSpecifiedSpecified = true;
#endif
            if (webSearchCriteria.IsRectangleSpecified)
            {
                webSearchCriteria.EastCoordinate  = searchCriteria.MaxEastCoordinate;
                webSearchCriteria.NorthCoordinate = searchCriteria.MaxNorthCoordinate;
                webSearchCriteria.WestCoordinate  = searchCriteria.MaxWestCoordinate;
                webSearchCriteria.SouthCoordinate = searchCriteria.MaxSouthCoordinate;
#if DATA_SPECIFIED_EXISTS
                webSearchCriteria.EastCoordinateSpecified = true;
#endif
#if DATA_SPECIFIED_EXISTS
                webSearchCriteria.NorthCoordinateSpecified = true;
#endif
#if DATA_SPECIFIED_EXISTS
                webSearchCriteria.WestCoordinateSpecified = true;
#endif
#if DATA_SPECIFIED_EXISTS
                webSearchCriteria.SouthCoordinateSpecified = true;
#endif
            }

            webSearchCriteria.ObservationEndDate = searchCriteria.ObservationEndDate;
#if DATA_SPECIFIED_EXISTS
            webSearchCriteria.ObservationEndDateSpecified = true;
#endif
            webSearchCriteria.ObservationStartDate = searchCriteria.ObservationStartDate;
#if DATA_SPECIFIED_EXISTS
            webSearchCriteria.ObservationStartDateSpecified = true;
#endif
            webSearchCriteria.ObserverSearchString = searchCriteria.ObserverSearchString;
            webSearchCriteria.UseOfObservationDate = searchCriteria.UseOfObservationDate;
#if DATA_SPECIFIED_EXISTS
            webSearchCriteria.UseOfObservationDateSpecified = true;
#endif

            webSearchCriteria.RegistrationEndDate = searchCriteria.RegistrationEndDate;
#if DATA_SPECIFIED_EXISTS
            webSearchCriteria.RegistrationEndDateSpecified = true;
#endif
            webSearchCriteria.RegistrationStartDate = searchCriteria.RegistrationStartDate;
#if DATA_SPECIFIED_EXISTS
            webSearchCriteria.RegistrationStartDateSpecified = true;
#endif
            webSearchCriteria.UseOfRegistrationDate = searchCriteria.UseOfRegistrationDate;
#if DATA_SPECIFIED_EXISTS
            webSearchCriteria.UseOfRegistrationDateSpecified = true;
#endif

            webSearchCriteria.Provinces = GeographicManager.GetProvinces(searchCriteria.Provinces);

            webSearchCriteria.TaxonIds = null;
            if (searchCriteria.TaxonIds.IsNotEmpty())
            {
                webSearchCriteria.TaxonIds = searchCriteria.TaxonIds;
            }

            webSearchCriteria.UserRoleId = searchCriteria.UserRoleId;
#if DATA_SPECIFIED_EXISTS
            webSearchCriteria.UserRoleIdSpecified = true;
#endif

            return(webSearchCriteria);
        }
예제 #22
0
 public WebDataFieldExtensionTest()
     : base(true, 60)
 {
     dataField = null;
 }
예제 #23
0
 public WebDataFieldExtensionTest()
 {
     _dataField = null;
 }
        /// <summary>
        /// Get information about species observations
        /// that has changed in the specified date range or
        /// from a specified changeId.
        /// Only date part of parameters changedFrom and changedTo
        /// are used. It does not matter what time of day that is set
        /// in parameters changedFrom and changedTo.
        /// </summary>
        /// <param name="changedFrom">
        /// Changed from date.
        /// </param>
        /// <param name="isChangedFromSpecified">
        /// Is changed from specified.
        /// </param>
        /// <param name="changedTo">
        /// Changed to date.
        /// </param>
        /// <param name="isChangedToSpecified">
        /// Is changed to specified.
        /// </param>
        /// <param name="changeId">
        /// From witch change id.
        /// </param>
        /// <param name="isChangeIdspecified">
        /// Is changed id specified.
        /// </param>
        /// <param name="maxReturnedChanges">
        /// Max number of observations returned.
        /// </param>
        /// <param name="mappings">
        /// The mapping list.
        /// </param>
        /// <param name="context">
        /// The web service context.
        /// </param>
        /// <param name="connectorServer">
        /// The connector service.
        /// </param>
        public void GetSpeciesObservationChange(DateTime changedFrom,
                                                Boolean isChangedFromSpecified,
                                                DateTime changedTo,
                                                Boolean isChangedToSpecified,
                                                Int64 changeId,
                                                Boolean isChangeIdspecified,
                                                Int64 maxReturnedChanges,
                                                List <HarvestMapping> mappings,
                                                WebServiceContext context,
                                                IConnectorServer connectorServer)
        {
            SpeciesObservationChange speciesObservationChange = new SpeciesObservationChange
            {
                CreatedSpeciesObservations = new List <HarvestSpeciesObservation>(),
                UpdatedSpeciesObservations = new List <HarvestSpeciesObservation>()
            };

            var stopwatch = Stopwatch.StartNew();

            int sumNoOfCreated = 0, sumNoOfCreatedErrors = 0,
                sumNoOfUpdated = 0, sumNoOfUpdatedErrors = 0,
                sumNoOfDeleted = 0, sumNoOfDeletedErrors = 0;

            KulProcess kulProcess = new KulProcess();
            WebSpeciesObservationDataProvider dataProvider = GetSpeciesObservationDataProvider(context);

            Stopwatch stopwatch1 = Stopwatch.StartNew();
            WebSpeciesObservationChange webSpeciesObservationChange = WebServiceProxy.KulService.GetSpeciesObservationChangeAsSpecies(changedFrom,
                                                                                                                                      isChangedFromSpecified,
                                                                                                                                      changedTo,
                                                                                                                                      isChangedToSpecified,
                                                                                                                                      changeId,
                                                                                                                                      isChangeIdspecified,
                                                                                                                                      maxReturnedChanges);

            Debug.WriteLine("Harvest: " + DateTime.Now.ToLongTimeString() + " - Time: " + TimeSpan.FromMilliseconds(stopwatch1.ElapsedMilliseconds).TotalMinutes + " Minutes");


            // LOOP OVER CHANGEID
            // Denna verkar inte klara mer än ca 100 obsar så det behövs en loop över dessa...
            Int32 readSize        = 0;
            Int64 currentChangeId = 0;
            int   j = 0;

            while ((readSize++ < 50) && (currentChangeId < webSpeciesObservationChange.MaxChangeId))
            {
                currentChangeId = webSpeciesObservationChange.MaxChangeId;

                context.GetSpeciesObservationDatabase().SetMaxChangeId(dataProvider.Id, webSpeciesObservationChange.MaxChangeId);

                // CREATED
                AddNewSpeciesObservations(webSpeciesObservationChange, speciesObservationChange, kulProcess, mappings, context, connectorServer, dataProvider, out sumNoOfCreated, out sumNoOfCreatedErrors);

                /* int i = 0;
                 * int noOfCreated, noOfCreatedErrors;
                 * foreach (Proxy.KulService.WebSpeciesObservation kulSpeciesObservation in webSpeciesObservationChange.CreatedSpeciesObservations)
                 * {
                 *  WebData webData = new WebData { DataFields = new List<WebDataField>() };
                 *
                 *  foreach (WebSpeciesObservationField webSpeciesObservationField in kulSpeciesObservation.Fields)
                 *  {
                 *      WebDataField webDataField = new WebDataField
                 *                                      {
                 *                                          Information = webSpeciesObservationField.Information,
                 *                                          Name = webSpeciesObservationField.Property.Id.ToString(),
                 *                                          Type = (WebDataType)webSpeciesObservationField.Type,
                 *                                          Unit = webSpeciesObservationField.Unit,
                 *                                          Value = webSpeciesObservationField.Value.CheckInjection()
                 *                                      };
                 *
                 *      if (webDataField.IsNotNull())
                 *      {
                 *          webData.DataFields.Add(webDataField);
                 *      }
                 *  }
                 *
                 *  // map webdata
                 *  HarvestSpeciesObservation harvestSpeciesObservation = kulProcess.ProcessObservation(webData, mappings, context);
                 *
                 *  speciesObservationChange.CreatedSpeciesObservations.Add(harvestSpeciesObservation);
                 *
                 *  if (decimal.Remainder(++i, 1000) != 0)
                 *  {
                 *      continue;
                 *  }
                 *
                 *  // write every 10000 observation to database to avoid memory problems
                 *  connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors);
                 *
                 *  sumNoOfCreated += noOfCreated;
                 *  sumNoOfCreatedErrors += noOfCreatedErrors;
                 *  speciesObservationChange.CreatedSpeciesObservations.Clear();
                 * }
                 *
                 * connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors);
                 *
                 * sumNoOfCreated += noOfCreated;
                 * sumNoOfCreatedErrors += noOfCreatedErrors;
                 * speciesObservationChange.CreatedSpeciesObservations.Clear();
                 */

                // UPDATED
                int i = 0;
                int noOfUpdated, noOfUpdatedErrors;
                foreach (Proxy.KulService.WebSpeciesObservation kulSpeciesObservation in webSpeciesObservationChange.UpdatedSpeciesObservations)
                {
                    WebData webData = new WebData {
                        DataFields = new List <WebDataField>()
                    };

                    foreach (WebSpeciesObservationField webSpeciesObservationField in kulSpeciesObservation.Fields)
                    {
                        WebDataField webDataField = new WebDataField
                        {
                            Information = webSpeciesObservationField.Information,
                            Name        = webSpeciesObservationField.Property.Id.ToString(),
                            Type        = (WebDataType)webSpeciesObservationField.Type,
                            Unit        = webSpeciesObservationField.Unit,
                            Value       = webSpeciesObservationField.Value.CheckInjection()
                        };

                        if (webDataField.IsNotNull())
                        {
                            webData.DataFields.Add(webDataField);
                        }
                    }

                    // map webdata
                    HarvestSpeciesObservation harvestSpeciesObservation = kulProcess.ProcessObservation(webData, mappings, context);

                    speciesObservationChange.UpdatedSpeciesObservations.Add(harvestSpeciesObservation);

                    if (decimal.Remainder(++i, 1000) != 0)
                    {
                        continue;
                    }

                    // write every 10000 observation to database to avoid memory problems
                    connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.UpdatedSpeciesObservations, dataProvider, out noOfUpdated, out noOfUpdatedErrors);

                    sumNoOfUpdated       += noOfUpdated;
                    sumNoOfUpdatedErrors += noOfUpdatedErrors;
                    speciesObservationChange.UpdatedSpeciesObservations.Clear();
                }

                connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.UpdatedSpeciesObservations, dataProvider, out noOfUpdated, out noOfUpdatedErrors);

                sumNoOfCreated       += noOfUpdated;
                sumNoOfCreatedErrors += noOfUpdatedErrors;
                speciesObservationChange.UpdatedSpeciesObservations.Clear();

                // DELETED
                this.RemoveDeletedSpeciesObservations(webSpeciesObservationChange, speciesObservationChange, kulProcess, mappings, context, connectorServer, dataProvider, out sumNoOfDeleted, out sumNoOfDeletedErrors);

                /*
                 * i = 0;
                 * int noOfDeleted = 0, noOfDeletedErrors = 0;
                 * speciesObservationChange.DeletedSpeciesObservationGuids = new List<String>();
                 *
                 * foreach (String kulSpeciesObservation in webSpeciesObservationChange.DeletedSpeciesObservationGuids)
                 * {
                 *  // if (adsSpeciesObservation.DatabaseId == 99) continue;
                 *  String id = kulSpeciesObservation.Substring(kulSpeciesObservation.LastIndexOf('.') + 1);
                 *  speciesObservationChange.DeletedSpeciesObservationGuids.Add(id);
                 *
                 *  if (decimal.Remainder(++i, 1000) != 0)
                 *  {
                 *      continue;
                 *  }
                 *
                 *  // write every 10000 observation to database to avoid memory problems
                 *  connectorServer.DeleteSpeciesObservations(
                 *      context,
                 *      speciesObservationChange.DeletedSpeciesObservationGuids,
                 *      dataProvider,
                 *      out noOfDeleted,
                 *      out noOfDeletedErrors);
                 *  sumNoOfDeleted += noOfDeleted;
                 *  sumNoOfDeletedErrors += noOfDeletedErrors;
                 *  speciesObservationChange.DeletedSpeciesObservationGuids.Clear();
                 * }
                 *
                 * // write remaining observations to database
                 * connectorServer.DeleteSpeciesObservations(
                 *  context,
                 *  speciesObservationChange.DeletedSpeciesObservationGuids,
                 *  dataProvider,
                 *  out noOfDeleted,
                 *  out noOfDeletedErrors);
                 * sumNoOfDeleted += noOfDeleted;
                 * sumNoOfDeletedErrors += noOfDeletedErrors;
                 * speciesObservationChange.DeletedSpeciesObservationGuids.Clear();
                 */
                // HANDLE LOOP OVER CHANGEID
                webSpeciesObservationChange = WebServiceProxy.KulService.GetSpeciesObservationChangeAsSpecies(changedFrom,
                                                                                                              isChangedFromSpecified,
                                                                                                              changedTo,
                                                                                                              isChangedToSpecified,
                                                                                                              webSpeciesObservationChange.MaxChangeId + 1,
                                                                                                              isChangeIdspecified,
                                                                                                              maxReturnedChanges);
                if (decimal.Remainder(++j, 10) != 0)
                {
                    continue;
                }

                Debug.WriteLine(webSpeciesObservationChange.MaxChangeId + " : count created: " + sumNoOfCreated);
            }

            Debug.WriteLine("end :" + webSpeciesObservationChange.MaxChangeId + " : count created: " + sumNoOfCreated);

            // Log latest harvest date for the data provider
            // Use changeFrom since changedTo is calculated (+1 day)
            context.GetSpeciesObservationDatabase().SetDataProviderLatestHarvestDate(dataProvider.Id, changedFrom);

            context.GetSpeciesObservationDatabase()
            .LogHarvestRead(context, dataProvider, changedFrom, changedTo, stopwatch.ElapsedMilliseconds, sumNoOfCreated, sumNoOfCreatedErrors, sumNoOfUpdated, sumNoOfUpdatedErrors, sumNoOfDeleted, sumNoOfDeletedErrors, currentChangeId);
            stopwatch.Stop();
        }
예제 #25
0
        /// <summary>
        /// Get information about species observations that has changed.
        /// The service contains observations that are aggregated and has start
        /// and end dates that are set to the first and last day of every month.
        /// </summary>
        /// <param name="changedFrom">Start date for changes.</param>
        /// <param name="changedTo">End date for changes.</param>
        /// <param name="mappings">The mappings.</param>
        /// <param name="context">Web service context.</param>
        /// <param name="connectorServer">The connector server.</param>
        /// <returns>
        /// Returns true if there are more species
        /// observations to retrieve for current date.
        /// </returns>
        public Boolean GetSpeciesObservationChange(DateTime changedFrom,
                                                   DateTime changedTo,
                                                   List <HarvestMapping> mappings,
                                                   WebServiceContext context,
                                                   IConnectorServer connectorServer)
        {
            Dictionary <String, WebSpeciesObservation> updatedSpeciesObservations;
            Int32 minutes;
            Int64 maxChangeId;

            // Wait for MVM service to be ready for use.
            for (minutes = 0; minutes < 60; minutes++)
            {
                if (WebServiceProxy.MvmService.IsReadyToUse())
                {
                    break;
                }
                else
                {
                    // Wait one minute for MVM service to be ready for use.
                    Thread.Sleep(60000);
                }
            }

            if ((minutes == 60) && !(WebServiceProxy.MvmService.IsReadyToUse()))
            {
                // Can not wait any longer for MVM service to be ready.
                return(false);
            }

            SpeciesObservationChange speciesObservationChange = new SpeciesObservationChange();

            speciesObservationChange.CreatedSpeciesObservations = new List <HarvestSpeciesObservation>();
            WebSpeciesObservationChange webSpeciesObservationChange;

            webSpeciesObservationChange = new WebSpeciesObservationChange();
            webSpeciesObservationChange.CreatedSpeciesObservations     = new List <WebSpeciesObservation>();
            webSpeciesObservationChange.DeletedSpeciesObservationGuids = new List <String>();
            webSpeciesObservationChange.UpdatedSpeciesObservations     = new List <WebSpeciesObservation>();

            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

            MvmProcess mvmProcess = new MvmProcess();
            WebSpeciesObservationDataProvider dataProvider = GetSpeciesObservationDataProvider(context);

            maxChangeId = dataProvider.MaxChangeId;
            for (Int32 index = 0; index < 10; index++)
            {
                WebSpeciesObservationChange webSpeciesObservationChangeTemp = WebServiceProxy.MvmService.GetSpeciesObservationChangeAsSpecies(DateTime.Now,
                                                                                                                                              false,
                                                                                                                                              DateTime.Now,
                                                                                                                                              false,
                                                                                                                                              maxChangeId,
                                                                                                                                              true,
                                                                                                                                              Settings.Default.MaxSpeciesObservationsFromMvm);
                if (webSpeciesObservationChangeTemp.CreatedSpeciesObservations.IsNotEmpty())
                {
                    webSpeciesObservationChange.CreatedSpeciesObservations.AddRange(webSpeciesObservationChangeTemp.CreatedSpeciesObservations);
                }

                if (webSpeciesObservationChangeTemp.DeletedSpeciesObservationGuids.IsNotEmpty())
                {
                    webSpeciesObservationChange.DeletedSpeciesObservationGuids.AddRange(webSpeciesObservationChangeTemp.DeletedSpeciesObservationGuids);
                }

                if (webSpeciesObservationChangeTemp.UpdatedSpeciesObservations.IsNotEmpty())
                {
                    webSpeciesObservationChange.UpdatedSpeciesObservations.AddRange(webSpeciesObservationChangeTemp.UpdatedSpeciesObservations);
                }

                if (maxChangeId < webSpeciesObservationChangeTemp.MaxChangeId)
                {
                    maxChangeId = webSpeciesObservationChangeTemp.MaxChangeId;
                }
                else
                {
                    // No more species observation changes are available.
                    break;
                }
            }

            // Run all created and updated together as one list.
            updatedSpeciesObservations = new Dictionary <String, WebSpeciesObservation>();
            AddSpeciesObservations(updatedSpeciesObservations, webSpeciesObservationChange.UpdatedSpeciesObservations);
            AddSpeciesObservations(updatedSpeciesObservations, webSpeciesObservationChange.CreatedSpeciesObservations);
            List <WebSpeciesObservation> createdAndUpdatedObservations = new List <WebSpeciesObservation>();

            createdAndUpdatedObservations.AddRange(updatedSpeciesObservations.Values);

            // Handle created and updated species observations.
            int noOfCreated = 0, noOfCreatedErrors = 0;

            if (createdAndUpdatedObservations.IsNotEmpty())
            {
                foreach (WebSpeciesObservation mvmSpeciesObservation in createdAndUpdatedObservations)
                {
                    WebData webData = new WebData {
                        DataFields = new List <WebDataField>()
                    };
                    foreach (WebSpeciesObservationField webSpeciesObservationField in mvmSpeciesObservation.Fields)
                    {
                        WebDataField webDataField = new WebDataField();
                        webDataField.LoadData(webSpeciesObservationField);
                        webData.DataFields.Add(webDataField);
                    }

                    // Map and add webdata to the 'created collection'
                    speciesObservationChange.CreatedSpeciesObservations.Add(mvmProcess.ProcessObservation(webData, mappings, context));
                }

                connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors);
            }

            // Handle deleted species observtions.
            int noOfDeleted = 0, noOfDeletedErrors = 0;

            speciesObservationChange.DeletedSpeciesObservationGuids = new List <String>();

            if (webSpeciesObservationChange.DeletedSpeciesObservationGuids.IsNotEmpty())
            {
                foreach (String mvmSpeciesObservation in webSpeciesObservationChange.DeletedSpeciesObservationGuids)
                {
                    String id = mvmSpeciesObservation.Substring(mvmSpeciesObservation.LastIndexOf(':') + 1);
                    speciesObservationChange.DeletedSpeciesObservationGuids.Add(id);
                }

                connectorServer.DeleteSpeciesObservations(context, speciesObservationChange.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors);
            }

            Debug.WriteLine(maxChangeId + " : count created: " + noOfCreated);

            context.GetSpeciesObservationDatabase().LogHarvestRead(
                context,
                dataProvider,
                changedFrom,
                changedTo,
                stopwatch.ElapsedMilliseconds,
                noOfCreated,
                noOfCreatedErrors,
                0,
                0,
                noOfDeleted,
                noOfDeletedErrors,
                maxChangeId);
            stopwatch.Stop();

            if (maxChangeId > 0)
            {
                context.GetSpeciesObservationDatabase().SetMaxChangeId(dataProvider.Id, maxChangeId);
            }
            // else: No changes was retrieved. There are no more changes available right now.

            return(false);
        }
        /// <summary>
        /// Get information about species observations
        /// that has changed in the specified date range or
        /// from a specified changeId.
        /// Only date part of parameters changedFrom and changedTo
        /// are used. It does not matter what time of day that is set
        /// in parameters changedFrom and changedTo.
        /// </summary>
        /// <param name="changedFrom">
        /// Changed from date.
        /// </param>
        /// <param name="isChangedFromSpecified">
        /// Is changed from specified.
        /// </param>
        /// <param name="changedTo">
        /// Changed to date.
        /// </param>
        /// <param name="isChangedToSpecified">
        /// Is changed to specified.
        /// </param>
        /// <param name="changeId">
        /// From witch change id.
        /// </param>
        /// <param name="isChangeIdspecified">
        /// Is changed id specified.
        /// </param>
        /// <param name="maxReturnedChanges">
        /// Max number of observations returned.
        /// </param>
        /// <param name="mappings">
        /// The mapping list.
        /// </param>
        /// <param name="context">
        /// The web service context.
        /// </param>
        /// <param name="connectorServer">
        /// The connector service.
        /// </param>
        public void GetSpeciesObservationChange(DateTime changedFrom,
                                                Boolean isChangedFromSpecified,
                                                DateTime changedTo,
                                                Boolean isChangedToSpecified,
                                                Int64 changeId,
                                                Boolean isChangeIdspecified,
                                                Int64 maxReturnedChanges,
                                                List <HarvestMapping> mappings,
                                                WebServiceContext context,
                                                IConnectorServer connectorServer)
        {
            SpeciesObservationChange speciesObservationChange = new SpeciesObservationChange();

            speciesObservationChange.CreatedSpeciesObservations = new List <HarvestSpeciesObservation>();
            speciesObservationChange.UpdatedSpeciesObservations = new List <HarvestSpeciesObservation>();

            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

            int sumNoOfCreated = 0, sumNoOfCreatedErrors = 0,
                sumNoOfUpdated = 0, sumNoOfUpdatedErrors = 0,
                sumNoOfDeleted = 0, sumNoOfDeletedErrors = 0;

            NorsProcess norsProcess = new NorsProcess();
            WebSpeciesObservationDataProvider dataProvider = GetSpeciesObservationDataProvider(context);

            WebSpeciesObservationChange webSpeciesObservationChange = WebServiceProxy.NorsService.GetSpeciesObservationChangeAsSpecies(changedFrom,
                                                                                                                                       isChangedFromSpecified,
                                                                                                                                       changedTo,
                                                                                                                                       isChangedToSpecified,
                                                                                                                                       changeId,
                                                                                                                                       isChangeIdspecified,
                                                                                                                                       maxReturnedChanges);

            // LOOP OVER CHANGEID
            // Denna verkar inte klara mer än ca 100 obsar så det behövs en loop över dessa...
            Int32 readSize        = 0;
            Int64 currentChangeId = 0;
            int   j = 0;

            while ((readSize++ < 50) && (currentChangeId < webSpeciesObservationChange.MaxChangeId))
            {
                currentChangeId = webSpeciesObservationChange.MaxChangeId;

                context.GetSpeciesObservationDatabase().SetMaxChangeId(dataProvider.Id, webSpeciesObservationChange.MaxChangeId);

                // CREATED
                int i = 0;
                int noOfCreated, noOfCreatedErrors;
                foreach (Proxy.NorsService.WebSpeciesObservation norsSpeciesObservation in webSpeciesObservationChange.CreatedSpeciesObservations)
                {
                    WebData webData = new WebData();
                    webData.DataFields = new List <WebDataField>();

                    foreach (WebSpeciesObservationField webSpeciesObservationField in norsSpeciesObservation.Fields)
                    {
                        WebDataField webDataField = new WebDataField();
                        webDataField.Information = webSpeciesObservationField.Information;
                        webDataField.Name        = webSpeciesObservationField.Property.Id.ToString();
                        webDataField.Type        = (WebDataType)webSpeciesObservationField.Type;
                        webDataField.Unit        = webSpeciesObservationField.Unit;
                        webDataField.Value       = webSpeciesObservationField.Value.CheckInjection();

                        if (webDataField.IsNotNull())
                        {
                            webData.DataFields.Add(webDataField);
                            ////Debug.Write(webDataField.Name + " : ");
                            ////Debug.Write(webDataField.Value + " : ");
                            ////Debug.Write(webDataField.Type + " : ");
                            ////Debug.Write(webDataField.Unit + " : ");
                            ////Debug.WriteLine(webDataField.Information);
                        }
                    }

                    // map webdata
                    HarvestSpeciesObservation harvestSpeciesObservation = norsProcess.ProcessObservation(webData, mappings, context);

                    speciesObservationChange.CreatedSpeciesObservations.Add(harvestSpeciesObservation);

                    if (decimal.Remainder(++i, 10000) != 0)
                    {
                        continue;
                    }

                    // write every 10000 observation to database to avoid memory problems
                    connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors);

                    sumNoOfCreated       += noOfCreated;
                    sumNoOfCreatedErrors += noOfCreatedErrors;
                    speciesObservationChange.CreatedSpeciesObservations.Clear();
                }

                connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors);

                sumNoOfCreated       += noOfCreated;
                sumNoOfCreatedErrors += noOfCreatedErrors;
                speciesObservationChange.CreatedSpeciesObservations.Clear();

                // UPDATED
                i = 0;
                int noOfUpdated, noOfUpdatedErrors;
                foreach (Proxy.NorsService.WebSpeciesObservation norsSpeciesObservation in webSpeciesObservationChange.UpdatedSpeciesObservations)
                {
                    WebData webData = new WebData();
                    webData.DataFields = new List <WebDataField>();

                    foreach (WebSpeciesObservationField webSpeciesObservationField in norsSpeciesObservation.Fields)
                    {
                        WebDataField webDataField = new WebDataField();
                        webDataField.Information = webSpeciesObservationField.Information;
                        webDataField.Name        = webSpeciesObservationField.Property.Id.ToString();
                        webDataField.Type        = (WebDataType)webSpeciesObservationField.Type;
                        webDataField.Unit        = webSpeciesObservationField.Unit;
                        webDataField.Value       = webSpeciesObservationField.Value.CheckInjection();

                        if (webDataField.IsNotNull())
                        {
                            webData.DataFields.Add(webDataField);
                        }
                    }

                    // map webdata
                    HarvestSpeciesObservation harvestSpeciesObservation = norsProcess.ProcessObservation(webData, mappings, context);

                    speciesObservationChange.UpdatedSpeciesObservations.Add(harvestSpeciesObservation);

                    if (decimal.Remainder(++i, 10000) != 0)
                    {
                        continue;
                    }

                    // write every 10000 observation to database to avoid memory problems
                    connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.UpdatedSpeciesObservations, dataProvider, out noOfUpdated, out noOfUpdatedErrors);

                    sumNoOfUpdated       += noOfUpdated;
                    sumNoOfUpdatedErrors += noOfUpdatedErrors;
                    speciesObservationChange.UpdatedSpeciesObservations.Clear();
                }

                connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.UpdatedSpeciesObservations, dataProvider, out noOfUpdated, out noOfUpdatedErrors);

                sumNoOfCreated       += noOfUpdated;
                sumNoOfCreatedErrors += noOfUpdatedErrors;
                speciesObservationChange.UpdatedSpeciesObservations.Clear();

                // DELETED
                i = 0;
                int noOfDeleted = 0, noOfDeletedErrors = 0;
                speciesObservationChange.DeletedSpeciesObservationGuids = new List <String>();

                foreach (String norsSpeciesObservation in webSpeciesObservationChange.DeletedSpeciesObservationGuids)
                {
                    // if (adsSpeciesObservation.DatabaseId == 99) continue;
                    String id = norsSpeciesObservation.Substring(norsSpeciesObservation.LastIndexOf('.') + 1);
                    speciesObservationChange.DeletedSpeciesObservationGuids.Add(id);

                    if (decimal.Remainder(++i, 10000) != 0)
                    {
                        continue;
                    }

                    // write every 10000 observation to database to avoid memory problems
                    connectorServer.DeleteSpeciesObservations(
                        context,
                        speciesObservationChange.DeletedSpeciesObservationGuids,
                        dataProvider,
                        out noOfDeleted,
                        out noOfDeletedErrors);
                    sumNoOfDeleted       += noOfDeleted;
                    sumNoOfDeletedErrors += noOfDeletedErrors;
                    speciesObservationChange.DeletedSpeciesObservationGuids.Clear();
                }

                // write remaining observations to database
                connectorServer.DeleteSpeciesObservations(
                    context,
                    speciesObservationChange.DeletedSpeciesObservationGuids,
                    dataProvider,
                    out noOfDeleted,
                    out noOfDeletedErrors);
                sumNoOfDeleted       += noOfDeleted;
                sumNoOfDeletedErrors += noOfDeletedErrors;
                speciesObservationChange.DeletedSpeciesObservationGuids.Clear();

                // HANDLE LOOP OVER CHANGEID
                webSpeciesObservationChange = WebServiceProxy.NorsService.GetSpeciesObservationChangeAsSpecies(changedFrom,
                                                                                                               isChangedFromSpecified,
                                                                                                               changedTo,
                                                                                                               isChangedToSpecified,
                                                                                                               webSpeciesObservationChange.MaxChangeId + 1,
                                                                                                               isChangeIdspecified,
                                                                                                               maxReturnedChanges);
                if (decimal.Remainder(++j, 10) != 0)
                {
                    continue;
                }

                Debug.WriteLine(webSpeciesObservationChange.MaxChangeId + " : count created: " + sumNoOfCreated);
            }

            Debug.WriteLine("end :" + webSpeciesObservationChange.MaxChangeId + " : count created: " + sumNoOfCreated);

            // Log latest harvest date for the data provider
            // Use changeFrom since changedTo is calculated (+1 day)
            context.GetSpeciesObservationDatabase().SetDataProviderLatestHarvestDate(dataProvider.Id, changedFrom);

            context.GetSpeciesObservationDatabase()
            .LogHarvestRead(
                context,
                dataProvider,
                changedFrom,
                changedTo,
                stopwatch.ElapsedMilliseconds,
                sumNoOfCreated,
                sumNoOfCreatedErrors,
                sumNoOfUpdated,
                sumNoOfUpdatedErrors,
                sumNoOfDeleted,
                sumNoOfDeletedErrors,
                currentChangeId);
            stopwatch.Stop();
        }
        /// <summary> The add new species observations. </summary>
        /// <param name="webSpeciesObservationChange"> The web species observation change. </param>
        /// <param name="speciesObservationChange"> The species observation change. </param>
        /// <param name="kulProcess"> The kul Process. </param>
        /// <param name="mappings"> The mappings. </param>
        /// <param name="context"> The context. </param>
        /// <param name="connectorServer"> The connector Server. </param>
        /// <param name="dataProvider"> The data Provider. </param>
        /// <param name="sumNoOfCreated"> The sum No Of Created. </param>
        /// <param name="sumNoOfCreatedErrors"> The sum No Of Created Errors. </param>
        private void AddNewSpeciesObservations(
            WebSpeciesObservationChange webSpeciesObservationChange,
            SpeciesObservationChange speciesObservationChange,
            KulProcess kulProcess,
            List <HarvestMapping> mappings,
            WebServiceContext context,
            IConnectorServer connectorServer,
            WebSpeciesObservationDataProvider dataProvider,
            out int sumNoOfCreated,
            out int sumNoOfCreatedErrors)
        {
            int observationCount = 0;
            int noOfCreated, noOfCreatedErrors;

            sumNoOfCreated       = 0;
            sumNoOfCreatedErrors = 0;

            foreach (Proxy.KulService.WebSpeciesObservation kulSpeciesObservation in webSpeciesObservationChange.CreatedSpeciesObservations)
            {
                WebData webData = new WebData {
                    DataFields = new List <WebDataField>()
                };

                foreach (WebSpeciesObservationField webSpeciesObservationField in kulSpeciesObservation.Fields)
                {
                    WebDataField webDataField = new WebDataField
                    {
                        Information = webSpeciesObservationField.Information,
                        Name        = webSpeciesObservationField.Property.Id.ToString(),
                        Type        = (WebDataType)webSpeciesObservationField.Type,
                        Unit        = webSpeciesObservationField.Unit,
                        Value       = webSpeciesObservationField.Value.CheckInjection()
                    };

                    webData.DataFields.Add(webDataField);
                }

                // map webdata
                HarvestSpeciesObservation harvestSpeciesObservation = kulProcess.ProcessObservation(webData, mappings, context);

                speciesObservationChange.CreatedSpeciesObservations.Add(harvestSpeciesObservation);

                if (decimal.Remainder(++observationCount, 1000) != 0)
                {
                    continue;
                }

                // write every 10000 observation to database to avoid memory problems
                connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors);

                sumNoOfCreated       += noOfCreated;
                sumNoOfCreatedErrors += noOfCreatedErrors;
                speciesObservationChange.CreatedSpeciesObservations.Clear();
            }

            connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors);

            sumNoOfCreated       += noOfCreated;
            sumNoOfCreatedErrors += noOfCreatedErrors;
            speciesObservationChange.CreatedSpeciesObservations.Clear();
        }