You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

AreaTreeBuilder.java 24KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. /*
  2. * $Id$
  3. * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
  4. * For details on use and redistribution please refer to the
  5. * LICENSE file included with these sources.
  6. */
  7. package org.apache.fop.tools;
  8. import org.apache.fop.apps.*;
  9. import org.apache.fop.configuration.*;
  10. import org.apache.fop.area.*;
  11. import org.apache.fop.area.inline.*;
  12. import org.apache.fop.area.inline.Character;
  13. import org.apache.fop.render.*;
  14. import org.apache.fop.render.pdf.*;
  15. import org.apache.fop.render.svg.*;
  16. import org.apache.fop.render.xml.*;
  17. import org.apache.fop.layout.FontInfo;
  18. import org.apache.fop.layout.FontState;
  19. import org.apache.fop.layout.FontMetric;
  20. import org.apache.fop.fo.FOUserAgent;
  21. import org.apache.avalon.framework.logger.ConsoleLogger;
  22. import org.apache.avalon.framework.logger.AbstractLogEnabled;
  23. import java.io.*;
  24. import java.util.*;
  25. import java.awt.geom.Rectangle2D;
  26. import java.util.StringTokenizer;
  27. import javax.xml.parsers.DocumentBuilderFactory;
  28. import org.w3c.dom.*;
  29. import org.apache.batik.dom.svg.SVGDOMImplementation;
  30. import org.apache.batik.dom.util.DOMUtilities;
  31. /**
  32. * Area tree tester.
  33. * The purpose of this class is to create and render an area tree
  34. * for the purpose of testing the area tree and rendering.
  35. * This covers the set of possible properties that can be set
  36. * on the area tree for rendering.
  37. * As this is not for general purpose there is no attempt to handle
  38. * invalid area tree xml.
  39. *
  40. * Tests: different renderers, saving and loading pages with serialization
  41. * out of order rendering
  42. */
  43. public class AreaTreeBuilder extends AbstractLogEnabled {
  44. /**
  45. */
  46. public static void main(String[] args) {
  47. AreaTreeBuilder atb = new AreaTreeBuilder();
  48. atb.enableLogging(new ConsoleLogger(ConsoleLogger.LEVEL_DEBUG));
  49. atb.runTests(args[0], args[1], args[2]);
  50. System.exit(0);
  51. }
  52. /**
  53. *
  54. */
  55. protected void runTests(String in, String type, String out) {
  56. getLogger().debug("Starting tests");
  57. runTest(in, type, out);
  58. getLogger().debug("Finished");
  59. }
  60. /**
  61. */
  62. protected void runTest(String in, String type, String out) {
  63. Renderer rend = null;
  64. if ("xml".equals(type)) {
  65. rend = new XMLRenderer();
  66. } else if ("pdf".equals(type)) {
  67. rend = new PDFRenderer();
  68. } else if ("svg".equals(type)) {
  69. rend = new SVGRenderer();
  70. }
  71. setupLogger(rend);
  72. FontInfo fi = new FontInfo();
  73. rend.setupFontInfo(fi);
  74. FOUserAgent ua = new FOUserAgent();
  75. setupLogger(ua);
  76. rend.setUserAgent(ua);
  77. AreaTree.StorePagesModel sm = AreaTree.createStorePagesModel();
  78. TreeLoader tl = new TreeLoader(fi);
  79. tl.setTreeModel(sm);
  80. try {
  81. InputStream is =
  82. new BufferedInputStream(new FileInputStream(in));
  83. tl.buildAreaTree(is);
  84. renderAreaTree(sm, rend, out);
  85. } catch (IOException e) {
  86. getLogger().error("error reading file" + e.getMessage(), e);
  87. }
  88. }
  89. protected void renderAreaTree(AreaTree.StorePagesModel sm,
  90. Renderer rend, String out) {
  91. try {
  92. OutputStream os =
  93. new BufferedOutputStream(new FileOutputStream(out));
  94. rend.startRenderer(os);
  95. int count = 0;
  96. int seqc = sm.getPageSequenceCount();
  97. while (count < seqc) {
  98. Title title = sm.getTitle(count);
  99. rend.startPageSequence(title);
  100. int pagec = sm.getPageCount(count);
  101. int c = 0;
  102. while (c < pagec) {
  103. PageViewport page = sm.getPage(count, c);
  104. c++;
  105. // save the page to a stream for testing
  106. /*ObjectOutputStream tempstream = new ObjectOutputStream(
  107. new BufferedOutputStream(
  108. new FileOutputStream("temp.ser")));
  109. page.savePage(tempstream);
  110. tempstream.close();
  111. File temp = new File("temp.ser");
  112. getLogger().debug("page serialized to: " + temp.length());
  113. temp = null;
  114. ObjectInputStream in = new ObjectInputStream(
  115. new BufferedInputStream(
  116. new FileInputStream("temp.ser")));
  117. page.loadPage(in);
  118. in.close();*/
  119. rend.renderPage(page);
  120. }
  121. count++;
  122. }
  123. rend.stopRenderer();
  124. os.close();
  125. } catch (Exception e) {
  126. getLogger().error("error rendering output", e);
  127. }
  128. }
  129. }
  130. // this loads an area tree from an xml file
  131. // the xml format is the same as the xml renderer output
  132. class TreeLoader {
  133. AreaTree areaTree;
  134. AreaTree.AreaTreeModel model;
  135. FontInfo fontInfo;
  136. FontState currentFontState;
  137. TreeLoader(FontInfo fi) {
  138. fontInfo = fi;
  139. }
  140. public void setTreeModel(AreaTree.AreaTreeModel mo) {
  141. model = mo;
  142. }
  143. public void buildAreaTree(InputStream is) {
  144. Document doc = null;
  145. try {
  146. DocumentBuilderFactory fact =
  147. DocumentBuilderFactory.newInstance();
  148. fact.setNamespaceAware(true);
  149. doc = fact.newDocumentBuilder().parse(is);
  150. } catch (Exception e) {
  151. e.printStackTrace();
  152. }
  153. Element root = null;
  154. root = doc.getDocumentElement();
  155. areaTree = new AreaTree();
  156. areaTree.setTreeModel(model);
  157. readAreaTree(root);
  158. }
  159. public void readAreaTree(Element root) {
  160. NodeList childs = root.getChildNodes();
  161. for (int i = 0; i < childs.getLength(); i++) {
  162. Node obj = childs.item(i);
  163. if (obj.getNodeName().equals("pageSequence")) {
  164. readPageSequence((Element) obj);
  165. }
  166. }
  167. }
  168. public void readPageSequence(Element root) {
  169. Title title = null;
  170. boolean started = false;
  171. NodeList childs = root.getChildNodes();
  172. for (int i = 0; i < childs.getLength(); i++) {
  173. Node obj = childs.item(i);
  174. if (obj.getNodeName().equals("title")) {
  175. if (started) {
  176. // problem
  177. } else {
  178. title = readTitle((Element) obj);
  179. model.startPageSequence(title);
  180. started = true;
  181. }
  182. } else if (obj.getNodeName().equals("pageViewport")) {
  183. if (!started) {
  184. model.startPageSequence(null);
  185. started = true;
  186. }
  187. PageViewport viewport = readPageViewport((Element) obj);
  188. areaTree.addPage(viewport);
  189. }
  190. }
  191. }
  192. public Title readTitle(Element root) {
  193. Title title = new Title();
  194. List childs = getInlineAreas(root);
  195. for (int i = 0; i < childs.size(); i++) {
  196. InlineArea obj = (InlineArea) childs.get(i);
  197. title.addInlineArea(obj);
  198. }
  199. return title;
  200. }
  201. public PageViewport readPageViewport(Element root) {
  202. Rectangle2D bounds = getRectangle(root, "bounds");
  203. PageViewport viewport = null;
  204. NodeList childs = root.getChildNodes();
  205. for (int i = 0; i < childs.getLength(); i++) {
  206. Node obj = childs.item(i);
  207. if (obj.getNodeName().equals("page")) {
  208. Page page = readPage((Element) obj);
  209. viewport = new PageViewport(page, bounds);
  210. }
  211. }
  212. return viewport;
  213. }
  214. public Page readPage(Element root) {
  215. String bounds = root.getAttribute("bounds");
  216. Page page = new Page();
  217. NodeList childs = root.getChildNodes();
  218. for (int i = 0; i < childs.getLength(); i++) {
  219. Node obj = childs.item(i);
  220. if (obj.getNodeName().equals("regionViewport")) {
  221. readRegionViewport(page, (Element) obj);
  222. }
  223. }
  224. return page;
  225. }
  226. Rectangle2D getRectangle(Element root, String attr) {
  227. String rect = root.getAttribute(attr);
  228. StringTokenizer st = new StringTokenizer(rect, " ");
  229. int x = 0, y = 0, w = 0, h = 0;
  230. if (st.hasMoreTokens()) {
  231. String tok = st.nextToken();
  232. x = Integer.parseInt(tok);
  233. }
  234. if (st.hasMoreTokens()) {
  235. String tok = st.nextToken();
  236. y = Integer.parseInt(tok);
  237. }
  238. if (st.hasMoreTokens()) {
  239. String tok = st.nextToken();
  240. w = Integer.parseInt(tok);
  241. }
  242. if (st.hasMoreTokens()) {
  243. String tok = st.nextToken();
  244. h = Integer.parseInt(tok);
  245. }
  246. Rectangle2D r2d = new Rectangle2D.Float(x, y, w, h);
  247. return r2d;
  248. }
  249. public RegionViewport readRegionViewport(Page page, Element root) {
  250. RegionViewport reg = new RegionViewport(getRectangle(root, "rect"));
  251. NodeList childs = root.getChildNodes();
  252. for (int i = 0; i < childs.getLength(); i++) {
  253. Node obj = childs.item(i);
  254. if (obj.getNodeName().equals("regionBefore")) {
  255. reg.setRegion(readRegion((Element) obj, RegionReference.BEFORE));
  256. page.setRegion(RegionReference.BEFORE, reg);
  257. } else if (obj.getNodeName().equals("regionStart")) {
  258. reg.setRegion(readRegion((Element) obj, RegionReference.START));
  259. page.setRegion(RegionReference.START, reg);
  260. } else if (obj.getNodeName().equals("regionBody")) {
  261. reg.setRegion(readRegion((Element) obj, RegionReference.BODY));
  262. page.setRegion(RegionReference.BODY, reg);
  263. } else if (obj.getNodeName().equals("regionEnd")) {
  264. reg.setRegion(readRegion((Element) obj, RegionReference.END));
  265. page.setRegion(RegionReference.END, reg);
  266. } else if (obj.getNodeName().equals("regionAfter")) {
  267. reg.setRegion(readRegion((Element) obj, RegionReference.AFTER));
  268. page.setRegion(RegionReference.AFTER, reg);
  269. }
  270. }
  271. return reg;
  272. }
  273. public RegionReference readRegion(Element root, int type) {
  274. RegionReference reg;
  275. if (type == RegionReference.BODY) {
  276. BodyRegion br = new BodyRegion();
  277. NodeList childs = root.getChildNodes();
  278. for (int i = 0; i < childs.getLength(); i++) {
  279. Node obj = childs.item(i);
  280. if (obj.getNodeName().equals("beforeFloat")) {
  281. BeforeFloat bf = readBeforeFloat((Element) obj);
  282. br.setBeforeFloat(bf);
  283. } else if (obj.getNodeName().equals("mainReference")) {
  284. MainReference mr = readMainReference((Element) obj);
  285. br.setMainReference(mr);
  286. } else if (obj.getNodeName().equals("footnote")) {
  287. Footnote foot = readFootnote((Element) obj);
  288. br.setFootnote(foot);
  289. }
  290. }
  291. reg = br;
  292. } else {
  293. reg = new RegionReference(type);
  294. List blocks = getBlocks(root);
  295. for (int i = 0; i < blocks.size(); i++) {
  296. Block obj = (Block) blocks.get(i);
  297. reg.addBlock(obj);
  298. }
  299. }
  300. reg.setCTM(new CTM());
  301. return reg;
  302. }
  303. public BeforeFloat readBeforeFloat(Element root) {
  304. BeforeFloat bf = new BeforeFloat();
  305. List blocks = getBlocks(root);
  306. for (int i = 0; i < blocks.size(); i++) {
  307. Block obj = (Block) blocks.get(i);
  308. bf.addBlock(obj);
  309. }
  310. return bf;
  311. }
  312. public MainReference readMainReference(Element root) {
  313. MainReference mr = new MainReference();
  314. List spans = getSpans(root);
  315. for (int i = 0; i < spans.size(); i++) {
  316. Span obj = (Span) spans.get(i);
  317. mr.addSpan(obj);
  318. }
  319. return mr;
  320. }
  321. List getSpans(Element root) {
  322. ArrayList list = new ArrayList();
  323. NodeList childs = root.getChildNodes();
  324. for (int i = 0; i < childs.getLength(); i++) {
  325. Node obj = childs.item(i);
  326. if (obj.getNodeName().equals("span")) {
  327. List flows = getFlows((Element) obj);
  328. Span span = new Span(flows.size());
  329. for (int j = 0; j < flows.size(); j++) {
  330. Flow flow = (Flow) flows.get(j);
  331. span.addFlow(flow);
  332. }
  333. list.add(span);
  334. }
  335. }
  336. return list;
  337. }
  338. List getFlows(Element root) {
  339. ArrayList list = new ArrayList();
  340. NodeList childs = root.getChildNodes();
  341. for (int i = 0; i < childs.getLength(); i++) {
  342. Node obj = childs.item(i);
  343. if (obj.getNodeName().equals("flow")) {
  344. Flow flow = new Flow();
  345. List blocks = getBlocks((Element) obj);
  346. for (int j = 0; j < blocks.size(); j++) {
  347. Block block = (Block) blocks.get(j);
  348. flow.addBlock(block);
  349. }
  350. list.add(flow);
  351. }
  352. }
  353. return list;
  354. }
  355. public Footnote readFootnote(Element root) {
  356. Footnote foot = new Footnote();
  357. List blocks = getBlocks(root);
  358. for (int i = 0; i < blocks.size(); i++) {
  359. Block obj = (Block) blocks.get(i);
  360. foot.addBlock(obj);
  361. }
  362. return foot;
  363. }
  364. List getBlocks(Element root) {
  365. ArrayList list = new ArrayList();
  366. NodeList childs = root.getChildNodes();
  367. for (int i = 0; i < childs.getLength(); i++) {
  368. Node obj = childs.item(i);
  369. if (obj.getNodeName().equals("block")) {
  370. Block block = new Block();
  371. addTraits((Element)obj, block);
  372. addBlockChildren(block, (Element) obj);
  373. list.add(block);
  374. }
  375. }
  376. return list;
  377. }
  378. protected void addBlockChildren(Block block, Element root) {
  379. NodeList childs = root.getChildNodes();
  380. int type = -1;
  381. for (int i = 0; i < childs.getLength(); i++) {
  382. Node obj = childs.item(i);
  383. if (obj.getNodeName().equals("block")) {
  384. if (type == 2) {
  385. // error
  386. }
  387. Block b = new Block();
  388. addBlockChildren(b, (Element) obj);
  389. block.addBlock(b);
  390. type = 1;
  391. } else if (obj.getNodeName().equals("lineArea")) {
  392. if (type == 1) {
  393. // error
  394. }
  395. LineArea line = new LineArea();
  396. addTraits((Element) obj, line);
  397. String height = ((Element) obj).getAttribute("height");
  398. int h = Integer.parseInt(height);
  399. line.setHeight(h);
  400. List inlines = getInlineAreas((Element) obj);
  401. for (int j = 0; j < inlines.size(); j++) {
  402. InlineArea inline = (InlineArea) inlines.get(j);
  403. line.addInlineArea(inline);
  404. }
  405. block.addLineArea(line);
  406. type = 2;
  407. }
  408. }
  409. }
  410. // children of element are inline areas
  411. List getInlineAreas(Element root) {
  412. ArrayList list = new ArrayList();
  413. NodeList childs = root.getChildNodes();
  414. for (int i = 0; i < childs.getLength(); i++) {
  415. Node obj = childs.item(i);
  416. if (obj.getNodeName().equals("char")) {
  417. Character ch =
  418. new Character(getString((Element) obj).charAt(0));
  419. addTraits((Element) obj, ch);
  420. String fname = fontInfo.fontLookup("sans-serif", "normal", FontInfo.NORMAL);
  421. FontMetric metrics = fontInfo.getMetricsFor(fname);
  422. currentFontState =
  423. new FontState(fname, metrics, 12000);
  424. ch.setWidth(currentFontState.width(ch.getChar()));
  425. ch.setOffset(currentFontState.getCapHeight());
  426. list.add(ch);
  427. } else if (obj.getNodeName().equals("space")) {
  428. Space space = new Space();
  429. String width = ((Element) obj).getAttribute("width");
  430. int w = Integer.parseInt(width);
  431. space.setWidth(w);
  432. list.add(space);
  433. } else if (obj.getNodeName().equals("viewport")) {
  434. Viewport viewport = getViewport((Element) obj);
  435. if (viewport != null) {
  436. list.add(viewport);
  437. }
  438. } else if (obj.getNodeName().equals("leader")) {
  439. Leader leader = getLeader((Element) obj);
  440. if (leader != null) {
  441. list.add(leader);
  442. }
  443. } else if (obj.getNodeName().equals("word")) {
  444. String fname = fontInfo.fontLookup("sans-serif", "normal", FontInfo.NORMAL);
  445. FontMetric metrics = fontInfo.getMetricsFor(fname);
  446. currentFontState =
  447. new FontState(fname, metrics, 12000);
  448. Word word = getWord((Element) obj);
  449. word.addTrait(Trait.FONT_NAME, fname);
  450. word.addTrait(Trait.FONT_SIZE, new Integer(12000));
  451. if (word != null) {
  452. list.add(word);
  453. }
  454. } else {
  455. }
  456. }
  457. return list;
  458. }
  459. Viewport getViewport(Element root) {
  460. Area child = null;
  461. NodeList childs = root.getChildNodes();
  462. for (int i = 0; i < childs.getLength(); i++) {
  463. Node obj = childs.item(i);
  464. if (obj.getNodeName().equals("container")) {
  465. child = getContainer((Element) obj);
  466. } else if (obj.getNodeName().equals("foreignObject")) {
  467. child = getForeignObject((Element) obj);
  468. } else if (obj.getNodeName().equals("image")) {
  469. child = getImage((Element) obj);
  470. }
  471. }
  472. if (child == null) {
  473. return null;
  474. }
  475. Viewport viewport = new Viewport(child);
  476. String str = root.getAttribute("width");
  477. if (str != null && !"".equals(str)) {
  478. int width = Integer.parseInt(str);
  479. viewport.setWidth(width);
  480. }
  481. return viewport;
  482. }
  483. Container getContainer(Element root) {
  484. Container cont = new Container();
  485. List blocks = getBlocks(root);
  486. for (int i = 0; i < blocks.size(); i++) {
  487. Block obj = (Block) blocks.get(i);
  488. cont.addBlock(obj);
  489. }
  490. return cont;
  491. }
  492. ForeignObject getForeignObject(Element root) {
  493. Document doc;
  494. String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
  495. NodeList childs = root.getChildNodes();
  496. for (int i = 0; i < childs.getLength(); i++) {
  497. Node obj = childs.item(i);
  498. if (obj instanceof Element) {
  499. //getLogger().debug(obj.getNodeName());
  500. Element rootEle = (Element) obj;
  501. String space = rootEle.getAttribute("xmlns");
  502. if (svgNS.equals(space)) {
  503. try {
  504. DocumentBuilderFactory fact =
  505. DocumentBuilderFactory.newInstance();
  506. fact.setNamespaceAware(true);
  507. doc = fact. newDocumentBuilder().newDocument();
  508. Node node = doc.importNode(obj, true);
  509. doc.appendChild(node);
  510. DOMImplementation impl =
  511. SVGDOMImplementation.getDOMImplementation();
  512. // due to namespace problem attributes are not cloned
  513. // serializing causes an npe
  514. //doc = DOMUtilities.deepCloneDocument(doc, impl);
  515. ForeignObject fo = new ForeignObject(doc, svgNS);
  516. return fo;
  517. } catch (Exception e) {
  518. e.printStackTrace();
  519. }
  520. } else {
  521. try {
  522. DocumentBuilderFactory fact =
  523. DocumentBuilderFactory.newInstance();
  524. fact.setNamespaceAware(true);
  525. doc = fact. newDocumentBuilder().newDocument();
  526. Node node = doc.importNode(obj, true);
  527. doc.appendChild(node);
  528. ForeignObject fo = new ForeignObject(doc, space);
  529. return fo;
  530. } catch (Exception e) {
  531. e.printStackTrace();
  532. }
  533. }
  534. }
  535. }
  536. return null;
  537. }
  538. Image getImage(Element root) {
  539. String url = root.getAttribute("url");
  540. Image image = new Image(url);
  541. return image;
  542. }
  543. Leader getLeader(Element root) {
  544. Leader leader = new Leader();
  545. String rs = root.getAttribute("ruleStyle");
  546. if ("solid".equals(rs)) {
  547. leader.setRuleStyle(Leader.SOLID);
  548. } else if ("dotted".equals(rs)) {
  549. leader.setRuleStyle(Leader.DOTTED);
  550. } else if ("dashed".equals(rs)) {
  551. leader.setRuleStyle(Leader.DASHED);
  552. } else if ("double".equals(rs)) {
  553. leader.setRuleStyle(Leader.DOUBLE);
  554. } else if ("groove".equals(rs)) {
  555. leader.setRuleStyle(Leader.GROOVE);
  556. } else if ("ridge".equals(rs)) {
  557. leader.setRuleStyle(Leader.RIDGE);
  558. }
  559. String rt = root.getAttribute("ruleThickness");
  560. int thick = Integer.parseInt(rt);
  561. leader.setRuleThickness(thick);
  562. rt = root.getAttribute("width");
  563. if (rt != null && !"".equals(rt)) {
  564. thick = Integer.parseInt(rt);
  565. leader.setWidth(thick);
  566. }
  567. leader.setOffset(currentFontState.getCapHeight());
  568. addTraits(root, leader);
  569. return leader;
  570. }
  571. Word getWord(Element root) {
  572. String str = getString(root);
  573. Word word = new Word();
  574. word.setWord(str);
  575. addTraits(root, word);
  576. int width = 0;
  577. for (int count = 0; count < str.length(); count++) {
  578. width += currentFontState.width(str.charAt(count));
  579. }
  580. word.setWidth(width);
  581. word.setOffset(currentFontState.getCapHeight());
  582. return word;
  583. }
  584. public void addTraits(Element ele, Area area) {
  585. String str = ele.getAttribute("props");
  586. StringTokenizer st = new StringTokenizer(str, ";");
  587. while (st.hasMoreTokens()) {
  588. String tok = st.nextToken();
  589. int index = tok.indexOf(":");
  590. String id = tok.substring(0, index);
  591. Object traitCode = Trait.getTraitCode(id);
  592. if (traitCode != null) {
  593. area.addTrait(traitCode,
  594. Trait.makeTraitValue(traitCode,
  595. tok.substring(index + 1)));
  596. }
  597. else {
  598. System.err.println("Unknown trait: " + id );
  599. }
  600. }
  601. }
  602. public List getRanges(Element ele) {
  603. ArrayList list = new ArrayList();
  604. String str = ele.getAttribute("ranges");
  605. StringTokenizer st = new StringTokenizer(str, ";");
  606. while (st.hasMoreTokens()) {
  607. String tok = st.nextToken();
  608. }
  609. return list;
  610. }
  611. public String getString(Element ele) {
  612. String str = "";
  613. NodeList childs = ele.getChildNodes();
  614. if (childs.getLength() == 0) {
  615. return null;
  616. }
  617. for (int i = 0; i < childs.getLength(); i++) {
  618. Node obj = childs.item(i);
  619. str = str + obj.getNodeValue();
  620. }
  621. return str;
  622. }
  623. }