#region License
/*
Copyright (c) 1999 Gennadii Donchyts
All rights reserved
This library is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this library; If not, see .
*/
#endregion
using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Serialization;
using System.IO;
using QuickGraph;
using QuickGraph.Algorithms;
namespace jar2ikvmc
{
class Program
{
static void Main(string[] args)
{
if (!CheckUsage(args))
{
return;
}
string sourceXmlFileName = GenerateDependencyXml(args[0]);
string ikvmsScriptFileName = args[1];
string dotFileName = ikvmsScriptFileName + ".dot";
XmlSerializer serializer = new XmlSerializer(typeof(JarAnalyzer));
StreamReader srcReader = new StreamReader(sourceXmlFileName);
JarAnalyzer jarAnalyzerResults = (JarAnalyzer)serializer.Deserialize(srcReader);
srcReader.Close();
BidirectionalGraph> g = GenerateJarDependencyGraph(jarAnalyzerResults);
GenerateIkvmcRunScript(g, ikvmsScriptFileName);
GenerateDotFile(g, dotFileName);
File.Delete(sourceXmlFileName); // cleanup temporary xml file generated by JarAnalyzer
}
private static string GenerateDependencyXml(string inputFolderPath)
{
string dependencyFilePath = Path.GetTempFileName();
com.kirkk.analyzer.textui.XMLUISummary analyzer = new com.kirkk.analyzer.textui.XMLUISummary();
java.io.File inputFolder = new java.io.File(inputFolderPath);
java.io.File outputFile = new java.io.File(dependencyFilePath);
analyzer.createSummary(inputFolder, outputFile);
return dependencyFilePath;
}
private static BidirectionalGraph> GenerateJarDependencyGraph(JarAnalyzer jars)
{
BidirectionalGraph> g = new BidirectionalGraph>(true);
foreach(Jar jar in jars.Jars)
{
g.AddVertex(jar.name);
}
foreach (Jar jar in jars.Jars)
{
if (jar.Summary.OutgoingDependencies.Jar != null)
{
foreach (Jar dstJar in jar.Summary.OutgoingDependencies.Jar)
{
bool exist = false;
foreach (IEdge edge in g.InEdges(dstJar.Text[0]))
{
if (edge.Source == jar.name)
{
exist = true;
}
}
if (!g.InEdges(dstJar.Text[0]).Any(v => v.Source == jar.name))
{
g.AddEdge(new Edge(dstJar.Text[0], jar.name));
}
else
{
Trace.WriteLine("Warning: loop detected, skipping dependency " + dstJar.Text[0] + " -> " + jar.name);
}
}
}
}
return g;
}
///
/// Generate file containing command lines to run ikvmc including names of referenced dlls.
///
///
///
private static void GenerateIkvmcRunScript(BidirectionalGraph> g, string path)
{
StreamWriter sw = new StreamWriter(path);
foreach (string vertex in AlgoUtility.TopologicalSort>(g))
{
IEnumerable names = g.InEdges(vertex).Select, string>(item => item.Source);
string references = "";
foreach(string name in names)
{
references += " -r:" + name.Replace(".jar", ".dll");
}
string commandLine = "ikvmc " + vertex + " -target:library" + references;
sw.WriteLine(commandLine);
}
sw.Close();
}
private static void GenerateDotFile(BidirectionalGraph> g, string path)
{
StreamWriter sw = new StreamWriter(path);
sw.WriteLine("digraph G {");
foreach (Edge e in g.Edges)
{
sw.WriteLine("\"" + e.Target + "\" -> \"" + e.Source + "\";");
}
sw.WriteLine("}");
sw.Close();
}
private static bool CheckUsage(string[] args)
{
if (args.Length != 2)
{
Console.WriteLine("Error: number of arguments should be 2");
PrintUsage();
return false;
}
if (!Directory.Exists(args[0]))
{
Console.WriteLine("Error: input directory \"" + args[0] + "\" does not exist");
PrintUsage();
return false;
}
return true;
}
private static void PrintUsage()
{
Console.WriteLine("Usage: jar2ikvmc