PageRenderTime 27ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/ojc-core/encodersl/encoder-coco/src/com/sun/encoder/coco/runtime/CobolCharacteristics.java

https://bitbucket.org/pymma/openesb-components
Java | 601 lines | 415 code | 72 blank | 114 comment | 30 complexity | 832fd90783bee9d2cf9a34dd4814a6c6 MD5 | raw file
  1. /*
  2. * BEGIN_HEADER - DO NOT EDIT
  3. *
  4. * The contents of this file are subject to the terms
  5. * of the Common Development and Distribution License
  6. * (the "License"). You may not use this file except
  7. * in compliance with the License.
  8. *
  9. * You can obtain a copy of the license at
  10. * https://open-jbi-components.dev.java.net/public/CDDLv1.0.html.
  11. * See the License for the specific language governing
  12. * permissions and limitations under the License.
  13. *
  14. * When distributing Covered Code, include this CDDL
  15. * HEADER in each file and include the License file at
  16. * https://open-jbi-components.dev.java.net/public/CDDLv1.0.html.
  17. * If applicable add the following below this CDDL HEADER,
  18. * with the fields enclosed by brackets "[]" replaced with
  19. * your own identifying information: Portions Copyright
  20. * [year] [name of copyright owner]
  21. */
  22. /*
  23. * @(#)CobolCharacteristics.java
  24. *
  25. * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved.
  26. *
  27. * END_HEADER - DO NOT EDIT
  28. */
  29. package com.sun.encoder.coco.runtime;
  30. import java.util.Collections;
  31. import java.util.HashMap;
  32. import java.util.Map;
  33. import java.util.StringTokenizer;
  34. import com.sun.encoder.coco.runtime.messages.ErrorManager;
  35. import com.sun.encoder.coco.runtime.messages.Message;
  36. import com.sun.encoder.coco.runtime.messages.MessageCatalog;
  37. /**
  38. * Characteristics of Cobol items stemming from the clauses and
  39. * pictures used to describe them.
  40. *
  41. * @author Noel Ang, Jun Xu
  42. */
  43. public class CobolCharacteristics {
  44. /**
  45. * Creates an alphabetic, display-usage item description wih all boolean
  46. * characteristics set to false, and all numerical characteristics set to
  47. * 0.
  48. */
  49. public CobolCharacteristics() {
  50. }
  51. /**
  52. * Retrieve an integral representation of the characteristics. The value
  53. * returned is suitable for initializing {@link CobolCharacteristics} thru
  54. * {@link #fromString(String)}.
  55. * <p/>
  56. * The generated specification is encoded:
  57. * <p/>
  58. * <code>
  59. * p ! u ! d,P ! L ! e,B,J ! S,s,t ! R,r
  60. *
  61. * Symbols:
  62. * p picture category (internal object)
  63. * u usage type (internal object)
  64. * d decimal position integer
  65. * P decimal scaling positions integer
  66. * L item size (logical unit, not bytes) integer
  67. * B is-blank-when-zero boolean (1 or 0)
  68. * J is-justified boolean (1 or 0)
  69. * S is-signed boolean (1 or 0)
  70. * s sign-is-leading boolean (set == 1;
  71. * unset == sign-is-trailing == 0)
  72. * t sign-is-separate boolean (1 or 0)
  73. * </code>
  74. *
  75. * @return string repressentation of the characteristics
  76. */
  77. @Override
  78. public String toString() {
  79. return serialize();
  80. }
  81. /**
  82. * Initialize the characteristics represented by this object using an
  83. * exported description.
  84. *
  85. * <p/>
  86. * The expected encoding of the specification is:
  87. * <p/>
  88. * <code>
  89. * p ! u ! d,P ! L ! e,B,J ! S,s,t ! R,r
  90. *
  91. * Symbols:
  92. * p picture category (internal object)
  93. * u usage type (internal object)
  94. * d decimal position integer
  95. * P decimal scaling positions integer
  96. * L item size (logical unit, not bytes) integer
  97. * B is-blank-when-zero boolean (1 or 0)
  98. * J is-justified boolean (1 or 0)
  99. * S is-signed boolean (1 or 0)
  100. * s sign-is-leading boolean (set == 1;
  101. * unset == sign-is-trailing == 0)
  102. * t sign-is-separate boolean (1 or 0)
  103. * </code>
  104. *
  105. * @param spec Value obtained from a {@link CobolCharacteristics} object
  106. * thru {@link #toString()}.
  107. *
  108. * @throws NullPointerException If <code>spec</code> is <code>null</code>
  109. * @throws IllegalArgumentException if the characteristics description is
  110. * not well-formed
  111. */
  112. public void fromString(String spec) {
  113. initialize(spec);
  114. }
  115. // Used to write out the object state in exported form
  116. private String serialize() {
  117. final StringBuffer strbuf = new StringBuffer(STRBUF_INITIAL_SIZE);
  118. serializeCategory(strbuf);
  119. strbuf.append("!");
  120. serializeUsage(strbuf);
  121. strbuf.append("!");
  122. serializeScaling(strbuf);
  123. strbuf.append("!");
  124. serializeSize(strbuf);
  125. strbuf.append("!");
  126. serializeBasicFlags(strbuf);
  127. strbuf.append("!");
  128. serializeSignFlags(strbuf);
  129. return strbuf.toString();
  130. }
  131. // Used to initialize/synchronized internal object state to exported specs
  132. private void initialize(String spec) {
  133. final StringTokenizer tokr;
  134. if (spec == null) {
  135. throw new NullPointerException();
  136. }
  137. tokr = new StringTokenizer(spec, "!");
  138. try {
  139. initializeCategory(tokr);
  140. initializeUsage(tokr);
  141. initializeScaling(tokr);
  142. initializeSize(tokr);
  143. initializeBasicFlags(tokr);
  144. initializeSignFlags(tokr);
  145. initializeRedefinitionFlags(tokr);
  146. } catch (Exception e) {
  147. Message msg = MessageCatalog.getMessage("CCCD4005");
  148. mErrorMgr.log(ErrorManager.Severity.ERROR,
  149. e,
  150. msg.formatText(new Object[]{e.getLocalizedMessage()}));
  151. }
  152. }
  153. private void initializeCategory(StringTokenizer tokr) {
  154. if (!tokr.hasMoreTokens()) {
  155. throw new IllegalArgumentException("Category unreadable");
  156. }
  157. String categoryToken = tokr.nextToken();
  158. Integer category;
  159. if ((category = PIC_MAP.get(categoryToken)) == null) {
  160. throw new IllegalArgumentException(
  161. "Invalid category information; scalar: " + categoryToken);
  162. }
  163. mPicture = category.intValue();
  164. }
  165. private void serializeCategory(StringBuffer buf) {
  166. buf.append(PIC_ARRAY[mPicture]);
  167. }
  168. private void initializeUsage(StringTokenizer tokr) {
  169. if (!tokr.hasMoreTokens()) {
  170. throw new IllegalArgumentException("Usage unreadable");
  171. }
  172. String usageToken = tokr.nextToken();
  173. Integer usage;
  174. if ((usage = USAGE_MAP.get(usageToken)) == null) {
  175. throw new IllegalArgumentException(
  176. "Invalid usage information; scalar: " + usageToken);
  177. }
  178. mUsage = usage;
  179. }
  180. private void serializeUsage(StringBuffer buf) {
  181. buf.append(USAGE_ARRAY[mUsage]);
  182. }
  183. private void initializeScaling(StringTokenizer tokr) {
  184. if (!tokr.hasMoreTokens()) {
  185. throw new IllegalArgumentException("Scaling unreadable");
  186. }
  187. StringTokenizer tupleTokr;
  188. String tuple;
  189. tuple = tokr.nextToken();
  190. tupleTokr = new StringTokenizer(tuple, ","); // no i18n
  191. if (tupleTokr.countTokens() < 2) {
  192. throw new IllegalArgumentException("Scaling 2-tuple unreadable");
  193. }
  194. // scale
  195. Integer val = new Integer(tupleTokr.nextToken()); // may raise IAE
  196. mScale = val.intValue();
  197. // decimal scaling positions
  198. val = new Integer(tupleTokr.nextToken()); // may raise IAE
  199. mScalingPositions = val.intValue();
  200. }
  201. private void serializeScaling(StringBuffer buf) {
  202. buf.append(mScale);
  203. buf.append(',');
  204. buf.append(mScalingPositions);
  205. }
  206. private void initializeSize(StringTokenizer tokr) {
  207. if (!tokr.hasMoreTokens()) {
  208. throw new IllegalArgumentException("Size unreadable");
  209. }
  210. Integer val = new Integer(tokr.nextToken()); // may raise IAE
  211. mSize = val.intValue();
  212. }
  213. private void serializeSize(StringBuffer buf) {
  214. buf.append(mSize);
  215. }
  216. private void initializeBasicFlags(StringTokenizer tokr) {
  217. if (!tokr.hasMoreTokens()) {
  218. throw new IllegalArgumentException("Basic flags unreadable");
  219. }
  220. StringTokenizer flagTokr;
  221. flagTokr = new StringTokenizer(tokr.nextToken(), ","); // no i18n
  222. if (flagTokr.countTokens() < 3) {
  223. throw new IllegalArgumentException("Basic flag tuple unreadable");
  224. }
  225. mIsBlankWhenZero = flagToBoolean(flagTokr.nextToken());
  226. mIsJustified = flagToBoolean(flagTokr.nextToken());
  227. }
  228. private void serializeBasicFlags(StringBuffer buf) {
  229. buf.append(booleanToFlag(mIsBlankWhenZero));
  230. buf.append(',');
  231. buf.append(booleanToFlag(mIsJustified));
  232. }
  233. private void initializeSignFlags(StringTokenizer tokr) {
  234. if (!tokr.hasMoreTokens()) {
  235. throw new IllegalArgumentException("Sign flags unreadable");
  236. }
  237. StringTokenizer signTokr;
  238. signTokr = new StringTokenizer(tokr.nextToken(), ","); // no i18n
  239. if (signTokr.countTokens() < 3) {
  240. throw new IllegalArgumentException("Sign flag tuple unreadable");
  241. }
  242. mIsSigned = flagToBoolean(signTokr.nextToken());
  243. mIsSignLeading = flagToBoolean(signTokr.nextToken());
  244. mIsSignSeparate = flagToBoolean(signTokr.nextToken());
  245. }
  246. private void serializeSignFlags(StringBuffer buf) {
  247. buf.append(booleanToFlag(mIsSigned));
  248. buf.append(',');
  249. buf.append(booleanToFlag(mIsSignLeading));
  250. buf.append(',');
  251. buf.append(booleanToFlag(mIsSignSeparate));
  252. }
  253. private void initializeRedefinitionFlags(StringTokenizer tokr) {
  254. if (!tokr.hasMoreTokens()) {
  255. throw new IllegalArgumentException(
  256. "Redefinition flags unreadable");
  257. }
  258. StringTokenizer redefTokr;
  259. redefTokr = new StringTokenizer(tokr.nextToken(), ","); // no i18n
  260. if (redefTokr.countTokens() < 2) {
  261. throw new IllegalArgumentException(
  262. "Redefinition flag tuple unreadable");
  263. }
  264. }
  265. private boolean flagToBoolean(String val) {
  266. // ESR 104580
  267. // It appears the following String comparison
  268. // is very expensive since this function is
  269. // called many times by other functions.
  270. // Switch to the optimized code.
  271. //if ("0".equals(val)) { // no i18n
  272. // return Boolean.FALSE.booleanValue();
  273. //}
  274. //else if ("1".equals(val)) { // no i18n
  275. // return Boolean.TRUE.booleanValue();
  276. //}
  277. switch (val.charAt(0)) {
  278. case '0':
  279. return false;
  280. case '1':
  281. return true;
  282. default:
  283. throw new IllegalArgumentException("Invalid flag value " + val);
  284. }
  285. }
  286. private char booleanToFlag(boolean bool) {
  287. if (bool) {
  288. return '1'; // no i18n
  289. } else {
  290. return '0'; // no i18n
  291. }
  292. }
  293. public void setPicCategory(int category) {
  294. if (category < 0 || category >= PIC_ARRAY.length) {
  295. throw new ArrayIndexOutOfBoundsException(category);
  296. }
  297. mPicture = category;
  298. }
  299. public int getPicCategory() {
  300. return mPicture;
  301. }
  302. public void setUsage(int usage) {
  303. if (usage < 0 || usage >= USAGE_ARRAY.length) {
  304. throw new ArrayIndexOutOfBoundsException(usage);
  305. }
  306. mUsage = usage;
  307. }
  308. public int getUsage() {
  309. return mUsage;
  310. }
  311. public String descUsage() {
  312. switch (mUsage) {
  313. case USAGE_DEGENERATE:
  314. return "DEGENERATE";
  315. case USAGE_BINARY:
  316. return "BINARY";
  317. case USAGE_COMP:
  318. return "COMP";
  319. case USAGE_COMP4:
  320. return "COMP4";
  321. case USAGE_PACKED:
  322. return "PACKED";
  323. case USAGE_COMP3:
  324. return "COMP3";
  325. case USAGE_COMP5:
  326. return "COMP5";
  327. case USAGE_COMP1:
  328. return "COMP1";
  329. case USAGE_COMP2:
  330. return "COMP2";
  331. case USAGE_DISPLAY:
  332. return "DISPLAY";
  333. case USAGE_DISPLAY1:
  334. return "DISPLAY1";
  335. case USAGE_INDEX:
  336. return "INDEX";
  337. default:
  338. return "<UNKNOWN USAGE>";
  339. }
  340. }
  341. public String descCategory() {
  342. switch (mPicture) {
  343. case PIC_DEGENERATE:
  344. return "DEGENERATE";
  345. case PIC_ALPHA:
  346. return "ALPHA";
  347. case PIC_ALPHANUM:
  348. return "ALPHANUM";
  349. case PIC_NUM:
  350. return "NUM";
  351. case PIC_NUME:
  352. return "NUME";
  353. case PIC_DBCS:
  354. return "DBCS";
  355. case PIC_EXFLOAT:
  356. return "EXFLOAT";
  357. default:
  358. return "<UNKNOWN CATEGORY>";
  359. }
  360. }
  361. public String descUsageCategory() {
  362. String desc = descUsage();
  363. if (mUsage == USAGE_DISPLAY || mUsage == USAGE_DISPLAY1) {
  364. desc += "-" + descCategory();
  365. }
  366. return desc;
  367. }
  368. public void setDecimalPosition(int pos) {
  369. pos = Math.max(0, pos);
  370. mScale = pos;
  371. }
  372. public int getDecimalPosition() {
  373. return mScale;
  374. }
  375. public void setDecimalScalingPositions(int posses) {
  376. posses = Math.max(0, posses);
  377. mScalingPositions = posses;
  378. }
  379. public int getDecimalScalingPositions() {
  380. return mScalingPositions;
  381. }
  382. public void setSize(int size) {
  383. size = Math.max(0, size);
  384. mSize = size;
  385. }
  386. public int getSize() {
  387. return mSize;
  388. }
  389. public void setJustified(boolean val) {
  390. mIsJustified = val;
  391. }
  392. public boolean isJustified() {
  393. return mIsJustified;
  394. }
  395. public void setSignSeparate(boolean val) {
  396. mIsSignSeparate = val;
  397. }
  398. public boolean isSignSeparate() {
  399. return mIsSignSeparate;
  400. }
  401. public void setSignLeading(boolean val) {
  402. mIsSignLeading = val;
  403. }
  404. public boolean isSignLeading() {
  405. return mIsSignLeading;
  406. }
  407. public void setSigned(boolean val) {
  408. mIsSigned = val;
  409. }
  410. public boolean isSigned() {
  411. return mIsSigned;
  412. }
  413. public void setBlankWhenZero(boolean val) {
  414. mIsBlankWhenZero = val;
  415. }
  416. public boolean isBlankWhenZero() {
  417. return mIsBlankWhenZero;
  418. }
  419. private static final int STRBUF_INITIAL_SIZE = 80;
  420. // Bit mask for obtaining picture category information
  421. public static final int PIC_DEGENERATE = 0;
  422. public static final int PIC_ALPHA = 1;
  423. public static final int PIC_ALPHANUM = 2;
  424. public static final int PIC_ALPHANUME = 3;
  425. public static final int PIC_NUM = 4;
  426. public static final int PIC_NUME = 5;
  427. public static final int PIC_DBCS = 6;
  428. public static final int PIC_EXFLOAT = 7;
  429. public static final int MAX_PIC_VALUE = 7;
  430. // Bit mask for obtaining usage information
  431. public static final int USAGE_DEGENERATE = 0;
  432. public static final int USAGE_DISPLAY = 1;
  433. public static final int USAGE_BINARY = 2;
  434. public static final int USAGE_COMP = 3;
  435. public static final int USAGE_COMP4 = 4;
  436. public static final int USAGE_PACKED = 5;
  437. public static final int USAGE_COMP3 = 6;
  438. public static final int USAGE_COMP5 = 7;
  439. public static final int USAGE_COMP1 = 8;
  440. public static final int USAGE_COMP2 = 9;
  441. public static final int USAGE_DISPLAY1 = 10;
  442. public static final int USAGE_INDEX = 11;
  443. public static final int MAX_USAGE_VALUE = 11;
  444. private static Map<String, Integer> PIC_MAP;
  445. private static String[] PIC_ARRAY = new String[MAX_PIC_VALUE + 1];
  446. private static Map<String, Integer> USAGE_MAP;
  447. private static String[] USAGE_ARRAY = new String[MAX_USAGE_VALUE + 1];
  448. private static final String DEGENERATE_PIC = "Degenerate.PIC"; // no i18n
  449. private static final String ALPHA_PIC = "Alphabetic"; // no i18n
  450. private static final String ALPHANUM_PIC = "Alphanumeric"; // no i18n
  451. private static final String ALPHANUME_PIC = "Alphanumeric-edited"; // no i18n
  452. private static final String NUM_PIC = "Numeric"; // no i18n
  453. private static final String NUME_PIC = "Numeric-edited"; // no i18n
  454. private static final String DBCS_PIC = "DBCS"; // no i18n
  455. private static final String EXFLOAT_PIC = "External floating point"; // no i18n
  456. static {
  457. PIC_MAP = new HashMap<String, Integer>();
  458. PIC_MAP.put(DEGENERATE_PIC, new Integer(PIC_DEGENERATE));
  459. PIC_MAP.put(ALPHA_PIC, new Integer(PIC_ALPHA));
  460. PIC_MAP.put(ALPHANUM_PIC, new Integer(PIC_ALPHANUM));
  461. PIC_MAP.put(ALPHANUME_PIC, new Integer(PIC_ALPHANUME));
  462. PIC_MAP.put(NUM_PIC, new Integer(PIC_NUM));
  463. PIC_MAP.put(NUME_PIC, new Integer(PIC_NUME));
  464. PIC_MAP.put(DBCS_PIC, new Integer(PIC_DBCS));
  465. PIC_MAP.put(EXFLOAT_PIC, new Integer(PIC_EXFLOAT));
  466. PIC_MAP = Collections.unmodifiableMap(PIC_MAP);
  467. PIC_ARRAY[PIC_DEGENERATE] = DEGENERATE_PIC;
  468. PIC_ARRAY[PIC_ALPHA] = ALPHA_PIC;
  469. PIC_ARRAY[PIC_ALPHANUM] = ALPHANUM_PIC;
  470. PIC_ARRAY[PIC_ALPHANUME] = ALPHANUME_PIC;
  471. PIC_ARRAY[PIC_NUM] = NUM_PIC;
  472. PIC_ARRAY[PIC_NUME] = NUME_PIC;
  473. PIC_ARRAY[PIC_DBCS] = DBCS_PIC;
  474. PIC_ARRAY[PIC_EXFLOAT] = EXFLOAT_PIC;
  475. }
  476. private static final String DEGENERATE_USAGE = "Degenerate.USAGE"; // no i18n
  477. private static final String DISPLAY_USAGE = "Display"; // no i18n
  478. private static final String BINARY_USAGE = "Binary"; // no i18n
  479. private static final String COMP_USAGE = "Comp";
  480. private static final String COMP4_USAGE = "Comp4";
  481. private static final String PACKED_USAGE = "Packed"; // no i18n
  482. private static final String COMP3_USAGE = "Comp3";
  483. private static final String COMP5_USAGE = "Comp5"; // no i18n
  484. private static final String COMP1_USAGE = "Comp1"; // no i18n
  485. private static final String COMP2_USAGE = "Comp2"; // no i18n
  486. private static final String DISPLAY1_USAGE = "Display1"; // no i18n
  487. private static final String INDEX_USAGE = "Index"; // no i18n
  488. static {
  489. USAGE_MAP = new HashMap<String, Integer>();
  490. USAGE_MAP.put(DEGENERATE_USAGE, new Integer(USAGE_DEGENERATE));
  491. USAGE_MAP.put(DISPLAY_USAGE, new Integer(USAGE_DISPLAY));
  492. USAGE_MAP.put(BINARY_USAGE, new Integer(USAGE_BINARY));
  493. USAGE_MAP.put(COMP_USAGE, new Integer(USAGE_COMP));
  494. USAGE_MAP.put(COMP4_USAGE, new Integer(USAGE_COMP4));
  495. USAGE_MAP.put(PACKED_USAGE, new Integer(USAGE_PACKED));
  496. USAGE_MAP.put(COMP3_USAGE, new Integer(USAGE_COMP3));
  497. USAGE_MAP.put(COMP5_USAGE, new Integer(USAGE_COMP5));
  498. USAGE_MAP.put(COMP1_USAGE, new Integer(USAGE_COMP1));
  499. USAGE_MAP.put(COMP2_USAGE, new Integer(USAGE_COMP2));
  500. USAGE_MAP.put(DISPLAY1_USAGE, new Integer(USAGE_DISPLAY1));
  501. USAGE_MAP.put(INDEX_USAGE, new Integer(USAGE_INDEX));
  502. USAGE_MAP = Collections.unmodifiableMap(USAGE_MAP);
  503. USAGE_ARRAY[USAGE_DEGENERATE] = DEGENERATE_USAGE;
  504. USAGE_ARRAY[USAGE_DISPLAY] = DISPLAY_USAGE;
  505. USAGE_ARRAY[USAGE_BINARY] = BINARY_USAGE;
  506. USAGE_ARRAY[USAGE_COMP] = COMP_USAGE;
  507. USAGE_ARRAY[USAGE_COMP4] = COMP4_USAGE;
  508. USAGE_ARRAY[USAGE_PACKED] = PACKED_USAGE;
  509. USAGE_ARRAY[USAGE_COMP3] = COMP3_USAGE;
  510. USAGE_ARRAY[USAGE_COMP5] = COMP5_USAGE;
  511. USAGE_ARRAY[USAGE_COMP1] = COMP1_USAGE;
  512. USAGE_ARRAY[USAGE_COMP2] = COMP2_USAGE;
  513. USAGE_ARRAY[USAGE_DISPLAY1] = DISPLAY1_USAGE;
  514. USAGE_ARRAY[USAGE_INDEX] = INDEX_USAGE;
  515. }
  516. private final ErrorManager mErrorMgr =
  517. ErrorManager.getManager("STC.eWay.converter.COBOLCopybook." + CobolCharacteristics.class.getName());
  518. private int mUsage = USAGE_DISPLAY;
  519. private int mPicture = PIC_ALPHA;
  520. private int mSize;
  521. private int mScale;
  522. private int mScalingPositions;
  523. private boolean mIsSigned;
  524. private boolean mIsSignLeading;
  525. private boolean mIsSignSeparate;
  526. private boolean mIsBlankWhenZero;
  527. private boolean mIsJustified;
  528. }
  529. // FINIS $RCSfile: CobolCharacteristics.java,v $