public ThirdIssuanceMessageInfo ThirdMessage(ThirdIssuanceMessageSpec spec)
        {
            // first we will try to lookup the cache value of the issuer object.
            Issuer issuer = null;

            if (spec.IssuerInstanceID != null)
            {
                IssuerInstanceData issuerInstance;
                bool ok = issuerInstanceDB.TryGetValue(spec.IssuerInstanceID, out issuerInstance);
                if (ok)
                {
                    issuer = issuerInstance.Issuer;
                }
                else
                {
                    //XXX add log about Issuer not found in cache.
                }
            }

            if (issuer != null)
            {
                return(HandleThirdMessageInfo(issuer, spec.SecondMessage));
            }

            if (spec.FistMessageState != null && spec.IssuerKeyAndParameter != null)
            {
                issuer = new Issuer(spec.IssuerKeyAndParameter, spec.FistMessageState);
                issuerInstanceDB.TryAdd(spec.IssuerInstanceID, new IssuerInstanceData(issuer));
                return(HandleThirdMessageInfo(issuer, spec.SecondMessage));
            }

            ApiArgumentFault fault = new ApiArgumentFault();

            fault.Details       = "Issuer with unique ID was found or FirstMessageState and IssuerKeyAndParameter not provided.";
            fault.Argument      = "ThirdIssuanceMessageSpec.IssuerInstanceID/ThirdIssuanceMessageSpec.FirstMessageState/ThirdIssuanceMessageSpec.IssuerKeyAndParameter";
            fault.ArgumentValue = spec.IssuerInstanceID.ToString();
            throw new FaultException <ApiArgumentFault>(fault);
        }
    public ThirdIssuanceMessageInfo ThirdMessage(ThirdIssuanceMessageSpec spec)
    {
      // first we will try to lookup the cache value of the issuer object.
      Issuer issuer = null;
      if (spec.IssuerInstanceID != null)
      {
        IssuerInstanceData issuerInstance;
        bool ok = issuerInstanceDB.TryGetValue(spec.IssuerInstanceID, out issuerInstance);
        if (ok)
        {
          issuer = issuerInstance.Issuer;
        }
        else
        {
          //XXX add log about Issuer not found in cache.
        }
      }

      if (issuer != null)
      {
        return HandleThirdMessageInfo(issuer, spec.SecondMessage);
      }

      if (spec.FistMessageState != null && spec.IssuerKeyAndParameter != null)
      {
        issuer = new Issuer(spec.IssuerKeyAndParameter, spec.FistMessageState);
        issuerInstanceDB.TryAdd(spec.IssuerInstanceID, new IssuerInstanceData(issuer));
        return HandleThirdMessageInfo(issuer, spec.SecondMessage);

      }

      ApiArgumentFault fault = new ApiArgumentFault();
      fault.Details = "Issuer with unique ID was found or FirstMessageState and IssuerKeyAndParameter not provided.";
      fault.Argument = "ThirdIssuanceMessageSpec.IssuerInstanceID/ThirdIssuanceMessageSpec.FirstMessageState/ThirdIssuanceMessageSpec.IssuerKeyAndParameter";
      fault.ArgumentValue = spec.IssuerInstanceID.ToString();
      throw new FaultException<ApiArgumentFault>(fault);

    }