예제 #1
0
        private CheckResult ValidateEic(EanEicCode code)
        {
            if (code.Code.Length != 16)
            {
                return(new CheckResult(CheckResultCode.EicInvalidLength));
            }

            // EIC check character computation algorithm from page 32-33 from the https://www.entsoe.eu/Documents/EDI/Library/2015-0612_451-n%20EICCode_Data_exchange_implementation_guide_final.pdf
            IEnumerable <int> numericEncodingOfEic;

            try
            {
                //Step 1&2
                numericEncodingOfEic = GetNumericEicEncoding(code.Code);
            }
            catch (InvalidCharacterInEic)
            {
                return(new CheckResult(CheckResultCode.EicInvalidCharacter));
            }

            //Step 3&4
            IEnumerable <int> weightedList = getWeightedListEic(numericEncodingOfEic.Take(15));
            //Step 5
            int sumOfWeights = weightedList.Sum();
            //Step 6
            int  modulo37  = 36 - ((sumOfWeights - 1) % 37);
            char checkChar = EncodeIntToChar(modulo37);

            if (checkChar == code.Code.Last())
            {
                return(new CheckResult(CheckResultCode.EicOk));
            }
            return(new CheckResult(CheckResultCode.EicInvalidCheckCharacter));
        }
예제 #2
0
        public bool TryAccess(string username, EanEicCode code)
        {
            int accessCount = _userAccessRepository.GetUserAccessCount(username, _timeWindow);

//            _userAccessRepository.RecordAccess(username, code);

            return(accessCount < _maxAccessCount);
        }
 public bool TryGetOpm(EanEicCode code, out Opm opmForCode)
 {
     if (code == null)
     {
         opmForCode = null;
         return(false);
     }
     return(_repository.TryGetValue(code, out opmForCode));
 }
예제 #4
0
        public void AddAndCheck()
        {
            EanEicCode c1 = new EanEicCode("859182400123456789");
            EanEicCode c2 = new EanEicCode("859182400123456789");
            Assert.AreEqual(c1, c2);

            repository.TryAdd(new Opm(validCode));
            //            repository.TryGetOpm()
        }
        public bool TryRemoveOpm(EanEicCode code)
        {
            if (code == null)
            {
                return(false);
            }
            Opm opm;

            return(_repository.TryRemove(code, out opm));
        }
예제 #6
0
        public void AddAndCheck()
        {
            EanEicCode c1 = new EanEicCode("859182400123456789");
            EanEicCode c2 = new EanEicCode("859182400123456789");

            Assert.AreEqual(c1, c2);

            repository.TryAdd(new Opm(validCode));
//            repository.TryGetOpm()
        }
예제 #7
0
        public OpmVerificationResult VerifyOpm(string codeString, string username)
        {
            EanEicCode code = new EanEicCode(codeString);

            if (UserAccessService.TryAccess(username, code))
            {
                OpmVerificationResult result = VerifyOpm(code);
                return(result);
            }

            throw new UserAccessLimitViolationException();
        }
예제 #8
0
        private OpmVerificationResult Verify(EanEicCode code)
        {
            CheckResult codeValid = EanEicCheckerHttpClient.Post(code);
            if (codeValid.ResultCode != CheckResultCode.EanOk && codeValid.ResultCode != CheckResultCode.EicOk) {
                //TODO SP: what to do now - maybe better to just return 'false'
                throw new ArgumentException("The supplied code is not valid." + "\n" + codeValid.Description);
            }

            //OK, code is valid, try to find it in the OpmRepository
            Opm opmForCode;
            if (OpmRepository.TryGetOpm(code, out opmForCode)) {
                return new OpmVerificationResult(true);
            }
            return new OpmVerificationResult(false);
        }
예제 #9
0
        public void TestEanCodes()
        {
            using (StreamReader sr = new StreamReader(SimpleTestPath)) {
                string currentLine;
                // currentLine will be null when the StreamReader reaches the end of file
                while ((currentLine = sr.ReadLine()) != null)
                {
                    EanEicCode      code           = new EanEicCode(currentLine.Split(";".ToCharArray())[0]);
                    CheckResultCode expectedResult = (CheckResultCode)Enum.Parse(typeof(CheckResultCode), currentLine.Split(";".ToCharArray())[1]);

                    CheckResult res = _service.CheckCode(code);
                    Assert.AreEqual(res.ResultCode, expectedResult);
                }
            }
        }
