예제 #1
0
        /// <summary>
        /// Update species observations.
        /// </summary>
        /// <param name="context">Web service request context.</param>
        /// <param name="speciesObservations">Updated species observations.</param>
        /// <param name="dataProvider">The dataProvider.</param>
        /// <param name="connectorServer">The connector server.</param>
        /// <param name="mappings">The mappings.</param>
        /// <param name="noOfUpdated">No of updated species observations.</param>
        /// <param name="noOfUpdatedErrors">No of updating errors.</param>
        public void UpdateSpeciesObservations(WebServiceContext context,
                                              List <WebData> speciesObservations,
                                              WebSpeciesObservationDataProvider dataProvider,
                                              IConnectorServer connectorServer,
                                              List <HarvestMapping> mappings,
                                              out int noOfUpdated,
                                              out int noOfUpdatedErrors)
        {
            noOfUpdated       = 0;
            noOfUpdatedErrors = 0;
            ArtportalenProcess artportalenProcess = new ArtportalenProcess();

            if (speciesObservations.IsNotEmpty())
            {
                List <HarvestSpeciesObservation> updatedSpeciesObservations = new List <HarvestSpeciesObservation>();
                for (Int32 index = speciesObservations.Count - 1; index >= 0; index--)
                {
                    HarvestSpeciesObservation harvestSpeciesObservation = artportalenProcess.ProcessObservation(speciesObservations[index], mappings, context);
                    updatedSpeciesObservations.Add(harvestSpeciesObservation);
                    speciesObservations.RemoveAt(index);
                    if (updatedSpeciesObservations.Count >= 10000)
                    {
                        break;
                    }
                }

                connectorServer.UpdateSpeciesObservations(context,
                                                          updatedSpeciesObservations,
                                                          dataProvider,
                                                          out noOfUpdated,
                                                          out noOfUpdatedErrors);
            }
        }
예제 #2
0
        /// <summary>
        /// Add information to the web service log.
        /// </summary>
        /// <param name="context">Web service request context.</param>
        /// <param name="dataProvider">Log text.</param>
        /// <param name="changedFrom">Changed from date.</param>
        /// <param name="changedTo">Changed to date.</param>
        /// <param name="processtime">How long time did the process take.</param>
        /// <param name="noOfCreated">Number of created observations.</param>
        /// <param name="noOfCreatedErrors">Number of errors when created observations.</param>
        /// <param name="noOfUpdated">Number of updated observations.</param>
        /// <param name="noOfUpdatedErrors">Number of errors when updated observations.</param>
        /// <param name="noOfDeleted">Number of deleted observations.</param>
        /// <param name="noOfDeletedErrors">Number of errors when deleted observations.</param>
        /// <param name="maxChangeId">Latest change id that was harvest from data source. -1 means no changeid is used for this dataprovider.</param>
        public virtual void LogHarvestRead(WebServiceContext context,
                                           WebSpeciesObservationDataProvider dataProvider,
                                           DateTime changedFrom,
                                           DateTime changedTo,
                                           Int64 processtime,
                                           Int64 noOfCreated,
                                           Int64 noOfCreatedErrors,
                                           Int64 noOfUpdated,
                                           Int64 noOfUpdatedErrors,
                                           Int64 noOfDeleted,
                                           Int64 noOfDeletedErrors,
                                           Int64 maxChangeId = -1)
        {
            string action = String.Format("Update from {0}, date: {1}{2}", dataProvider.Name, changedFrom.ToShortDateString(), (maxChangeId > -1 ? ", maxChangeId: " + maxChangeId.ToString() : String.Empty));

            string result =
                String.Format(
                    "Created: {0} ({1} errors), Updated: {2} ({3} errors), Deleted: {4} ({5} errors)",
                    noOfCreated,
                    noOfCreatedErrors,
                    noOfUpdated,
                    noOfUpdatedErrors,
                    noOfDeleted,
                    noOfDeletedErrors);

            context.GetSpeciesObservationDatabase().WriteToLogStatistics(
                action,
                processtime,
                result);
        }
