Revision: 507
http://cishell.svn.sourceforge.net/cishell/?rev=507&view=rev
Author: mwlinnem
Date: 2007-08-30 14:26:38 -0700 (Thu, 30 Aug 2007)
Log Message:
-----------
Fixed error I made while refactoring, and fixed the missing edge bug.
Added Paths:
-----------
trunk/testing/org.cishell.testing.convertertester.core.new/src/org/cishell/testing/convertertester/core/converter/graph/ConverterGraph.java
Added: trunk/testing/org.cishell.testing.convertertester.core.new/src/org/cishell/testing/convertertester/core/converter/graph/ConverterGraph.java
===================================================================
--- trunk/testing/org.cishell.testing.convertertester.core.new/src/org/cishell/testing/convertertester/core/converter/graph/ConverterGraph.java (rev 0)
+++ trunk/testing/org.cishell.testing.convertertester.core.new/src/org/cishell/testing/convertertester/core/converter/graph/ConverterGraph.java 2007-08-30 21:26:38 UTC (rev 507)
@@ -0,0 +1,459 @@
+package org.cishell.testing.convertertester.core.converter.graph;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeSet;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.log.LogService;
+
+public class ConverterGraph {
+ private prefuse.data.Graph converterGraph;
+ private Map inDataToConverters;
+ private Map fileExtensionTestConverters;
+ private Map fileExtensionCompareConverters;
+ private Converter[] converters;
+ private BundleContext bContext;
+ private LogService log;
+ private static final String testOutData = "prefuse.data.Graph";
+
+ public ConverterGraph(ServiceReference[] converterRefs,
+ BundleContext bContext, LogService log) {
+ this.bContext = bContext;
+ this.log = log;
+
+ this.converters = createConverters(converterRefs);
+
+ inDataToConverters =
+ new HashMap();//<String, List<Convertere>>();
+ fileExtensionTestConverters =
+ new ConcurrentHashMap();//<String, List<ConverterPath>>();
+ fileExtensionCompareConverters =
+ new ConcurrentHashMap();//<String, ConverterPath>();
+
+ associateConverters(this.converters, this.inDataToConverters);
+ createConverterPaths(this.inDataToConverters, this.fileExtensionTestConverters, this.fileExtensionCompareConverters);
+
+ }
+
+ private Converter[] createConverters(ServiceReference[] convRefs) {
+ List converters = new ArrayList();
+
+ for (int ii = 0; ii < convRefs.length; ii++) {
+ converters.add(new Converter(this.bContext, convRefs[ii]));
+ }
+
+ return (Converter[]) converters.toArray(new Converter[0]);
+ }
+
+ private void associateConverters(Converter[] cs, Map hm){
+ for (int i = 0; i < cs.length; i++){
+ Converter c = cs[i];
+
+ String s = c.getInData();
+
+ if(hm.get(s) == null){
+ List l = new ArrayList();
+ l.add(c);
+ hm.put(s, l);
+ }
+ else{
+ ((List)hm.get(s)).add(c);
+ }
+ }
+ }
+
+ private void createConverterPaths(Map algorithms, Map testPaths,
+ Map comparePaths){
+ String[] keySet = new String[algorithms.keySet().size()];
+ keySet = (String[])algorithms.keySet().toArray(keySet);
+ for(int i = 0; i < keySet.length; i++){
+ String s = keySet[i];
+ if(s.startsWith("file-ext")){
+
+
+ ConverterPath test = new ConverterPath(this.bContext, this.log);
+
+ test.setInData(s);
+
+ createPaths((List)algorithms.get(s), test, s);
+
+ }
+ }
+
+ }
+
+ private ConverterPath createPaths(List algorithms, ConverterPath path, String dataType){
+ List cs = removeReferences(algorithms, path);
+
+ addCompareCycle(path);
+
+ if(path.getInData().equals(path.getOutData())){
+ addTestCycle(path);
+ return path;
+ }
+ while(!cs.isEmpty()){
+ ConverterPath p = new ConverterPath(path, this.bContext);
+ p.add((Converter) cs.get(0));
+ cs.remove(0);
+ createPaths((List)this.inDataToConverters.get(p.getOutData()), p, p.getOutData());
+
+ }
+ return null;
+ }
+
+ private void addTestCycle(ConverterPath cp){
+ String firstOutData, lastInData;
+ firstOutData = ((Converter) cp.getPath().get(0)).getOutData();
+ lastInData = ((Converter)cp.getPath().get(cp.getPath().size()-1)).getInData();
+ if(firstOutData.equals(lastInData)){
+ addTestPath(cp);
+ }
+ }
+
+ private void addCompareCycle(ConverterPath cp){
+ if(cp.getOutData() != null){
+ if(cp.getOutData().equals(ConverterGraph.testOutData)){
+ String key = cp.getInData() + " " + ((Converter) cp.getPath().get(0)).getOutData();
+ //System.out.println(key);
+ if(this.fileExtensionCompareConverters.get(key) == null){
+
+
+ this.fileExtensionCompareConverters.put(key, new ConverterPath(cp, this.bContext));
+ }
+ else {
+ ConverterPath tempPath = (ConverterPath)this.fileExtensionCompareConverters.get(key);
+ int pathSize = tempPath.getPath().size();
+ if(pathSize > cp.getPath().size()){
+
+ this.fileExtensionCompareConverters.put(key, new ConverterPath(cp, this.bContext));
+ }
+ }
+ }
+ }
+ }
+
+ private static List removeReferences(List al, ConverterPath cp){
+ List cs = new ArrayList(al);
+ cs.removeAll(cp.getPath());
+ List forbidden = new ArrayList();
+ for(int i = 0; i < cs.size(); i++){
+ Converter c = (Converter) cs.get(i);
+ String outData = c.getOutData();
+ if(outData.startsWith("file-ext") && (!outData.equals(cp.getInData()))){
+
+ forbidden.add(c);
+ }
+ }
+ cs.removeAll(forbidden);
+ return cs;
+ }
+
+ private void addTestPath(ConverterPath p){
+ String key = p.getInData();
+ key += " ";
+ key += ((Converter)p.getPath().get(0)).getOutData();
+ if(this.fileExtensionTestConverters.get(key) == null){
+
+ List paths = new ArrayList();
+ paths.add(p);
+ this.fileExtensionTestConverters.put(key, paths);
+
+ }
+ else{
+
+ ((List)this.fileExtensionTestConverters.get(key)).add(p);
+
+ }
+ }
+
+
+ public String printTestConverterPath(String s){
+ StringBuffer sb = new StringBuffer();
+ List al = (List)this.fileExtensionTestConverters.get(s);
+ for(int i = 0; i < al.size(); i++){
+ ConverterPath cp = (ConverterPath)al.get(i);
+ sb.append(cp.toString());
+ }
+ sb.trimToSize();
+ return sb.toString();
+ }
+
+ public String printTestConverterPaths(){
+ StringBuffer sb = new StringBuffer();
+ String[] keySet = new String[this.fileExtensionTestConverters.keySet().size()];
+ keySet = (String[])this.fileExtensionTestConverters.keySet().toArray(keySet);
+ for(int i = 0; i < keySet.length; i++){
+ String s = keySet[i];
+ sb.append(printTestConverterPath(s));
+ }
+ sb.trimToSize();
+ return sb.toString();
+ }
+
+
+ public String printComparisonConverterPath(String s){
+ return this.fileExtensionCompareConverters.get(s).toString();
+ }
+
+ public String printComparisonConverterPaths(){
+ StringBuffer sb = new StringBuffer();
+ String[] keySet = new String[this.fileExtensionCompareConverters.keySet().size()];
+ keySet = (String[])this.fileExtensionCompareConverters.keySet().toArray(keySet);
+ for(int i = 0; i < keySet.length; i++){
+ String s = keySet[i];
+ //System.out.println(s);
+ sb.append(printComparisonConverterPath(s));
+ }
+ sb.trimToSize();
+ return sb.toString();
+ }
+
+
+ public String toString(){
+ StringBuffer str = new StringBuffer();
+ String[] keySet = new String[this.inDataToConverters.keySet().size()];
+ keySet = (String[])this.inDataToConverters.keySet().toArray(keySet);
+ for(int i = 0; i < keySet.length; i++){
+ String s = keySet[i];
+ str.append(s + "\r\n");
+ List al = (List)this.inDataToConverters.get(s);
+ for(int j = 0; j < al.size(); j++){
+ Converter c = (Converter)al.get(j);
+ str.append("\t" + c.getUniqueName() + "\r\n");
+ }
+ }
+ str.append("Test Paths:\r\n");
+ str.append(printTestConverterPaths());
+ str.append("Comparison Paths:\r\n");
+ str.append(printComparisonConverterPaths());
+ str.trimToSize();
+ return str.toString();
+ }
+
+ public ConverterPath[] getTestPath(String s){
+ return (ConverterPath[])((List)this.fileExtensionTestConverters.get(s)).toArray(new ConverterPath[0]);
+ }
+
+ public ConverterPath[][] getTestPaths(){
+ ConverterPath[][] paths = new ConverterPath[this.fileExtensionTestConverters.keySet().size()][];
+ String[] fileExtensions = (String[])this.fileExtensionTestConverters.keySet().toArray(new String[0]);
+ for(int i = 0; i < fileExtensions.length; i++){
+ paths[i] = (getTestPath(fileExtensions[i]));
+ }
+ //this line may be busted
+ return paths;
+ }
+
+ public ConverterPath getComparePath(String s){
+ return (ConverterPath)this.fileExtensionCompareConverters.get(s);
+ }
+
+
+ public ConverterPath[] getComparePaths(){
+ String[] fileExtensions = (String[])this.fileExtensionCompareConverters.keySet().toArray(new String[0]);
+ List graphs = new ArrayList();
+ for(int i = 0; i < fileExtensions.length; i++){
+ graphs.add(getComparePath(fileExtensions[i]));
+ }
+ return (ConverterPath[])graphs.toArray(new ConverterPath[0]);
+ }
+
+ public Map getCompareMap(){
+ return this.fileExtensionCompareConverters;
+ }
+
+ public Map getTestMap(){
+ return this.fileExtensionTestConverters;
+ }
+
+ public Converter[] getAllConverters() {
+ return this.converters;
+ }
+
+ public File asNWB() {
+
+ Map nodes = assembleNodesSet();
+ TreeSet edges = assembleEdges(nodes);
+
+ File f = getTempFile();
+ try {
+ BufferedWriter writer =
+ new BufferedWriter(new FileWriter(f));
+
+ writeNodes(writer,nodes);
+ writeEdges(writer,edges);
+
+ } catch(IOException e) {
+ System.out.println("Blurt!");
+ this.log.log(LogService.LOG_ERROR,
+ "IOException while creating converter graph file",
+ e);
+ }
+
+ return f;
+ }
+
+ private void writeNodeHeader(BufferedWriter bw, int numNodes) throws IOException{
+ bw.flush();
+ bw.write("*Nodes " + numNodes + "\r\nid*int label*string\r\n");
+
+ }
+
+ private void writeNodes(BufferedWriter bw, Map nodes) throws IOException{
+ writeNodeHeader(bw, nodes.size());
+
+ String[] keySet = new String[nodes.keySet().size()];
+
+ keySet = (String[])nodes.keySet().toArray(keySet);
+ for(int i = 0; i < keySet.length; i++){
+ bw.write(nodes.get(keySet[i]) + " \"" + keySet[i]+"\"\r\n");
+ }
+
+ bw.flush();
+
+ }
+
+ private void writeEdgeHeader(BufferedWriter bw, int numEdges) throws IOException{
+ bw.flush();
+ bw.write("*DirectedEdges " + numEdges + "\r\nsource*int target*int\r\n");
+ }
+
+
+ private void writeEdges(BufferedWriter bw, TreeSet edges) throws IOException{
+ writeEdgeHeader(bw,edges.size());
+
+ String[] edgeArray = new String[edges.size()];
+ edgeArray = (String[])edges.toArray(edgeArray);
+
+ for(int i = 0; i < edgeArray.length; i++){
+ bw.write(edgeArray[i]+"\r\n");
+ }
+
+ bw.flush();
+ }
+
+ private Map assembleNodesSet(){
+
+ Map nodesToInt = new ConcurrentHashMap();
+
+ String[] inDatas = new String[this.inDataToConverters.keySet().size()];
+ inDatas = (String[])this.inDataToConverters.keySet().toArray(inDatas);
+
+ TreeSet nodeNameList = new TreeSet();
+
+ //for each unique in_data...
+ for(int i = 0; i < inDatas.length; i++){
+ String inData = inDatas[i];
+
+ //add the in_data string to our list of node names
+ nodeNameList.add(inData);
+
+ List convsList = (List)this.inDataToConverters.get(inData);
+ Converter[] convs = new Converter[convsList.size()];
+ convs = (Converter[])convsList.toArray(convs);
+
+ //for each converter associated with each in_data...
+ for(int j = 0; j < convs.length; j++){
+ Converter c = convs[j];
+ //add the name of the converter to our list of node names
+ nodeNameList.add(c.getShortName());
+ }
+ }
+
+ String[] names = new String[nodeNameList.size()];
+ names = (String[])nodeNameList.toArray(names);
+
+ //for each node name in our list of node names ...
+ for(int i = 0; i < names.length; i++){
+ //associate that name with a unique integer in our map
+ nodesToInt.put(names[i], new Integer(i+1));
+ }
+
+ //return our map of nodes to unique integers
+ return nodesToInt;
+ }
+
+ private TreeSet assembleEdges(Map nodeNameToInt){
+ TreeSet edges = new TreeSet();
+
+
+ String[] nodeNames = new String[nodeNameToInt.size()];
+ nodeNames = (String[])nodeNameToInt.keySet().toArray(nodeNames);
+ //for each node name in our list of node names...
+ for(int i = 0; i < nodeNames.length; i++){
+ String nodeName = nodeNames[i];
+
+ /*
+ * check to see if that node name is associated with a list of
+ * converters.
+ *
+ * (Node names are either the names of in_data formats or the
+ * names of converters)
+ */
+ List converterList = (List)this.inDataToConverters.get(nodeName);
+
+ //if our node name is associated with a list of converters...
+ if(converterList != null) {
+ //(then our node name must be the name of an in_data format)
+ Converter[] convs = new Converter[converterList.size()];
+ convs = (Converter[])converterList.toArray(convs);
+
+ //for each converter associated with this in_data format...
+ for(int j = 0; j < convs.length; j++){
+ Converter c = convs[j];
+ String convName = c.getShortName();
+ String convsOutputFormatName = c.getOutData();
+
+ String nodeNumber = nodeNameToInt.get(nodeName).toString();
+ String convNumber = nodeNameToInt.get(convName).toString();
+ String convsOutputNodeNumber =
+ nodeNameToInt.get(convsOutputFormatName).toString();
+
+ /*
+ * add an edge from our original node to this converter
+ */
+ String edge1 = nodeNumber + " " + convNumber;
+ edges.add(edge1);
+
+ /*
+ * add an edge from this converter to this converters
+ * output node.
+ */
+ String edge2 = convNumber + " " + convsOutputNodeNumber;
+ edges.add(edge2);
+ }
+ }
+
+ }
+
+ //return our set of edges
+ return edges;
+ }
+
+ private File getTempFile(){
+ File tempFile;
+
+ String tempPath = System.getProperty("java.io.tmpdir");
+ File tempDir = new File(tempPath+File.separator+"temp");
+ if(!tempDir.exists())
+ tempDir.mkdir();
+ try{
+ tempFile = File.createTempFile("NWB-Session-", ".nwb", tempDir);
+
+ }catch (IOException e){
+
+ tempFile = new File (tempPath+File.separator+"nwbTemp"+File.separator+"temp.nwb");
+
+ }
+ return tempFile;
+ }
+}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|