1 58 package org.krysalis.barcode.impl; 59 60 import org.krysalis.barcode.BarGroup; 61 import org.krysalis.barcode.ChecksumMode; 62 import org.krysalis.barcode.ClassicBarcodeLogicHandler; 63 64 69 public class EAN13LogicImpl extends UPCEANLogicImpl { 70 71 private static final byte A = LEFT_HAND_A; 72 private static final byte B = LEFT_HAND_B; 73 74 private static final byte[][] FIRSTFLAG = {{A, A, A, A, A}, 75 {A, B, A, B, B}, 76 {A, B, B, A, B}, 77 {A, B, B, B, A}, 78 {B, A, A, B, B}, 79 {B, B, A, A, B}, 80 {B, B, B, A, A}, 81 {B, A, B, A, B}, 82 {B, A, B, B, A}, 83 {B, B, A, B, A}}; 84 85 89 public EAN13LogicImpl(ChecksumMode mode) { 90 super(mode); 91 } 92 93 98 public static void validateMessage(String msg) { 99 UPCEANLogicImpl.validateMessage(msg); 100 if ((msg.length() < 12) || (msg.length() > 13)) { 101 throw new IllegalArgumentException ( 102 "Message must be 11 or 12 characters long. Message: " + msg); 103 } 104 } 105 106 private String handleChecksum(String msg) { 107 ChecksumMode mode = getChecksumMode(); 108 if (mode == ChecksumMode.CP_AUTO) { 109 if (msg.length() == 12) { 110 mode = ChecksumMode.CP_ADD; 111 } else if (msg.length() == 13) { 112 mode = ChecksumMode.CP_CHECK; 113 } else { 114 throw new RuntimeException ("Internal error"); 116 } 117 } 118 if (mode == ChecksumMode.CP_ADD) { 119 if (msg.length() > 12) { 120 throw new IllegalArgumentException ( 121 "Message is too long (max. 12 characters)"); 122 } 123 if (msg.length() < 12) { 124 throw new IllegalArgumentException ( 125 "Message must be 12 characters long"); 126 } 127 return msg + calcChecksum(msg); 128 } else if (mode == ChecksumMode.CP_CHECK) { 129 if (msg.length() > 13) { 130 throw new IllegalArgumentException ( 131 "Message is too long (max. 13 characters)"); 132 } 133 if (msg.length() < 13) { 134 throw new IllegalArgumentException ( 135 "Message must be 13 characters long"); 136 } 137 char check = msg.charAt(12); 138 char expected = calcChecksum(msg.substring(0, 12)); 139 if (check != expected) { 140 throw new IllegalArgumentException ( 141 "Checksum is bad (" + check + "). Expected: " + expected); 142 } 143 return msg; 144 } else if (mode == ChecksumMode.CP_IGNORE) { 145 return msg; 146 } else { 147 throw new UnsupportedOperationException ( 148 "Unknown checksum mode: " + mode); 149 } 150 } 151 152 153 public void generateBarcodeLogic(ClassicBarcodeLogicHandler logic, String msg) { 154 String supp = retrieveSupplemental(msg); 155 String s = removeSupplemental(msg); 156 validateMessage(s); 157 s = handleChecksum(s); 158 159 String canonicalMessage = s; 160 if (supp != null) { 161 canonicalMessage = canonicalMessage + "+" + supp; 162 } 163 logic.startBarcode(canonicalMessage); 164 165 drawSideGuard(logic); 167 168 logic.startBarGroup(BarGroup.UPC_EAN_GROUP, s.charAt(0) + ":" + s.substring(1, 7)); 169 170 encodeChar(logic, s.charAt(1), LEFT_HAND_A); 172 173 byte flag = (byte)Character.digit(s.charAt(0), 10); 175 for (int i = 2; i < 7; i++) { 176 encodeChar(logic, s.charAt(i), 177 FIRSTFLAG[flag][i - 2]); 178 } 179 180 logic.endBarGroup(); 181 182 drawCenterGuard(logic); 184 185 logic.startBarGroup(BarGroup.UPC_EAN_GROUP, s.substring(7, 13)); 186 187 for (int i = 7; i < 12; i++) { 189 encodeChar(logic, s.charAt(i), RIGHT_HAND); 190 } 191 192 final char check = s.charAt(12); 194 logic.startBarGroup(BarGroup.UPC_EAN_CHECK, new Character (check).toString()); 195 encodeChar(logic, check, RIGHT_HAND); 196 logic.endBarGroup(); 197 198 logic.endBarGroup(); 199 200 drawSideGuard(logic); 202 203 if (supp != null) { 205 drawSupplemental(logic, supp); 206 } 207 logic.endBarcode(); 208 } 209 210 } 211 | Popular Tags |