blob: ecdc48680d4015e0301c15a5de62eeb6413108c7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002, 2003 Object Factory Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Object Factory Inc. - Initial implementation
*******************************************************************************/
package org.eclipse.ant.tests.ui.dtd;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import org.eclipse.ant.internal.ui.dtd.IDfm;
import org.eclipse.ant.internal.ui.dtd.IElement;
import org.eclipse.ant.internal.ui.dtd.IModel;
import org.eclipse.ant.internal.ui.dtd.ISchema;
import org.eclipse.ant.internal.ui.dtd.ParseError;
import org.eclipse.ant.internal.ui.dtd.Parser;
/**
* This class is intended to be used from the command line (hence the
* uncapitalized class name).
* @author Bob Foster
*/
public class dumper {
public static int main(String[] args) {
if (args.length <= 0) {
System.out.println("Usage: java DTDMerger URL");
return 0;
}
String document = args[0];
Parser parser = new Parser();
ISchema schema;
try {
schema = parser.parse(document);
} catch (ParseError e) {
System.out.println(e.getMessage());
e.printStackTrace();
return 1;
} catch (IOException e) {
e.printStackTrace();
return 1;
}
System.out.println("DTD successfully parsed");
dumpSchema(schema);
return 0;
}
/**
* Write schema contents to standard output.
*/
private static void dumpSchema(ISchema schema) {
IElement[] elements = schema.getElements();
System.out.println(""+elements.length+" elements defined");
for (int i = 0; i < elements.length; i++) {
IElement element = elements[i];
IModel model = element.getContentModel();
System.out.println("ELEMENT "+element.getName()
+'"'+model.stringRep()+'"');
dumpDfm(element.getDfm());
}
}
/**
* Dump dfm as a series of states.
* <pre>
* S0 a=>S1 b=>S2
* S1 c=>S2
* S2* d=>S2
* </pre>
* Where * indicates accepting state.
* @param dfm to dump
*/
private static void dumpDfm(IDfm dfm) {
HashMap map = new HashMap();
dumpDfm(dfm, map, 0);
LinkedList list = new LinkedList();
Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
list.add(new State((IDfm)entry.getKey(), (Integer)entry.getValue()));
}
State[] states = (State[]) list.toArray(new State[list.size()]);
Arrays.sort(states);
for (int i = 0; i < states.length; i++) {
print(states[i], map);
}
}
private static void print(State state, HashMap map) {
System.out.print(" S"+state.n.intValue()
+(state.dfm.isAccepting() ? "* " : " "));
String[] accepts = state.dfm.getAccepts();
for (int i = 0; i < accepts.length; i++) {
String accept = accepts[i];
IDfm next = state.dfm.advance(accept);
int n = ((Integer)map.get(next)).intValue();
System.out.print(" "+accept+"=>S"+n);
}
System.out.println();
}
private static int dumpDfm(IDfm dfm, HashMap map, int num) {
if (!map.containsKey(dfm)) {
map.put(dfm, new Integer(num++));
String[] accepts = dfm.getAccepts();
for (int i = 0; i < accepts.length; i++) {
IDfm next = dfm.advance(accepts[i]);
num = dumpDfm(next, map, num);
}
}
return num;
}
private static class State implements Comparable {
public IDfm dfm;
public Integer n;
public State(IDfm dfm, Integer n) {
this.dfm = dfm;
this.n = n;
}
/**
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
public int compareTo(Object o) {
State other = (State) o;
return n.intValue() < other.n.intValue()
? -1
: (n.intValue() == other.n.intValue()
? 0
: 1);
}
}
}