예제 #10
0
 public bool TryGetOpm(EanEicCode code, out Opm opmForCode)
 {
     try
     {
         _log.Debug(m => m("Trying to fetch Opm code=[" + " code.ToString() " + "]."));
         tbl_duplicate_opms dbOpm = _dbContext.tbl_duplicate_opms.SingleOrDefault(o => o.tdo_ean.Equals(code.Code));
         opmForCode = new Opm(new EanEicCode(dbOpm.tdo_ean));
         _log.Debug("Opm code=[" + " code.ToString() " + "] found in repository.");
         return(true);
     }
     catch
     {
         opmForCode = null;
         _log.Error("Opm could not be fetched from repository. Exception thrown.");
         return(false);
     }
 }
예제 #11
0
 public bool TryRemoveOpm(EanEicCode code)
 {
     try {
         _log.Debug("Removal of Opm code=[" + " code.ToString() " + "] started.");
         tbl_duplicate_opms entityToRemove = _dbContext.tbl_duplicate_opms.FirstOrDefault(opm => opm.tdo_ean.Equals(code.Code));
         if (entityToRemove == null)
         {
             return(false);
         }
         _dbContext.tbl_duplicate_opms.Remove(entityToRemove);
         _dbContext.SaveChanges();
         _log.Debug("Removal of Opm code=[" + " code.ToString() " + "] finished.");
         return(true);
     } catch {
         _log.Error("Removal of Opm failed with an exception.");
         return(false);
     }
 }
예제 #12
0
        private OpmVerificationResult Verify(EanEicCode code)
        {
            CheckResult codeValid = EanEicCheckerHttpClient.Post(code);

            if (codeValid.ResultCode != CheckResultCode.EanOk && codeValid.ResultCode != CheckResultCode.EicOk)
            {
                throw new EanEicCodeInvalidException();
            }

            //OK, code is valid, try to find the record in the OpmRepository
            Opm opmForCode;

            if (OpmRepository.TryGetOpm(code, out opmForCode))
            {
                return(new OpmVerificationResult(true));
            }
            return(new OpmVerificationResult(false));
        }
        public CheckResult Post(EanEicCode code)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.Method = "POST";
            request.ContentType = "application/json;charset=utf-8";
            var encoding = new UTF8Encoding();

            byte[] bytes = encoding.GetBytes(javaScriptSerializer.Serialize(code));

            request.ContentLength = bytes.Length;

            using (Stream requestStream = request.GetRequestStream()) {
                requestStream.Write(bytes, 0, bytes.Length);
            }
            Stream responseStream = request.GetResponse().GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);
            return javaScriptSerializer.Deserialize<CheckResult>(reader.ReadToEnd());
        }
예제 #14
0
        private OpmVerificationResult Verify(EanEicCode code)
        {
            CheckResult codeValid = EanEicCheckerHttpClient.Post(code);

            if (codeValid.ResultCode != CheckResultCode.EanOk && codeValid.ResultCode != CheckResultCode.EicOk)
            {
                //TODO SP: what to do now - maybe better to just return 'false'
                throw new ArgumentException("The supplied code is not valid." + "\n" + codeValid.Description);
            }

            //OK, code is valid, try to find it in the OpmRepository
            Opm opmForCode;

            if (OpmRepository.TryGetOpm(code, out opmForCode))
            {
                return(new OpmVerificationResult(true));
            }
            return(new OpmVerificationResult(false));
        }
예제 #15
0
        public CheckResult Post(EanEicCode code)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

            request.Method      = "POST";
            request.ContentType = "application/json;charset=utf-8";
            var encoding = new UTF8Encoding();

            byte[] bytes = encoding.GetBytes(javaScriptSerializer.Serialize(code));

            request.ContentLength = bytes.Length;

            using (Stream requestStream = request.GetRequestStream()) {
                requestStream.Write(bytes, 0, bytes.Length);
            }
            Stream       responseStream = request.GetResponse().GetResponseStream();
            StreamReader reader         = new StreamReader(responseStream);

            return(javaScriptSerializer.Deserialize <CheckResult>(reader.ReadToEnd()));
        }
