/*
* Created on Sep 27, 2005
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package org.mindswap.swoop.utils.treeexport;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.net.URI;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Set;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;
import org.mindswap.swoop.SwoopModel;
import org.semanticweb.owl.model.OWLClass;
/**
* @author Dave Wang
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
// Takes in a JTree representing class hierarchy, and serializes it out
public class TreeSerializer
{
private static Hashtable myQNameTable = null;
private static Hashtable myURITable = null;
public static void export( JTree tree, String type, File file, SwoopModel swModel )
{
myQNameTable = new Hashtable();
myURITable = new Hashtable();
if ( type.equals( TM3FileFilter.TM3 ) )
exportToTM3( tree, file, swModel );
else if ( type.equals( STFileFilter.ST ) )
exportToST( tree, file, swModel );
}
/* serializes to treemap format (.tm3)
*/
public static void exportToTM3( JTree tree, File file, SwoopModel swModel )
{
if ( !file.getName().endsWith( TM3FileFilter.TM3 ))
{
System.out.println( "Filename is attached with " + TM3FileFilter.TM3 );
file = new File(file.getPath() + TM3FileFilter.TM3);
}
try
{
System.out.println("Exporting to file " + file.getAbsolutePath() + "...");
BufferedWriter writer = new BufferedWriter( new FileWriter( file ) );
TreeModel model = tree.getModel();
DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot();
Enumeration enum_ = root.breadthFirstEnumeration();
int counter = 0;
//System.out.println("ID");
writer.write("ID");
writer.newLine();
//System.out.println("INTEGER");
writer.write("INTEGER");
writer.newLine();
while ( enum_.hasMoreElements() )
{
//System.out.print( counter + "\t\t" );
writer.write( counter + "\t\t" );
DefaultMutableTreeNode node = (DefaultMutableTreeNode)enum_.nextElement();
TreeNode [] path = node.getPath();
for ( int i = 0; i < path.length; i ++)
{
DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode)path[i];
//System.out.print( getNodeLabel( currentNode, writer, swModel ) + "\t");
writer.write( getNodeLabel( currentNode, writer, swModel ) + "\t" );
}
//System.out.println();
writer.newLine();
counter++;
}
writer.flush();
writer.close();
System.out.println("exporting to " + file.getName() + "... done");
}
catch ( Exception e )
{ e.printStackTrace(); }
}
public static void exportToST( JTree tree, File file, SwoopModel swModel )
{
if ( !file.getName().endsWith( STFileFilter.ST ))
{
System.out.println( "Filename is attached with " + STFileFilter.ST);
file = new File(file.getPath() + STFileFilter.ST );
}
try
{
System.out.println("Exporting to file " + file.getAbsolutePath() + "...");
BufferedWriter writer = new BufferedWriter( new FileWriter( file ) );
TreeModel model = tree.getModel();
DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot();
writer.write("<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>");
writer.newLine();
printNodesInSP( root, writer, 0, swModel );
writer.flush();
writer.close();
System.out.println("exporting to " + file.getName() + "... done");
}
catch ( Exception e )
{ e.printStackTrace(); }
}
private static void printNodesInSP( DefaultMutableTreeNode node, BufferedWriter writer,
int indentLevel, SwoopModel swModel )
{
int counter = indentLevel;
String indentation = "";
while (counter != 0)
{
indentation = indentation + " ";
counter--;
}
try
{
writer.write( indentation + "<node>" + getNodeLabel( node, writer, swModel) );
Enumeration children = node.children();
if ( children.hasMoreElements() )
{
writer.newLine();
while ( children.hasMoreElements() )
{
DefaultMutableTreeNode child =(DefaultMutableTreeNode)children.nextElement();
printNodesInSP( child, writer, indentLevel + 1, swModel );
}
writer.write( indentation + "</node>");
}
else
writer.write("</node>");
writer.newLine();
}
catch ( Exception e )
{ e.printStackTrace(); }
}
private static String getNodeLabel( DefaultMutableTreeNode node, BufferedWriter writer, SwoopModel swModel)
{
Set set = (Set)node.getUserObject();
Iterator it = set.iterator();
String label = "";
if ( set.size() > 1 )
label = "[";
int count = 0;
try
{
while (it.hasNext())
{
OWLClass concept = (OWLClass)it.next();
URI conceptURI = concept.getURI();
String name = swModel.shortForm( conceptURI );
// have seen this name before, check to see if the URI is used
if ( myQNameTable.containsKey( name ))
{
// have seen this before, use its assigned name
if ( myURITable.containsKey( conceptURI ) )
name = (String)myURITable.get( conceptURI );
else
{
name = createNewName( name );
myURITable.put( conceptURI, name );
}
}
else // first time seeing this name, remember it
{
myQNameTable.put( name, name );
myURITable.put( conceptURI, name );
}
label = label + name;
if (it.hasNext())
label = label + ", ";
}
}
catch ( Exception e )
{ e.printStackTrace(); }
if ( set.size() > 1 )
label = label + "]";
return label;
}
private static String createNewName( String name )
{
String newName = "";
int i = 1;
while ( true )
{
newName = name + "[" + i + "]";
if ( !myQNameTable.containsKey( newName ) )
{
System.out.println("Created new name for " + newName);
break;
}
}
return newName;
}
}