/// <summary>
        /// Executes the workflow activity.
        /// </summary>
        /// <param name="executionContext">The execution context.</param>
        protected override void Execute(CodeActivityContext executionContext)
        {
            // Create the tracing service
            ITracingService tracingService = executionContext.GetExtension<ITracingService>();

            if (tracingService == null)
            {
                throw new InvalidPluginExecutionException("Failed to retrieve tracing service.");
            }

            tracingService.Trace("Entered " + _activityName + ".Execute(), Activity Instance Id: {0}, Workflow Instance Id: {1}",
                executionContext.ActivityInstanceId,
                executionContext.WorkflowInstanceId);

            // Create the context
            IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();

            if (context == null)
            {
                throw new InvalidPluginExecutionException("Failed to retrieve workflow context.");
            }

            tracingService.Trace(_activityName + ".Execute(), Correlation Id: {0}, Initiating User: {1}",
                context.CorrelationId,
                context.InitiatingUserId);

            IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

            try
            {
                //set default outputs to false, blank, whatever
                PlateFound.Set(executionContext, false);
                ContactFound.Set(executionContext, false);
                ContactId.Set(executionContext, Guid.Empty.ToString());
                ContactName.Set(executionContext, string.Empty);
                PlateNum.Set(executionContext, string.Empty);
                ImgUrl.Set(executionContext, string.Empty);

                //create the webrequest object and execute it
                System.Net.WebRequest req = System.Net.WebRequest.Create(Endpoint.Get(executionContext));

                //must set the content type for json
                req.ContentType = "application/json";

                //must set method to post
                req.Method = "GET";

                //get the response
                System.Net.WebResponse resp = req.GetResponse();

                Stream responseStream = CopyAndClose(resp.GetResponseStream());
                // Do something with the stream
                StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
                String responseString = reader.ReadToEnd();
                tracingService.Trace("json response: {0}", responseString);

                responseStream.Position = 0;
                //deserialize the response to a myjsonresponse object
                JsonResponse myResponse = new JsonResponse();
                System.Runtime.Serialization.Json.DataContractJsonSerializer deserializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(myResponse.GetType());
                myResponse = deserializer.ReadObject(responseStream) as JsonResponse;

                if (myResponse.Results.Length > 0)
                {
                    //plate detected
                    string platenum = myResponse.Results[0].Plate;
                    PlateFound.Set(executionContext, true);
                    PlateNum.Set(executionContext, platenum);

                    //set image path
                    var uri = new Uri(Endpoint.Get(executionContext));
                    string image = string.Format("{0}://{1}:{2}{3}", uri.Scheme, uri.Host, uri.Port, myResponse.Image);

                    ImgUrl.Set(executionContext, image);

                    //search for the contact
                    //this should probably search for other matches if it can't find a result for the "best" match
                    tracingService.Trace("entering 'contact search'", "");
                    tracingService.Trace("building fetch", "");
                    string fetchXml = @"<fetch distinct='false' mapping='logical' output-format='xml-platform' version='1.0'>
                        <entity name='contact'>
                            <attribute name='fullname'/>
                            <filter type='and'>
                                <condition attribute='lpa_platenumber' value='{0}' operator='eq'/>
                            </filter>
                        </entity>
                    </fetch> ";

                    fetchXml = string.Format(fetchXml, platenum);

                    tracingService.Trace("prepared fetchxml: {0}", fetchXml);

                    tracingService.Trace("retrieving contacts", "");
                    EntityCollection contacts = service.RetrieveMultiple(new FetchExpression(fetchXml));
                    if (contacts.Entities.Count == 1)
                    {
                        ContactFound.Set(executionContext, true);
                        ContactId.Set(executionContext, contacts.Entities[0].Id.ToString());
                        ContactName.Set(executionContext, contacts.Entities[0]["fullname"].ToString());
                    }
                }
            }

            catch (WebException exception)
            {
                string str = string.Empty;
                if (exception.Response != null)
                {
                    using (StreamReader reader =
                        new StreamReader(exception.Response.GetResponseStream()))
                    {
                        str = reader.ReadToEnd();
                    }
                    exception.Response.Close();
                }
                if (exception.Status == WebExceptionStatus.Timeout)
                {
                    throw new InvalidPluginExecutionException(
                        "The timeout elapsed while attempting to issue the request.", exception);
                }
                throw new InvalidPluginExecutionException(String.Format(CultureInfo.InvariantCulture,
                    "A Web exception ocurred while attempting to issue the request. {0}: {1}",
                    exception.Message, str), exception);
            }
            catch (FaultException<OrganizationServiceFault> e)
            {
                tracingService.Trace("Exception: {0}", e.ToString());

                // Handle the exception.
                throw;
            }
            catch (Exception e)
            {
                tracingService.Trace("Exception: {0}", e.ToString());
                throw;
            }

            tracingService.Trace("Exiting " + _activityName + ".Execute(), Correlation Id: {0}", context.CorrelationId);
        }
        /// <summary>
        /// Executes the workflow activity.
        /// </summary>
        /// <param name="executionContext">The execution context.</param>
        protected override void Execute(CodeActivityContext executionContext)
        {
            // Create the tracing service
            ITracingService tracingService = executionContext.GetExtension <ITracingService>();

            if (tracingService == null)
            {
                throw new InvalidPluginExecutionException("Failed to retrieve tracing service.");
            }

            tracingService.Trace("Entered " + _activityName + ".Execute(), Activity Instance Id: {0}, Workflow Instance Id: {1}",
                                 executionContext.ActivityInstanceId,
                                 executionContext.WorkflowInstanceId);

            // Create the context
            IWorkflowContext context = executionContext.GetExtension <IWorkflowContext>();

            if (context == null)
            {
                throw new InvalidPluginExecutionException("Failed to retrieve workflow context.");
            }

            tracingService.Trace(_activityName + ".Execute(), Correlation Id: {0}, Initiating User: {1}",
                                 context.CorrelationId,
                                 context.InitiatingUserId);

            IOrganizationServiceFactory serviceFactory = executionContext.GetExtension <IOrganizationServiceFactory>();
            IOrganizationService        service        = serviceFactory.CreateOrganizationService(context.UserId);

            try
            {
                //set default outputs to false, blank, whatever
                PlateFound.Set(executionContext, false);
                ContactFound.Set(executionContext, false);
                ContactId.Set(executionContext, Guid.Empty.ToString());
                ContactName.Set(executionContext, string.Empty);
                PlateNum.Set(executionContext, string.Empty);
                ImgUrl.Set(executionContext, string.Empty);

                //create the webrequest object and execute it
                System.Net.WebRequest req = System.Net.WebRequest.Create(Endpoint.Get(executionContext));

                //must set the content type for json
                req.ContentType = "application/json";

                //must set method to post
                req.Method = "GET";

                //get the response
                System.Net.WebResponse resp = req.GetResponse();

                Stream responseStream = CopyAndClose(resp.GetResponseStream());
                // Do something with the stream
                StreamReader reader         = new StreamReader(responseStream, Encoding.UTF8);
                String       responseString = reader.ReadToEnd();
                tracingService.Trace("json response: {0}", responseString);

                responseStream.Position = 0;
                //deserialize the response to a myjsonresponse object
                JsonResponse myResponse = new JsonResponse();
                System.Runtime.Serialization.Json.DataContractJsonSerializer deserializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(myResponse.GetType());
                myResponse = deserializer.ReadObject(responseStream) as JsonResponse;

                if (myResponse.Results.Length > 0)
                {
                    //plate detected
                    string platenum = myResponse.Results[0].Plate;
                    PlateFound.Set(executionContext, true);
                    PlateNum.Set(executionContext, platenum);

                    //set image path
                    var    uri   = new Uri(Endpoint.Get(executionContext));
                    string image = string.Format("{0}://{1}:{2}{3}", uri.Scheme, uri.Host, uri.Port, myResponse.Image);

                    ImgUrl.Set(executionContext, image);

                    //search for the contact
                    //this should probably search for other matches if it can't find a result for the "best" match
                    tracingService.Trace("entering 'contact search'", "");
                    tracingService.Trace("building fetch", "");
                    string fetchXml = @"<fetch distinct='false' mapping='logical' output-format='xml-platform' version='1.0'>
                        <entity name='contact'>
                            <attribute name='fullname'/>
                            <filter type='and'>
                                <condition attribute='lpa_platenumber' value='{0}' operator='eq'/>
                            </filter>
                        </entity>
                    </fetch> ";

                    fetchXml = string.Format(fetchXml, platenum);

                    tracingService.Trace("prepared fetchxml: {0}", fetchXml);

                    tracingService.Trace("retrieving contacts", "");
                    EntityCollection contacts = service.RetrieveMultiple(new FetchExpression(fetchXml));
                    if (contacts.Entities.Count == 1)
                    {
                        ContactFound.Set(executionContext, true);
                        ContactId.Set(executionContext, contacts.Entities[0].Id.ToString());
                        ContactName.Set(executionContext, contacts.Entities[0]["fullname"].ToString());
                    }
                }
            }

            catch (WebException exception)
            {
                string str = string.Empty;
                if (exception.Response != null)
                {
                    using (StreamReader reader =
                               new StreamReader(exception.Response.GetResponseStream()))
                    {
                        str = reader.ReadToEnd();
                    }
                    exception.Response.Close();
                }
                if (exception.Status == WebExceptionStatus.Timeout)
                {
                    throw new InvalidPluginExecutionException(
                              "The timeout elapsed while attempting to issue the request.", exception);
                }
                throw new InvalidPluginExecutionException(String.Format(CultureInfo.InvariantCulture,
                                                                        "A Web exception ocurred while attempting to issue the request. {0}: {1}",
                                                                        exception.Message, str), exception);
            }
            catch (FaultException <OrganizationServiceFault> e)
            {
                tracingService.Trace("Exception: {0}", e.ToString());

                // Handle the exception.
                throw;
            }
            catch (Exception e)
            {
                tracingService.Trace("Exception: {0}", e.ToString());
                throw;
            }

            tracingService.Trace("Exiting " + _activityName + ".Execute(), Correlation Id: {0}", context.CorrelationId);
        }