/** * <copyright> * * Copyright (c) 2002-2006 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM - Initial API and implementation * * </copyright> * * $Id: RoseWriter.java,v 1.4 2006/12/28 06:56:06 marcelop Exp $ */ package com.sap.emf.importer.moin.rose.parser; import java.io.BufferedWriter; import java.io.FileWriter; import java.util.List; /** * Creates a Rose file from Rose Tree. */ public class RoseWriter extends RoseComponent { public static final String PROGRESS = "ROSE_WRITE_PROGRESS"; protected BufferedWriter buffWriter; protected RoseNode versionTree; protected RoseNode modelTree; protected int justIndex; protected int lower = 0; protected int upper = 100; protected int oldValue; protected int progressIncrement = 10; public RoseWriter(String fileName, RoseNode versionTree, RoseNode modelTree) throws Exception { try { buffWriter = new BufferedWriter(new FileWriter(fileName)); } catch (Exception e) { throw e; } this.versionTree = versionTree; this.modelTree = modelTree; } public void setProgressIncrement(int progressIncrement) { this.progressIncrement = progressIncrement; } public void setLower(int lower) { this.lower = lower; oldValue = lower; } public int getLower() { return lower; } public void setUpper(int upper) { this.upper = upper; } public int getUpper() { return upper; } public void write() throws Exception { if (buffWriter == null) return; try { oldValue = lower; justIndex = 0; buffWriter.newLine(); writeObject(versionTree); buffWriter.newLine(); buffWriter.newLine(); if (modelTree.getRoseNodeType() == RoseNode.OBJECT) { writeObject(modelTree); } else { writeList(modelTree); } buffWriter.newLine(); buffWriter.close(); } catch (Exception e) { throw e; } } private void writeExpr(RoseNode tree) throws Exception { try { if (tree.getRoseNodeType() == RoseNode.STRING) { buffWriter.write('\t'); buffWriter.write(tree.getValue()); } else if (tree.getRoseNodeType() == RoseNode.STRING_SEQ) { List<RoseNode> nodes = tree.getNodes(); for (int i = 0; i < nodes.size(); i++) { RoseNode node = nodes.get(i); buffWriter.newLine(); buffWriter.write('|'); buffWriter.write(node.getValue()); } buffWriter.newLine(); } else if (tree.getRoseNodeType() == RoseNode.LIST) { buffWriter.write(' '); writeList(tree); } else if (tree.getRoseNodeType() == RoseNode.OBJECT) { buffWriter.write(' '); writeObject(tree); } else if (tree.getRoseNodeType() == RoseNode.VALUE) { buffWriter.write('\t'); writeValue(tree); } } catch (Exception e) { throw e; } } private void writeList(RoseNode tree) throws Exception { try { String key = tree.getKey(); if (!key.equals("collection")) { justIndex++; buffWriter.write("(list "); buffWriter.write(tree.getValue()); } List<RoseNode> nodes = tree.getNodes(); for (int j = 0; j < nodes.size(); j++) { RoseNode node = nodes.get(j); buffWriter.newLine(); for (int i = 0; i < justIndex; i++) { buffWriter.write('\t'); } if (node.getRoseNodeType() == RoseNode.OBJECT) { writeObject(node); } else if (node.getRoseNodeType() == RoseNode.STRING) { buffWriter.write(node.getValue()); } else { System.out.println("!!!!! error in writeLists !!!!! " + node.getRoseNodeType()); System.exit(0); } } if (!key.equals("collection")) { buffWriter.write(')'); justIndex--; } } catch (Exception e) { throw e; } } public void writeObject(RoseNode tree) throws Exception { try { justIndex++; buffWriter.write("(object "); buffWriter.write(tree.getValue()); List<RoseNode> nodes = tree.getNodes(); for (int i = 0; i < nodes.size(); i++) { RoseNode node = nodes.get(i); writePair(node); } buffWriter.write(')'); justIndex--; } catch (Exception e) { // System.out.println("RoseWriter - exception: "+ e.toString()); throw e; } } public void writeValue(RoseNode tree) throws Exception { try { justIndex++; buffWriter.write("(value "); buffWriter.write(tree.getValue()); List<RoseNode>nodes = tree.getNodes(); for (int i = 0; i < nodes.size(); i++) { RoseNode node = nodes.get(i); writeExpr(node); } buffWriter.write(')'); justIndex--; } catch (Exception e) { // System.out.println("RoseWriter - exception: "+ e.toString()); throw e; } } public void writePair(RoseNode node) throws Exception { try { buffWriter.newLine(); for (int i = 0; i < justIndex; i++) { buffWriter.write('\t'); } buffWriter.write(node.getKey()); writeExpr(node); } catch (Exception e) { // System.out.println("RoseWriter - exception: "+ e.toString()); throw e; } } }