001 /**
002 * This library is free software; you can redistribute it and/or modify it
003 * under the terms of the GNU Lesser General Public License (LGPL) as
004 * published by the Free Software Foundation; either version 3.0 of the
005 * License, or (at your option) any later version.
006 *
007 * This library is distributed in the hope that it will be useful, but
008 * WITHOUT ANY WARRANTY; without even the implied warranty of
009 * MERCHANTABILITY of FITNESS FOR A PARTICULAR PURPOSE. See the GNU
010 * Lesser General Public License for more details.
011 */
012
013 /**
014 * Title: JBarcodeBean
015 * Description: Barcode JavaBeans Component
016 * Copyright: Copyright (C) 2004
017 * Company: Dafydd Walters
018 */
019 package net.sourceforge.jbarcodebean.model;
020
021 import net.sourceforge.jbarcodebean.BarcodeException;
022
023 /**
024 * This class, which implements the {@link BarcodeStrategy} interface,
025 * knows how to encode the 3:1 (wide)
026 * variant of the Interleaved Code 2 of 5 barcode type.
027 */
028 public class Interleaved25 extends AbstractBarcodeStrategy implements java.io.Serializable {
029
030 private static CharacterCode[] codes = {
031 new CharacterCode('1', new byte[] {3,1,1,1,3}, 1),
032 new CharacterCode('2', new byte[] {1,3,1,1,3}, 2),
033 new CharacterCode('3', new byte[] {3,3,1,1,1}, 3),
034 new CharacterCode('4', new byte[] {1,1,3,1,3}, 4),
035 new CharacterCode('5', new byte[] {3,1,3,1,1}, 5),
036 new CharacterCode('6', new byte[] {1,3,3,1,1}, 6),
037 new CharacterCode('7', new byte[] {1,1,1,3,3}, 7),
038 new CharacterCode('8', new byte[] {3,1,1,3,1}, 8),
039 new CharacterCode('9', new byte[] {1,3,1,3,1}, 9),
040 new CharacterCode('0', new byte[] {1,1,3,3,1}, 0),
041 new CharacterCode('A', new byte[] {1,1,1,1}, -1), // Start
042 new CharacterCode('B', new byte[] {3,1,1}, -1) // Stop
043 };
044
045 /**
046 * Always returns {@link BarcodeStrategy#OPTIONAL_CHECKSUM}.
047 */
048 public int requiresChecksum() {
049 // Checksum is not mandatory
050 return OPTIONAL_CHECKSUM;
051 }
052
053 /**
054 * This implementation of <tt>getCodes</tt> returns an array of
055 * {@link AbstractBarcodeStrategy.CharacterCode CharacterCode} objects
056 * for the wide Interleaved Code25 format.
057 */
058 protected CharacterCode[] getCodes() {
059 return Interleaved25.codes;
060 }
061
062 /**
063 * Returns a String containing the checksum-encoded version of the text passed
064 * to the method.
065 * Start and End sentinels must NOT be included in the text passed to this method.
066 */
067 protected String augmentWithChecksum(String text) throws BarcodeException {
068 int check1 = 0;
069 int check2 = 0;
070 CharacterCode cc;
071 for (int i = 0; i < text.length(); i++) {
072 char ch = text.charAt(i);
073 cc = getCharacterCode(ch); // get code by character
074 if (cc == null) {
075 throw new BarcodeException("Invalid character in barcode");
076 }
077 // Exclude start and end sentinels from checksum
078 if (cc.check > 0) {
079 if ((i + text.length()) % 2 == 0) {
080 check1 += cc.check;
081 } else {
082 check2 += cc.check;
083 }
084 }
085 }
086 check2 *= 3;
087 int checkDigit = (10 - ((check1 + check2) % 10)) % 10;
088 text = text + new Integer(checkDigit).toString();
089 return text;
090 }
091
092 /**
093 * Adds a leading zero if the length of <tt>text</tt> is odd.
094 */
095 protected String postprocess(String text) {
096 if (text.length() % 2 != 0) {
097 // Length is odd; add a leading zero.
098 text = "0" + text;
099 }
100 return text;
101 }
102
103 /**
104 * No preprocessing performed. <tt>text</tt> is returned unmodified.
105 */
106 protected String preprocess(String text) {
107 return text;
108 }
109
110 /**
111 * Always returns <tt>true</tt>.
112 */
113 protected boolean isInterleaved() {
114 return true;
115 }
116
117 /**
118 * Always returns 'A'.
119 */
120 protected char getStartSentinel() {
121 return 'A';
122 }
123
124 /**
125 * Always returns 'B'.
126 */
127 protected char getStopSentinel() {
128 return 'B';
129 }
130
131 /**
132 * Always returns 11 (eleven).
133 */
134 protected byte getMarginWidth() {
135 return 11;
136 }
137
138 /**
139 * Returns <tt>text</tt> unmodified.
140 */
141 protected String getBarcodeLabelText(String text) {
142 return text;
143 }
144
145 }