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 MSI barcode type.
026 */
027 public class MSI extends AbstractBarcodeStrategy implements java.io.Serializable {
028
029 private static CharacterCode[] codes = {
030 new CharacterCode('1', new byte[] {1,2,1,2,1,2,2,1}, 1),
031 new CharacterCode('2', new byte[] {1,2,1,2,2,1,1,3}, 2),
032 new CharacterCode('3', new byte[] {1,2,1,2,2,1,2,1}, 3),
033 new CharacterCode('4', new byte[] {1,2,2,1,1,2,1,3}, 4),
034 new CharacterCode('5', new byte[] {1,2,2,1,1,2,2,1}, 5),
035 new CharacterCode('6', new byte[] {1,2,2,1,2,1,1,3}, 6),
036 new CharacterCode('7', new byte[] {1,2,2,1,2,1,2,1}, 7),
037 new CharacterCode('8', new byte[] {2,1,1,2,1,2,1,3}, 8),
038 new CharacterCode('9', new byte[] {2,1,1,2,1,2,2,1}, 9),
039 new CharacterCode('0', new byte[] {1,2,1,2,1,2,1,3}, 0),
040 new CharacterCode('A', new byte[] {2,1}, -1), // Start
041 new CharacterCode('B', new byte[] {1,2,1}, -1) // Stop
042 };
043
044 /**
045 * Always returns {@link BarcodeStrategy#MANDATORY_CHECKSUM}.
046 */
047 public int requiresChecksum() {
048 // Checksum is mandatory
049 return MANDATORY_CHECKSUM;
050 }
051
052 /**
053 * This implementation of <tt>getCodes</tt> returns an array of
054 * {@link AbstractBarcodeStrategy.CharacterCode CharacterCode} objects
055 * for the MSI format.
056 */
057 protected CharacterCode[] getCodes() {
058 return MSI.codes;
059 }
060
061 /**
062 * Returns a String containing the checksum-encoded version of the text passed
063 * to the method.
064 * Start and End sentinels must NOT be included in the text passed to this method.
065 */
066 protected String augmentWithChecksum(String text) throws BarcodeException {
067 String newNum = "";
068 for (int i = text.length() - 1; i >= 0; i -= 2 ) {
069 newNum = text.charAt(i) + newNum;
070 }
071 int check1 = Integer.parseInt(newNum) * 2;
072 newNum = new Integer(check1).toString();
073 int check2 = 0;
074 for (int i = 0; i < newNum.length(); i++) {
075 check2 += Integer.parseInt(newNum.substring(i, i + 1));
076 }
077 for (int i = text.length() - 2; i >= 0; i -= 2 ) {
078 check2 += Integer.parseInt(text.substring(i, i + 1));
079 }
080 int checkDigit = (10 - ((check2) % 10)) % 10;
081 text = text + new Integer(checkDigit).toString();
082 return text;
083 }
084
085 /**
086 * Does nothing except return the String passed to the method.
087 */
088 protected String postprocess(String text) {
089 return text;
090 }
091
092 /**
093 * Does nothing except return the String passed to the method.
094 */
095 protected String preprocess(String text) {
096 return text;
097 }
098
099 /**
100 * Always returns <tt>false</tt>
101 */
102 protected boolean isInterleaved() {
103 return false;
104 }
105
106 /**
107 * Always returns 'A'.
108 */
109 protected char getStartSentinel() {
110 return 'A';
111 }
112
113 /**
114 * Always returns 'B'.
115 */
116 protected char getStopSentinel() {
117 return 'B';
118 }
119
120 /**
121 * Always returns 11 (eleven).
122 */
123 protected byte getMarginWidth() {
124 return 11;
125 }
126
127 /**
128 * Does nothing except return the String passed to the method.
129 */
130 protected String getBarcodeLabelText(String text) {
131 return text;
132 }
133
134 }