예제 #16
0
        public CheckResult CheckCode(EanEicCode code)
        {
            if (code == null || string.IsNullOrEmpty(code.Code))
            {
                return(new CheckResult(CheckResultCode.NoCodeSupplied));
            }

            //EAN prefix
            if (code.Code.Length >= 2 && code.Code.Substring(0, 2) == "85")
            {
                return(ValidateEan(code));
            }

            //EIC prefix
            if (code.Code.Length >= 2 && code.Code.Substring(0, 2) == "27")
            {
                return(ValidateEic(code));
            }

            //Prefix did not match
            return(new CheckResult(CheckResultCode.CodePrefixInvalid));
        }
예제 #17
0
        private static CheckResult ValidateEan(EanEicCode code)
        {
            if (code.Code.Length != 18)
            {
                return(new CheckResult(CheckResultCode.EanInvalidLength));
            }

            // sum = EAN[0] * 3 + EAN[1] + EAN[2] * 3 + EAN[3] + ... + EAN[16] * 3
            int sum = 0;

            for (int i = 0; i < 17; i++)
            {
                int digit = code.Code[i] - '0';
                if (digit < 0 || digit > 9)
                {
                    return(new CheckResult(CheckResultCode.EanInvalidCharacter));
                }
                if (i % 2 == 0)
                {
                    sum += digit * 3;
                }
                else
                {
                    sum += digit;
                }
            }

            int lastDigit = code.Code[17] - '0';

            int checkSum = Ceiling(sum, 10) - sum;

            if (lastDigit == checkSum)
            {
                return(new CheckResult(CheckResultCode.EanOk));
            }
            return(new CheckResult(CheckResultCode.EanInvalidCheckCharacter));
        }
예제 #18
0
 public bool TryRemoveOpm(EanEicCode code)
 {
     Opm opm;
     return _repository.TryRemove(code, out opm);
 }
예제 #19
0
 public bool TryGetOpm(EanEicCode code, out Opm opmForCode)
 {
     return _repository.TryGetValue(code, out opmForCode);
 }
예제 #20
0
 public CheckResult Post(EanEicCode code)
 {
     return(_eanEicCheckService.CheckCode(code));
 }
예제 #21
0
 public bool TryGetOpm(EanEicCode code, out Opm opmForCode)
 {
     return(_repository.TryGetValue(code, out opmForCode));
 }
예제 #22
0
        public bool TryRemoveOpm(EanEicCode code)
        {
            Opm opm;

            return(_repository.TryRemove(code, out opm));
        }
예제 #23
0
 private OpmVerificationResult VerifyOpm(EanEicCode code)
 {
     return(Verify(code));
 }
예제 #24
0
        /// <summary>
        /// TODO SP:
        /// 1) this call needs to be parameterized with some token or user identification to limit # of cals per user
        ///   a. what to do if the EAN/EIC is invalid
        ///   b. what to do if the user has already queried system too many times
        /// 2) create service that will keep track of # calls to the API for a particular user
        /// </summary>
        /// <param name="codeString"></param>
        /// <returns></returns>
        public OpmVerificationResult VerifyOpm(string codeString)
        {
            EanEicCode code = new EanEicCode(codeString);

            return(Verify(code));
        }
예제 #25
0
 /// <summary>
 /// TODO SP: 
 /// 1) this call needs to be parameterized with some token or user identification to limit # of cals per user 
 ///   a. what to do if the EAN/EIC is invalid 
 ///   b. what to do if the user has already queried system too many times
 /// 2) create service that will keep track of # calls to the API for a particular user
 /// </summary>
 /// <param name="codeString"></param>
 /// <returns></returns>
 public OpmVerificationResult VerifyOpm(string codeString)
 {
     EanEicCode code = new EanEicCode(codeString);
     return Verify(code);
 }
예제 #26
0
 public Opm(EanEicCode code)
 {
     Code = code;
 }