예제 #3
0
        /// <summary>
        /// Used to bridge to the private method CreateSpeciesObservations for the HarvestManagerTest.
        /// </summary>
        /// <param name="context">Web service context.</param>
        /// <param name="speciesObservations">Species observations.</param>
        /// <param name="dataProvider">Data provider.</param>
        /// <param name="changedFrom">Changed from date.</param>
        /// <param name="changedTo">Changed to date.</param>
        public static void TestCreateSpeciesObservations(WebServiceContext context,
                                                         SpeciesObservationChange speciesObservations,
                                                         WebSpeciesObservationDataProvider dataProvider,
                                                         DateTime changedFrom,
                                                         DateTime changedTo)
        {
            Stopwatch stopwatch = Stopwatch.StartNew();
            int       noOfUpdated, noOfUpdatedErrors, noOfDeleted, noOfDeletedErrors;

            ////ConnectorServer.CreateSpeciesObservations(context, speciesObservations.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors);
            ConnectorServer.UpdateSpeciesObservations(context, speciesObservations.UpdatedSpeciesObservations, dataProvider, out noOfUpdated, out noOfUpdatedErrors);
            ConnectorServer.DeleteSpeciesObservations(context, speciesObservations.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors);
            stopwatch.Stop();
            context.GetSpeciesObservationDatabase().LogHarvestRead(context,
                                                                   dataProvider,
                                                                   changedFrom,
                                                                   changedTo,
                                                                   stopwatch.ElapsedMilliseconds,
                                                                   0,
                                                                   0,
                                                                   noOfUpdated,
                                                                   noOfUpdatedErrors,
                                                                   noOfDeleted,
                                                                   noOfDeletedErrors);
        }
        /// <summary>
        /// Get information about species observations
        /// that has changed in the specified date range.
        /// 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">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)
        {
            // DOES NOT WORK EQUAL TO OTHERS. UNTIL FIX IT RECIEVES ALL DATA IN NORS
            ////

            Int64    maxReturnedChanges = 100;
            DateTime calcChangedTo      = changedTo.AddDays(1);

            WebSpeciesObservationDataProvider dataProvider = GetSpeciesObservationDataProvider(context);
            Int64 nextChangeId = context.GetSpeciesObservationDatabase().GetMaxChangeId(dataProvider.Id) + 1;

            GetSpeciesObservationChange(changedFrom,
                                        false,
                                        calcChangedTo,
                                        false,
                                        nextChangeId,
                                        true,
                                        maxReturnedChanges,
                                        mappings,
                                        context,
                                        connectorServer);
            return(false);
        }
        /// <summary> The remove deleted 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="sumNoOfDeleted"> The sum No Of Deleted. </param>
        /// <param name="sumNoOfDeletedErrors"> The sum No Of Deleted Errors. </param>
        private void RemoveDeletedSpeciesObservations(
            WebSpeciesObservationChange webSpeciesObservationChange,
            SpeciesObservationChange speciesObservationChange,
            KulProcess kulProcess,
            List <HarvestMapping> mappings,
            WebServiceContext context,
            IConnectorServer connectorServer,
            WebSpeciesObservationDataProvider dataProvider,
            out int sumNoOfDeleted,
            out int sumNoOfDeletedErrors)
        {
            sumNoOfDeleted       = 0;
            sumNoOfDeletedErrors = 0;
            int observationCount = 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(++observationCount, 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();
        }
예제 #6
0
        /// <summary>
        /// Update species observations.
        /// </summary>
        /// <param name="context">Web service request context.</param>
        /// <param name="speciesObservationIds">Ids for updated species observations.</param>
        /// <param name="dataProvider">The dataProvider.</param>
        /// <param name="connectorServer">The connector server.</param>
        /// <param name="mappings">The mappings.</param>
        /// <param name="noOfUpdated">No of updated species observations.</param>
        /// <param name="noOfUpdatedErrors">No of updating errors.</param>
        public void UpdateSpeciesObservations(WebServiceContext context,
                                              List <Int64> speciesObservationIds,
                                              WebSpeciesObservationDataProvider dataProvider,
                                              IConnectorServer connectorServer,
                                              List <HarvestMapping> mappings,
                                              out int noOfUpdated,
                                              out int noOfUpdatedErrors)
        {
            List <Int64>   tempSpeciesObservtionIds;
            List <WebData> updatedSpeciesObservations;
            WebData        webData;

            noOfUpdated       = 0;
            noOfUpdatedErrors = 0;
            if (speciesObservationIds.IsNotEmpty())
            {
                tempSpeciesObservtionIds = new List <Int64>();
                for (Int32 index = speciesObservationIds.Count - 1; index >= 0; index--)
                {
                    tempSpeciesObservtionIds.Add(speciesObservationIds[index]);
                    speciesObservationIds.RemoveAt(index);
                    if (tempSpeciesObservtionIds.Count >= 10000)
                    {
                        break;
                    }
                }

                updatedSpeciesObservations = new List <WebData>();
                using (ArtportalenServer artportalenServer = new ArtportalenServer())
                {
                    // Get updated observations from Artportalen.
                    using (DataReader dataReader = artportalenServer.GetSpeciesObservationsByIds(tempSpeciesObservtionIds))
                    {
                        while (dataReader.Read())
                        {
                            webData = new WebData();
                            webData.LoadData(dataReader);
                            updatedSpeciesObservations.Add(webData);
                        }
                    }

                    UpdateSpeciesObservations(context,
                                              updatedSpeciesObservations,
                                              dataProvider,
                                              connectorServer,
                                              mappings,
                                              out noOfUpdated,
                                              out noOfUpdatedErrors);
                }
            }
        }
        public void GetSpeciesObservationChange()
        {
            DateTime changedFrom = new DateTime(2012, 10, 13);
            DateTime changedTo   = new DateTime(2012, 10, 15);

            ArtportalenConnector artportalenConnector = new ArtportalenConnector();

            List <WebSpeciesObservationFieldDescriptionExtended> webDarwinCoreFieldDescriptions = WebServiceData.MetadataManager.GetSpeciesObservationFieldDescriptionsExtended(GetContext(), true);

            WebSpeciesObservationDataProvider dataProvider = artportalenConnector.GetSpeciesObservationDataProvider(GetContext());

            var mappings = HarvestManager.CreateMappingList(webDarwinCoreFieldDescriptions, dataProvider.Id);

            artportalenConnector.GetSpeciesObservationChange(changedFrom, changedTo, mappings, GetContext(), new ConnectorServer());
        }
예제 #8
0
        public void GetSpeciesObservationChange_StandardSignature()
        {
            DateTime changedFrom = new DateTime(2010, 01, 1);
            DateTime changedTo   = new DateTime(2010, 1, 2);

            NorsConnector norsConnector = new NorsConnector();
            List <WebSpeciesObservationFieldDescriptionExtended> webDarwinCoreFieldDescriptions = WebServiceData.MetadataManager.GetSpeciesObservationFieldDescriptionsExtended(GetContext(), true);

            WebSpeciesObservationDataProvider dataProvider = norsConnector.GetSpeciesObservationDataProvider(GetContext());

            var mappings = HarvestManager.CreateMappingList(webDarwinCoreFieldDescriptions, dataProvider.Id);

            //norsConnector.GetSpeciesObservationChange(changedFrom, true, changedTo, true, 0, true, maxReturnedChanges, mappings, GetContext(), new ConnectorServer());
            norsConnector.GetSpeciesObservationChange(changedFrom, changedTo, mappings, GetContext(), new ConnectorServer());
        }
예제 #9
0
        /// <summary>
        /// Will get all changes from the first connection and return it to HarvestManagerTest.
        /// If you want to test more connectors, code must be rewritten.
        /// </summary>
        /// <param name="context">Web service context.</param>
        /// <param name="changedFrom">Changed from date.</param>
        /// <param name="changedTo">Changed to date.</param>
        /// <param name="dataProvider">Data provider.</param>
        public static void TestGetSpeciesObservationChange(WebServiceContext context,
                                                           DateTime changedFrom,
                                                           DateTime changedTo,
                                                           out WebSpeciesObservationDataProvider dataProvider)
        {
            IDataProviderConnector connector = Connectors[0];

            dataProvider = connector.GetSpeciesObservationDataProvider(context);

            // Read metadata from SpeciesObservationDatabase
            List <WebSpeciesObservationFieldDescriptionExtended> webDarwinCoreFieldDescriptions = WebServiceData.MetadataManager.GetSpeciesObservationFieldDescriptionsExtended(context, true);

            var             mappings        = CreateMappingList(webDarwinCoreFieldDescriptions, dataProvider.Id);
            ConnectorServer connectorServer = new ConnectorServer();

            connector.GetSpeciesObservationChange(changedFrom, changedTo, mappings, context, connectorServer);
        }
예제 #10
0
        /// <summary>
        /// Get all species observation data providers.
        /// No cache is used.
        /// </summary>
        /// <param name="context">Web service request context.</param>
        /// <returns>All species observation data providers.</returns>
        private List <WebSpeciesObservationDataProvider> GetSpeciesObservationDataProviders(WebServiceContext context)
        {
            List <WebSpeciesObservationDataProvider> dataProviders;
            WebSpeciesObservationDataProvider        dataProvider;

            // Data not in cache. Get information from database.
            dataProviders = new List <WebSpeciesObservationDataProvider>();
            using (DataReader dataReader = context.GetDatabase().GetSpeciesObservationDataProviders(context.Locale.Id))
            {
                while (dataReader.Read())
                {
                    dataProvider = new WebSpeciesObservationDataProvider();
                    dataProvider.LoadData(dataReader);
                    dataProviders.Add(dataProvider);
                }
            }

            return(dataProviders);
        }
예제 #11
0
        public void GetSpeciesObservationChange()
        {
            Int64 maxReturnedChanges = 100;

            DateTime changedFrom = new DateTime(2012, 3, 1);
            DateTime changedTo   = new DateTime(2014, 1, 1);

            NorsConnector norsConnector = new NorsConnector();
            List <WebSpeciesObservationFieldDescriptionExtended> webDarwinCoreFieldDescriptions = WebServiceData.MetadataManager.GetSpeciesObservationFieldDescriptionsExtended(GetContext(), true);

            WebSpeciesObservationDataProvider dataProvider = norsConnector.GetSpeciesObservationDataProvider(GetContext());

            var mappings = HarvestManager.CreateMappingList(webDarwinCoreFieldDescriptions, dataProvider.Id);

            while (changedFrom < changedTo)
            {
                norsConnector.GetSpeciesObservationChange(changedFrom, true, changedFrom.AddDays(1), true, 0, false, maxReturnedChanges, mappings, GetContext(), new ConnectorServer());
                changedFrom = changedFrom.AddDays(1);
            }
        }
예제 #12
0
        public void GetSpeciesObservationChange_ChangeId()
        {
            //DateTime changedFrom = new DateTime(2009, 11, 22);
            //DateTime changedTo = new DateTime(2009, 11, 24);

            DateTime changedFrom = new DateTime(2010, 1, 1);
            DateTime changedTo   = new DateTime(2011, 1, 1);

            Int64 changeId           = 0;
            Int64 maxReturnedChanges = 100;

            NorsConnector norsConnector = new NorsConnector();
            List <WebSpeciesObservationFieldDescriptionExtended> webDarwinCoreFieldDescriptions = WebServiceData.MetadataManager.GetSpeciesObservationFieldDescriptionsExtended(GetContext(), true);

            WebSpeciesObservationDataProvider dataProvider = norsConnector.GetSpeciesObservationDataProvider(GetContext());

            var mappings = HarvestManager.CreateMappingList(webDarwinCoreFieldDescriptions, dataProvider.Id);

            norsConnector.GetSpeciesObservationChange(changedFrom, false, changedTo, false, changeId, true, maxReturnedChanges, mappings, GetContext(), new ConnectorServer());
        }
        /// <summary>
        /// Insert all deleted observations into a DataTable
        /// If ok, add it to TempDelete
        /// If there are errors add the observation to speciesObservationErrorFieldTable.
        /// </summary>
        /// <param name="context">Web service request context.</param>
        /// <param name="speciesObservationGuids">GUIDs for deleted species observations.</param>
        /// <param name="dataProvider">The dataProvider.</param>
        /// <param name="noOfDeleted">No of deleted species observations.</param>
        /// <param name="noOfErrors">No of deleting errors.</param>
        public static void DeleteSpeciesObservations(WebServiceContext context,
                                                     List <String> speciesObservationGuids,
                                                     WebSpeciesObservationDataProvider dataProvider,
                                                     out int noOfDeleted,
                                                     out int noOfErrors)
        {
            noOfDeleted = 0;
            noOfErrors  = 0;
            if (speciesObservationGuids.IsNotEmpty())
            {
                DataTable deletedObservationTable = HarvestManager.GetDeletedObservationTable();

                foreach (string speciesObservation in speciesObservationGuids)
                {
                    HarvestManager.AddToTempDelete(deletedObservationTable, dataProvider, speciesObservation);
                    noOfDeleted++;
                }

                context.GetSpeciesObservationDatabase().AddTableData(deletedObservationTable);
            }
        }
        public void GetSpeciesObservationChange()
        {
            DateTime changedFrom = new DateTime(2009, 11, 03);
            DateTime changedTo   = new DateTime(2009, 11, 03);

            ObservationsdatabasenConnector obsdataConnector = new ObservationsdatabasenConnector();
            List <WebSpeciesObservationFieldDescriptionExtended> webDarwinCoreFieldDescriptions = WebServiceData.MetadataManager.GetSpeciesObservationFieldDescriptionsExtended(GetContext(), true);

            WebSpeciesObservationDataProvider dataProvider = obsdataConnector.GetSpeciesObservationDataProvider(GetContext());

            var mappings = HarvestManager.CreateMappingList(webDarwinCoreFieldDescriptions, dataProvider.Id);

            obsdataConnector.GetSpeciesObservationChange(changedFrom, changedTo, mappings, GetContext(), new ConnectorServer());

            //Assert.IsTrue(speciesObservationChange.CreatedSpeciesObservations.IsNotEmpty());

            //Assert.IsTrue(speciesObservationChange.UpdatedSpeciesObservations.IsNotEmpty());
            //Assert.IsTrue(speciesObservationChange.DeletedSpeciesObservationGuids.IsNotEmpty());
            //Assert.IsTrue(speciesObservationChange.CreatedSpeciesObservations[0].Fields[0].IsNotNull());
            //Assert.IsTrue(speciesObservationChange.UpdatedSpeciesObservations[0].Fields[0].IsNotNull());
            //Assert.IsTrue(speciesObservationChange.DeletedSpeciesObservationGuids[0].IsNotNull());
        }
예제 #15
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>
        /// 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>
        /// 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();
        }
