/*
* Copyright (C) 2010 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.zxing.oned;
import java.util.ArrayList;
import java.util.List;
/**
* Records EAN prefix to GS1 Member Organization, where the member organization
* correlates strongly with a country. This is an imperfect means of identifying
* a country of origin by EAN-13 barcode value. See <a
* href="http://en.wikipedia.org/wiki/List_of_GS1_country_codes">
* http://en.wikipedia.org/wiki/List_of_GS1_country_codes</a>.
*
* @author Sean Owen
*/
final class EANManufacturerOrgSupport {
private final List<int[]> ranges = new ArrayList<>();
private final List<String> countryIdentifiers = new ArrayList<>();
String lookupCountryIdentifier(String productCode) {
initIfNeeded();
int prefix = Integer.parseInt(productCode.substring(0, 3));
int max = ranges.size();
for (int i = 0; i < max; i++) {
int[] range = ranges.get(i);
int start = range[0];
if (prefix < start) {
return null;
}
int end = range.length == 1 ? start : range[1];
if (prefix <= end) {
return countryIdentifiers.get(i);
}
}
return null;
}
private void add(int[] range, String id) {
ranges.add(range);
countryIdentifiers.add(id);
}
private synchronized void initIfNeeded() {
if (!ranges.isEmpty()) {
return;
}
add(new int[] { 0, 19 }, "US/CA");
add(new int[] { 30, 39 }, "US");
add(new int[] { 60, 139 }, "US/CA");
add(new int[] { 300, 379 }, "FR");
add(new int[] { 380 }, "BG");
add(new int[] { 383 }, "SI");
add(new int[] { 385 }, "HR");
add(new int[] { 387 }, "BA");
add(new int[] { 400, 440 }, "DE");
add(new int[] { 450, 459 }, "JP");
add(new int[] { 460, 469 }, "RU");
add(new int[] { 471 }, "TW");
add(new int[] { 474 }, "EE");
add(new int[] { 475 }, "LV");
add(new int[] { 476 }, "AZ");
add(new int[] { 477 }, "LT");
add(new int[] { 478 }, "UZ");
add(new int[] { 479 }, "LK");
add(new int[] { 480 }, "PH");
add(new int[] { 481 }, "BY");
add(new int[] { 482 }, "UA");
add(new int[] { 484 }, "MD");
add(new int[] { 485 }, "AM");
add(new int[] { 486 }, "GE");
add(new int[] { 487 }, "KZ");
add(new int[] { 489 }, "HK");
add(new int[] { 490, 499 }, "JP");
add(new int[] { 500, 509 }, "GB");
add(new int[] { 520 }, "GR");
add(new int[] { 528 }, "LB");
add(new int[] { 529 }, "CY");
add(new int[] { 531 }, "MK");
add(new int[] { 535 }, "MT");
add(new int[] { 539 }, "IE");
add(new int[] { 540, 549 }, "BE/LU");
add(new int[] { 560 }, "PT");
add(new int[] { 569 }, "IS");
add(new int[] { 570, 579 }, "DK");
add(new int[] { 590 }, "PL");
add(new int[] { 594 }, "RO");
add(new int[] { 599 }, "HU");
add(new int[] { 600, 601 }, "ZA");
add(new int[] { 603 }, "GH");
add(new int[] { 608 }, "BH");
add(new int[] { 609 }, "MU");
add(new int[] { 611 }, "MA");
add(new int[] { 613 }, "DZ");
add(new int[] { 616 }, "KE");
add(new int[] { 618 }, "CI");
add(new int[] { 619 }, "TN");
add(new int[] { 621 }, "SY");
add(new int[] { 622 }, "EG");
add(new int[] { 624 }, "LY");
add(new int[] { 625 }, "JO");
add(new int[] { 626 }, "IR");
add(new int[] { 627 }, "KW");
add(new int[] { 628 }, "SA");
add(new int[] { 629 }, "AE");
add(new int[] { 640, 649 }, "FI");
add(new int[] { 690, 695 }, "CN");
add(new int[] { 700, 709 }, "NO");
add(new int[] { 729 }, "IL");
add(new int[] { 730, 739 }, "SE");
add(new int[] { 740 }, "GT");
add(new int[] { 741 }, "SV");
add(new int[] { 742 }, "HN");
add(new int[] { 743 }, "NI");
add(new int[] { 744 }, "CR");
add(new int[] { 745 }, "PA");
add(new int[] { 746 }, "DO");
add(new int[] { 750 }, "MX");
add(new int[] { 754, 755 }, "CA");
add(new int[] { 759 }, "VE");
add(new int[] { 760, 769 }, "CH");
add(new int[] { 770 }, "CO");
add(new int[] { 773 }, "UY");
add(new int[] { 775 }, "PE");
add(new int[] { 777 }, "BO");
add(new int[] { 779 }, "AR");
add(new int[] { 780 }, "CL");
add(new int[] { 784 }, "PY");
add(new int[] { 785 }, "PE");
add(new int[] { 786 }, "EC");
add(new int[] { 789, 790 }, "BR");
add(new int[] { 800, 839 }, "IT");
add(new int[] { 840, 849 }, "ES");
add(new int[] { 850 }, "CU");
add(new int[] { 858 }, "SK");
add(new int[] { 859 }, "CZ");
add(new int[] { 860 }, "YU");
add(new int[] { 865 }, "MN");
add(new int[] { 867 }, "KP");
add(new int[] { 868, 869 }, "TR");
add(new int[] { 870, 879 }, "NL");
add(new int[] { 880 }, "KR");
add(new int[] { 885 }, "TH");
add(new int[] { 888 }, "SG");
add(new int[] { 890 }, "IN");
add(new int[] { 893 }, "VN");
add(new int[] { 896 }, "PK");
add(new int[] { 899 }, "ID");
add(new int[] { 900, 919 }, "AT");
add(new int[] { 930, 939 }, "AU");
add(new int[] { 940, 949 }, "AZ");
add(new int[] { 955 }, "MY");
add(new int[] { 958 }, "MO");
}
}