예제 #18
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.
        /// 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">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)
        {
            DateTime calcChangedTo = changedTo.AddDays(1);

            calcChangedTo = new DateTime(calcChangedTo.Year, calcChangedTo.Month, calcChangedTo.Day);

            WebData webData;
            SpeciesObservationChange speciesObservationChange = new SpeciesObservationChange();

            WebSpeciesObservationDataProvider dataProvider = GetSpeciesObservationDataProvider(context);

            WebSpeciesObservationClass speciesObservationClass = new WebSpeciesObservationClass(SpeciesObservationClassId.DarwinCore);

            WebSpeciesObservationProperty reportedDateProp = new WebSpeciesObservationProperty(SpeciesObservationPropertyId.ReportedDate);

            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

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

            using (ObservationsdatabasenServer observationDatabasenServer = new ObservationsdatabasenServer())
            {
                ObservationsdatabasenProcess observationsdatabasenProcess = new ObservationsdatabasenProcess();

                // Get created and edited observations from Observationsdatabasen
                using (DataReader dataReader = observationDatabasenServer.GetSpeciesObservations(changedFrom, calcChangedTo))
                {
                    speciesObservationChange.CreatedSpeciesObservations = new List <HarvestSpeciesObservation>();
                    speciesObservationChange.UpdatedSpeciesObservations = new List <HarvestSpeciesObservation>();
                    int i = 0;
                    int noOfCreated, noOfCreatedErrors, noOfUpdated, noOfUpdatedErrors;

                    while (dataReader.Read())
                    {
                        webData = new WebData();
                        webData.LoadData(dataReader);
                        HarvestSpeciesObservation harvestSpeciesObservation = observationsdatabasenProcess.ProcessObservation(webData, mappings, context);

                        DateTime reportedDate = harvestSpeciesObservation.GetFieldValue(speciesObservationClass, reportedDateProp).WebParseDateTime();

                        // If reportedDate is earlier than changedFrom the observation is edited.
                        if (reportedDate < changedFrom)
                        {
                            speciesObservationChange.UpdatedSpeciesObservations.Add(harvestSpeciesObservation);
                        }
                        else
                        {
                            speciesObservationChange.CreatedSpeciesObservations.Add(harvestSpeciesObservation);
                        }

                        if (decimal.Remainder(++i, 10000) == 0)
                        {
                            // Write every 10000 observation to database to avoid memory problems
                            connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors);

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

                            sumNoOfCreated       += noOfCreated;
                            sumNoOfCreatedErrors += noOfCreatedErrors;
                            sumNoOfUpdated       += noOfUpdated;
                            sumNoOfUpdatedErrors += noOfUpdatedErrors;

                            speciesObservationChange.CreatedSpeciesObservations.Clear();
                            speciesObservationChange.UpdatedSpeciesObservations.Clear();
                        }
                    }

                    // Write the remaining observations to database
                    connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors);

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

                    sumNoOfCreated       += noOfCreated;
                    sumNoOfCreatedErrors += noOfCreatedErrors;
                    sumNoOfUpdated       += noOfUpdated;
                    sumNoOfUpdatedErrors += noOfUpdatedErrors;

                    speciesObservationChange.CreatedSpeciesObservations.Clear();
                    speciesObservationChange.UpdatedSpeciesObservations.Clear();
                }

                // Get deleted observations from Observationsdatabasen
                using (DataReader dataReader = observationDatabasenServer.GetDeletedObservations(changedFrom, calcChangedTo))
                {
                    speciesObservationChange.DeletedSpeciesObservationGuids = new List <String>();
                    int noOfDeleted, noOfDeletedErrors;
                    int i = 0;
                    while (dataReader.Read())
                    {
                        webData = new WebData();
                        webData.LoadData(dataReader);
                        String deletedCatalogNumber = observationsdatabasenProcess.ProcessDeletedObservation(webData);
                        speciesObservationChange.DeletedSpeciesObservationGuids.Add(deletedCatalogNumber);
                        if (decimal.Remainder(++i, 10000) == 0)
                        {
                            // 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();
                        }
                    }

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

                    sumNoOfDeleted       += noOfDeleted;
                    sumNoOfDeletedErrors += noOfDeletedErrors;

                    speciesObservationChange.DeletedSpeciesObservationGuids.Clear();
                }
            }

            // Log latest harvest date for the data provider
            context.GetSpeciesObservationDatabase().SetDataProviderLatestHarvestDate(dataProvider.Id, changedTo);

            context.GetSpeciesObservationDatabase().LogHarvestRead(context,
                                                                   dataProvider,
                                                                   changedFrom,
                                                                   changedTo,
                                                                   stopwatch.ElapsedMilliseconds,
                                                                   sumNoOfCreated,
                                                                   sumNoOfCreatedErrors,
                                                                   sumNoOfUpdated,
                                                                   sumNoOfUpdatedErrors,
                                                                   sumNoOfDeleted,
                                                                   sumNoOfDeletedErrors);
            stopwatch.Stop();
            return(false);
        }
예제 #20
0
        public void GetSpeciesObservationChange()
        {
            Int64 maxReturnedChanges = 100000;
            var   changedFrom        = new DateTime(2014, 7, 1);
            //// var changedFrom = new DateTime(1987, 7, 1);
            ////var changedTo = new DateTime(2015, 10, 29);
            var changedTo = new DateTime(2014, 9, 29);

            var kulConnector = new KulConnector();
            List <WebSpeciesObservationFieldDescriptionExtended> webDarwinCoreFieldDescriptions = WebServiceData.MetadataManager.GetSpeciesObservationFieldDescriptionsExtended(GetContext(), true);

            WebServiceContext context = GetContext();

            // Read meta data for current job
            var harvestJobManager = new HarvestJobManager(context);
            var harvestJob        = harvestJobManager.GetHarvestJob();

            WebSpeciesObservationDataProvider dataProvider = kulConnector.GetSpeciesObservationDataProvider(context);
            var dataProviderId = new List <int>()
            {
                dataProvider.Id
            };

            var mappings = HarvestManager.CreateMappingList(webDarwinCoreFieldDescriptions, dataProvider.Id);


            // Log data provider harvest status

            /*
             * context.GetSpeciesObservationDatabase().EmptyTempTables();
             * context.GetSpeciesObservationDatabase().CleanLogUpdateError();
             * context.GetSpeciesObservationDatabase().CleanLogUpdateErrorDuplicates();
             */

            context.GetSpeciesObservationDatabase().SetHarvestJobStatistics(dataProviderId, harvestJob.JobStatus, changedFrom);

            //// Stopwatch stopwatch1 = Stopwatch.StartNew();
            while (changedFrom < changedTo)
            {
                //// stopwatch1.Reset();
                //// stopwatch1 = Stopwatch.StartNew();
                kulConnector.GetSpeciesObservationChange(changedFrom, true, changedFrom.AddMonths(1), true, 0, false, maxReturnedChanges, mappings, GetContext(), new ConnectorServer());
                changedFrom = changedFrom.AddMonths(1);
                //// Debug.WriteLine("Harvest and fix: " + DateTime.Now.ToLongTimeString() + " - Time: " + stopwatch1.ElapsedMilliseconds);
            }


            // Log latest changed date (at data source), of modified information of harvested observations
            context.GetSpeciesObservationDatabase().SetDataProviderLatestChangedDate(dataProvider.Id);

            Stopwatch stopwatchM = Stopwatch.StartNew();
            string    logMessage = String.Empty;

            long stopwatchPrev = 0;

            context.GetSpeciesObservationDatabase().UpdateTempObservationId();
            logMessage   += " ID: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev);
            stopwatchPrev = stopwatchM.ElapsedMilliseconds;

            context.GetSpeciesObservationDatabase().CheckTaxonIdOnTemp();
            logMessage   += ", TAXON: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev);
            stopwatchPrev = stopwatchM.ElapsedMilliseconds;

            context.GetSpeciesObservationDatabase().LogHarvestMove(context, "Harvest SP - Check", stopwatchM.ElapsedMilliseconds, logMessage);
            logMessage = String.Empty;

            context.GetSpeciesObservationDatabase().CreatePointGoogleMercatorInTemp();
            logMessage   += " POINT: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev);
            stopwatchPrev = stopwatchM.ElapsedMilliseconds;
            context.GetSpeciesObservationDatabase().LogHarvestMove(context, "Harvest SP - Calculate", stopwatchM.ElapsedMilliseconds, logMessage);
            logMessage = String.Empty;

            context.GetSpeciesObservationDatabase().UpdateAccuracyAndDisturbanceRadius();
            logMessage   += " ACCURACY_AND_DISTURBANCE_RADIUS: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev);
            stopwatchPrev = stopwatchM.ElapsedMilliseconds;
            context.GetSpeciesObservationDatabase().LogHarvestMove(context, "Harvest SP - Calculate", stopwatchM.ElapsedMilliseconds, logMessage);
            logMessage = String.Empty;

            context.GetSpeciesObservationDatabase().MergeTempUpdateToPosition();
            logMessage   += " POSITION: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev);
            stopwatchPrev = stopwatchM.ElapsedMilliseconds;
            context.GetSpeciesObservationDatabase().LogHarvestMove(context, "Harvest SP - POSITION", stopwatchM.ElapsedMilliseconds, logMessage);
            logMessage = String.Empty;

            context.GetSpeciesObservationDatabase().UpdateSpeciesObservationChange();
            logMessage   += " SOC: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev);
            stopwatchPrev = stopwatchM.ElapsedMilliseconds;

            context.GetSpeciesObservationDatabase().MergeTempUpdateToDarwinCoreObservation();
            logMessage   += " DCO: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev);
            stopwatchPrev = stopwatchM.ElapsedMilliseconds;

            context.GetSpeciesObservationDatabase().MergeTempUpdateToSpeciesObservationField();
            logMessage   += ", SOF: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev);
            stopwatchPrev = stopwatchM.ElapsedMilliseconds;

            context.GetSpeciesObservationDatabase().LogHarvestMove(context, "Harvest SP - CREATE & UPDATE", stopwatchM.ElapsedMilliseconds, logMessage);
            logMessage = String.Empty;

            context.GetSpeciesObservationDatabase().CopyDeleteToSpeciesObservation();
            logMessage   += " SO: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev);
            stopwatchPrev = stopwatchM.ElapsedMilliseconds;
            context.GetSpeciesObservationDatabase().LogHarvestMove(context, "Harvest SP - DELETE", stopwatchM.ElapsedMilliseconds, logMessage);
            logMessage = String.Empty;

            context.GetSpeciesObservationDatabase().UpdateStatistics();
            logMessage   += ", DPS:" + (stopwatchM.ElapsedMilliseconds - stopwatchPrev);
            stopwatchPrev = stopwatchM.ElapsedMilliseconds;

            context.GetSpeciesObservationDatabase().EmptyTempTables();
            logMessage += ", Empty: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev);

            context.GetSpeciesObservationDatabase().CleanLogUpdateError();
            context.GetSpeciesObservationDatabase().CleanLogUpdateErrorDuplicates();
            logMessage += ", LUE: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev);

            stopwatchM.Stop();
            context.GetSpeciesObservationDatabase().LogHarvestMove(context, "Harvest DB - OPERATIONS", stopwatchM.ElapsedMilliseconds, logMessage);

            // Log data provider harvest status
            context.GetSpeciesObservationDatabase().SetHarvestJobStatistics(dataProviderId, HarvestStatusEnum.Done, changedFrom);
        }
        ////void IConnectorServer.CreateSpeciesObservations(WebServiceContext context, List<HarvestSpeciesObservation> speciesObservations, WebSpeciesObservationDataProvider dataProvider, out int noOfCreated, out int noOfErrors)
        ////{
        ////    throw new NotImplementedException();
        ////    //   CreateSpeciesObservations(context, speciesObservations, dataProvider, out noOfCreated, out noOfErrors);
        ////}
        ///// <summary>
        ///// Insert all new (created) observations into a DataTable
        ///// First check the observation
        ///// If ok, add it to SpeciesObservationTable and DarwinCoreTable
        ///// If there are errors add the observation to speciesObservationErrorFieldTable
        ///// </summary>
        ///// <param name="context">Web service request context.</param>
        ///// <param name="speciesObservations">Created species observations.</param>
        ///// <param name="dataProvider">Species observation data source.</param>
        ///// <param name="noOfCreated">Created </param>
        ///// <param name="noOfErrors">Errors </param>
        ////public static void CreateSpeciesObservations(WebServiceContext context,
        ////                                              List<HarvestSpeciesObservation> speciesObservations,
        ////                                              WebSpeciesObservationDataProvider dataProvider,
        ////                                              out int noOfCreated, out int noOfErrors)
        ////{
        ////    noOfCreated = 0;
        ////    noOfErrors = 0;
        ////    if (speciesObservations.IsNotEmpty())
        ////    {
        ////        DataTable darwinCoreTable = HarvestManager.GetDarwinCoreTable(CREATE);

        ////        DataTable speciesObservationFieldTable = HarvestManager.GetSpeciesObservationFieldTable(CREATE);
        ////        DataTable speciesObservationErrorFieldTable = HarvestManager.GetSpeciesObservationErrorFieldTable();

        ////        // Save all species observations into tables.
        ////        foreach (HarvestSpeciesObservation speciesObservation in speciesObservations)
        ////        {
        ////            string catalogNumber;
        ////            Dictionary<SpeciesObservationPropertyId, string> errors;
        ////            if (HarvestManager.CheckSpeciesObservation(speciesObservation, context, out errors, out catalogNumber))
        ////            {
        ////              //  HarvestManager.SpeciesObservationId++;
        ////                HarvestManager.AddToTempSpeciesObservation(speciesObservation,
        ////                                            darwinCoreTable,
        ////                                            speciesObservationFieldTable,
        ////                                            HarvestManager.SpeciesObservationId,
        ////                                            dataProvider,
        ////                                            catalogNumber);
        ////                noOfCreated++;
        ////            }
        ////            else
        ////            {
        ////                HarvestManager.CreateSpeciesObservationError(speciesObservation,
        ////                                              speciesObservationErrorFieldTable,
        ////                                              dataProvider,
        ////                                              errors,
        ////                                              CREATE);
        ////                noOfErrors++;
        ////            }
        ////        }

        ////        // Save tables to database.
        ////        context.GetSpeciesObservationDatabase().AddTableData(speciesObservationFieldTable);
        ////        context.GetSpeciesObservationDatabase().AddTableData(darwinCoreTable);
        ////        if (noOfErrors > 0)
        ////            context.GetSpeciesObservationDatabase().AddTableData(speciesObservationErrorFieldTable);
        ////    }

        ////}

        /// <summary>
        /// Insert all changed (updated) observations into a DataTable
        /// First check the observation
        /// If ok, add it to SpeciesObservationUpdateTable and DarwinCoreUpdateTable
        /// If there are errors add the observation to speciesObservationErrorFieldTable.
        /// </summary>
        /// <param name="context">Web service request context.</param>
        /// <param name="speciesObservations">Updated species observations.</param>
        /// <param name="dataProvider">The dataProvider.</param>
        /// <param name="noOfUpdated">No of updated species observations.</param>
        /// <param name="noOfUpdatedErrors">No of updating errors.</param>
        public static void UpdateSpeciesObservations(WebServiceContext context,
                                                     List <HarvestSpeciesObservation> speciesObservations,
                                                     WebSpeciesObservationDataProvider dataProvider,
                                                     out int noOfUpdated,
                                                     out int noOfUpdatedErrors)
        {
            noOfUpdated       = 0;
            noOfUpdatedErrors = 0;

            if (!speciesObservations.IsNotEmpty())
            {
                return;
            }

            DataTable darwinCoreTable = HarvestManager.GetDarwinCoreTable(HarvestManager.UPDATE);
            DataTable speciesObservationFieldTable      = HarvestManager.GetSpeciesObservationFieldTable(HarvestManager.UPDATE);
            DataTable speciesObservationErrorFieldTable = HarvestManager.GetSpeciesObservationErrorFieldTable();

            // Save all species observations into tables.
            foreach (HarvestSpeciesObservation speciesObservation in speciesObservations)
            {
                string  catalogNumber;
                Boolean someError = true;
                Dictionary <SpeciesObservationPropertyId, string> errors;
                if (HarvestManager.CheckSpeciesObservation(speciesObservation, context, out errors, out catalogNumber))
                {
                    try
                    {
                        HarvestManager.AddToTempSpeciesObservation(speciesObservation,
                                                                   darwinCoreTable,
                                                                   speciesObservationFieldTable,
                                                                   -1,
                                                                   dataProvider,
                                                                   catalogNumber);
                        noOfUpdated++;
                        someError = false;
                    }
                    catch (Exception ex)
                    {
                        var prop = (SpeciesObservationPropertyId)Enum.Parse(typeof(SpeciesObservationPropertyId), ex.Message);
                        if (prop.IsNotNull())
                        {
                            errors.Add(prop, ex.InnerException.Message);
                        }
                        else
                        {
                            errors.Add(SpeciesObservationPropertyId.Id, ex.InnerException.ToString());
                        }
                    }
                }

                if (someError)
                {
                    HarvestManager.CreateSpeciesObservationError(speciesObservation,
                                                                 speciesObservationErrorFieldTable,
                                                                 dataProvider,
                                                                 errors,
                                                                 HarvestManager.UPDATE);
                    noOfUpdatedErrors++;
                }
            }

            // Save tables to database.
            context.GetSpeciesObservationDatabase().AddTableData(speciesObservationFieldTable);
            context.GetSpeciesObservationDatabase().AddTableData(darwinCoreTable);
            if (noOfUpdatedErrors > 0)
            {
                context.GetSpeciesObservationDatabase().AddTableData(speciesObservationErrorFieldTable);
            }
        }
예제 #22
0
        /// <summary>
        /// Get information about species observations
        /// that has changed in the specified date range.
        /// 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">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)
        {
            Int32    noOfDeleted, noOfDeletedErrors;
            int      noOfUpdated = 0, noOfUpdatedErrors = 0;
            DateTime calcChangedTo = changedTo.AddDays(1);
            WebSpeciesObservationDataProvider dataProvider = GetSpeciesObservationDataProvider(context);
            WebData   webData;
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

            if (mUpdatedSpeciesObservations.IsEmpty() && mUpdatedSpeciesObservationIds.IsEmpty())
            {
                SpeciesObservationChange speciesObservationChange = new SpeciesObservationChange();
                mUpdatedSpeciesObservationIds = new List <Int64>();
                mUpdatedSpeciesObservations   = new List <WebData>();

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

                using (ArtportalenServer artportalenServer = new ArtportalenServer())
                {
                    var artportalenProcess = new ArtportalenProcess();

                    // Get changes from Artportalen.
                    using (DataReader dataReader = artportalenServer.GetSpeciesObservations(changedFrom, calcChangedTo))
                    {
                        while (dataReader.Read())
                        {
                            webData = new WebData();
                            webData.LoadData(dataReader);
                            if (mUpdatedSpeciesObservations.Count >= 100000)
                            {
                                mUpdatedSpeciesObservationIds.Add(GetSpeciesObservationId(webData));
                            }
                            else
                            {
                                mUpdatedSpeciesObservations.Add(webData);
                            }
                        }

                        AddProjectParameters(this.mUpdatedSpeciesObservations, dataReader);
                    }

                    // Save updated species observations into database.
                    // Max 10000 species observations are saved in one call.
                    UpdateSpeciesObservations(context,
                                              mUpdatedSpeciesObservations,
                                              dataProvider,
                                              connectorServer,
                                              mappings,
                                              out noOfUpdated,
                                              out noOfUpdatedErrors);
                    sumNoOfUpdated       += noOfUpdated;
                    sumNoOfUpdatedErrors += noOfUpdatedErrors;

                    // Get deleted observations from Artportalen
                    speciesObservationChange.DeletedSpeciesObservationGuids = new List <String>();
                    using (DataReader dataReader = artportalenServer.GetDeletedObservations(changedFrom, calcChangedTo))
                    {
                        int i = 0;
                        while (dataReader.Read())
                        {
                            webData = new WebData();
                            webData.LoadData(dataReader);
                            String deletedCatalogNumber = artportalenProcess.ProcessDeletedObservation(webData);
                            speciesObservationChange.DeletedSpeciesObservationGuids.Add(deletedCatalogNumber);
                            if (decimal.Remainder(++i, 10000) == 0)
                            {
                                // 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 the remaining observations to database
                        connectorServer.DeleteSpeciesObservations(context, speciesObservationChange.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors);
                        sumNoOfDeleted       += noOfDeleted;
                        sumNoOfDeletedErrors += noOfDeletedErrors;

                        speciesObservationChange.DeletedSpeciesObservationGuids.Clear();
                    }
                }

                // Log latest harvest date for the data provider
                context.GetSpeciesObservationDatabase().SetDataProviderLatestHarvestDate(dataProvider.Id, changedTo);

                context.GetSpeciesObservationDatabase().LogHarvestRead(context,
                                                                       dataProvider,
                                                                       changedFrom,
                                                                       changedTo,
                                                                       stopwatch.ElapsedMilliseconds,
                                                                       sumNoOfCreated,
                                                                       sumNoOfCreatedErrors,
                                                                       sumNoOfUpdated,
                                                                       sumNoOfUpdatedErrors,
                                                                       sumNoOfDeleted,
                                                                       sumNoOfDeletedErrors);
            }
            else
            {
                // Save updated species observations into database.
                // Max 10000 species observations are saved in one call.
                if (mUpdatedSpeciesObservations.IsNotEmpty())
                {
                    UpdateSpeciesObservations(context,
                                              mUpdatedSpeciesObservations,
                                              dataProvider,
                                              connectorServer,
                                              mappings,
                                              out noOfUpdated,
                                              out noOfUpdatedErrors);
                }
                else
                {
                    if (mUpdatedSpeciesObservationIds.IsNotEmpty())
                    {
                        UpdateSpeciesObservations(context,
                                                  mUpdatedSpeciesObservationIds,
                                                  dataProvider,
                                                  connectorServer,
                                                  mappings,
                                                  out noOfUpdated,
                                                  out noOfUpdatedErrors);
                    }
                }

                context.GetSpeciesObservationDatabase().LogHarvestRead(context,
                                                                       dataProvider,
                                                                       changedFrom,
                                                                       changedTo,
                                                                       stopwatch.ElapsedMilliseconds,
                                                                       0,
                                                                       0,
                                                                       noOfUpdated,
                                                                       noOfUpdatedErrors,
                                                                       0,
                                                                       0);
            }

            stopwatch.Stop();
            return(mUpdatedSpeciesObservations.IsNotEmpty() || mUpdatedSpeciesObservationIds.IsNotEmpty());
        }
 /// <summary>
 /// Update species observations.
 /// </summary>
 /// <param name="context">Web service request context.</param>
 /// <param name="speciesObservations">Updated species observations.</param>
 /// <param name="dataProvider">The dataProvider.</param>
 /// <param name="noOfUpdated">No of updated species observations.</param>
 /// <param name="noOfUpdatedErrors">No of updating errors.</param>
 void IConnectorServer.UpdateSpeciesObservations(WebServiceContext context, List <HarvestSpeciesObservation> speciesObservations, WebSpeciesObservationDataProvider dataProvider, out int noOfUpdated, out int noOfUpdatedErrors)
 {
     UpdateSpeciesObservations(context, speciesObservations, dataProvider, out noOfUpdated, out noOfUpdatedErrors);
 }
 /// <summary>
 /// Insert all deleted observations into a DataTable
 /// If ok, add it to TempDelete
 /// If there are errors add the observation to speciesObservationErrorFieldTable.
 /// </summary>
 /// <param name="context">Web service request context.</param>
 /// <param name="speciesObservationGuids">GUIDs for deleted species observations.</param>
 /// <param name="dataProvider">The dataProvider.</param>
 /// <param name="noOfDeleted">No of deleted species observations.</param>
 /// <param name="noOfErrors">No of deleting errors.</param>
 void IConnectorServer.DeleteSpeciesObservations(WebServiceContext context, List <string> speciesObservationGuids, WebSpeciesObservationDataProvider dataProvider, out int noOfDeleted, out int noOfErrors)
 {
     DeleteSpeciesObservations(context, speciesObservationGuids, dataProvider, out noOfDeleted, out noOfErrors);
 }
예제 #25
0
        /// <summary>
        /// Get information about species observations
        /// that has it's id in the SightingIds list.
        /// </summary>
        /// <param name="sightingIds">A list of id's to return information about.</param>
        /// <param name="mappings">The mappings.</param>
        /// <param name="context">Web service context.</param>
        /// <param name="connectorServer">The connector server.</param>
        public void GetSpeciesObservationChange(List <string> sightingIds,
                                                List <HarvestMapping> mappings,
                                                WebServiceContext context,
                                                IConnectorServer connectorServer)
        {
            WebSpeciesObservationDataProvider dataProvider = GetSpeciesObservationDataProvider(context);

            WebData webData;
            SpeciesObservationChange speciesObservationChange = new SpeciesObservationChange();

            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

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


            using (ArtportalenServer artportalenServer = new ArtportalenServer())
            {
                ArtportalenProcess artportalenProcess = new ArtportalenProcess();

                // Get created and edited observations from Artportalen
                using (DataReader dataReader = artportalenServer.GetSpeciesObservationsByIds(sightingIds))
                {
                    speciesObservationChange.CreatedSpeciesObservations = new List <HarvestSpeciesObservation>();
                    int i = 0;
                    int noOfCreated, noOfCreatedErrors;

                    while (dataReader.Read())
                    {
                        webData = new WebData();
                        webData.LoadData(dataReader);

                        HarvestSpeciesObservation harvestSpeciesObservation = artportalenProcess.ProcessObservation(webData, mappings, context);

                        speciesObservationChange.CreatedSpeciesObservations.Add(harvestSpeciesObservation);

                        if (decimal.Remainder(++i, 10000) == 0)
                        {
                            // 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();
                            speciesObservationChange.UpdatedSpeciesObservations.Clear();
                        }
                    }

                    // Write the remaining observations to database
                    connectorServer.UpdateSpeciesObservations(context,
                                                              speciesObservationChange.CreatedSpeciesObservations,
                                                              dataProvider,
                                                              out noOfCreated,
                                                              out noOfCreatedErrors);


                    sumNoOfCreated       += noOfCreated;
                    sumNoOfCreatedErrors += noOfCreatedErrors;

                    speciesObservationChange.CreatedSpeciesObservations.Clear();
                }

                //// Get deleted observations from Artportalen
                //using (DataReader dataReader = artportalenServer.GetDeletedObservations(changedFrom, calcChangedTo))
                //{
                //    speciesObservationChange.DeletedSpeciesObservationGuids = new List<String>();

                //    int i = 0;
                //    while (dataReader.Read())
                //    {
                //        webData = new WebData();
                //        webData.LoadData(dataReader);
                //        String deletedCatalogNumber = artportalenProcess.ProcessDeletedObservation(webData);
                //        speciesObservationChange.DeletedSpeciesObservationGuids.Add(deletedCatalogNumber);
                //        if (decimal.Remainder(++i, 10000) == 0)
                //        {
                //            // 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 the remaining observations to database
                //    connectorServer.DeleteSpeciesObservations(context, speciesObservationChange.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors);
                //    sumNoOfDeleted += noOfDeleted;
                //    sumNoOfDeletedErrors += noOfDeletedErrors;

                //    speciesObservationChange.DeletedSpeciesObservationGuids.Clear();
                //}
            }

            // Log latest harvest date for the data provider
            //context.GetSpeciesObservationDatabase().SetDataProviderLatestHarvestDate(dataProvider.Id, changedTo);

            context.GetSpeciesObservationDatabase().LogHarvestRead(context,
                                                                   dataProvider,
                                                                   new DateTime(1900, 01, 01),
                                                                   new DateTime(1900, 01, 01),
                                                                   stopwatch.ElapsedMilliseconds,
                                                                   sumNoOfCreated,
                                                                   sumNoOfCreatedErrors,
                                                                   sumNoOfUpdated,
                                                                   sumNoOfUpdatedErrors,
                                                                   sumNoOfDeleted,
                                                                   sumNoOfDeletedErrors);
            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();
        }