initial commit

This commit is contained in:
schrom01
2022-11-01 11:14:37 +01:00
commit 1a8e8151a0
22 changed files with 1349 additions and 0 deletions
+76
View File
@@ -0,0 +1,76 @@
package ch.zhaw.ads;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.fail;
/**
* @(#)TreeTest.java
*
*
* @author K Rege
* @version 1.00 2018/3/17
* @version 1.01 2021/8/1
*/
public class ADS7_3_test {
RouteServer routeServer;
Graph<DijkstraNode, Edge> graph;
String fileToTest = "RouteServer.java";
@BeforeEach
void init() throws Exception {
String swiss = "Winterthur Zürich 25\n" +
"Zürich Bern 126\n" +
"Zürich Genf 277\n" +
"Zürich Luzern 54\n" +
"Zürich Chur 121\n" +
"Zürich Berikon 16\n" +
"Bern Genf 155\n" +
"Genf Lugano 363\n" +
"Lugano Luzern 206\n" +
"Lugano Chur 152\n" +
"Chur Luzern 146\n" +
"Luzern Bern 97\n" +
"Bern Berikon 102\n" +
"Luzern Berikon 41\n";
routeServer = new RouteServer();
graph = routeServer.createGraph(swiss);
}
private void testDest(DijkstraNode start, String destName, double dist) {
for (Edge road: start.getEdges()) {
DijkstraNode destTown = (DijkstraNode) road.getDest();
if (destName.equals(destTown.getName())) {
assertEquals(dist, road.getWeight(), 1E-10, start.getName() + " to " + destName);
return;
}
}
fail(destName + " not connected to " + start.getName());
}
@Test
public void testCreateGrasphEdges() {
DijkstraNode town = graph.findNode("Luzern");
assertNotNull(town, "Luzern");
testDest(town, "Bern", 97);
testDest(town, "Berikon", 41);
testDest(town, "Chur", 146);
testDest(town, "Lugano", 206);
testDest(town, "Zürich", 54);
testDest(town, "Berikon", 41);
}
@Test
public void testCreateGrasphNodes() {
DijkstraNode town = graph.findNode("Luzern");
assertNotNull(town, "Luzern");
town = graph.findNode("Winterthur");
assertNotNull(town, "Winterthur");
town = graph.findNode("Paris");
assertNull(town, "Paris");
}
}
+73
View File
@@ -0,0 +1,73 @@
package ch.zhaw.ads;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
/**
* @(#)TreeTest.java
*
*
* @author K Rege
* @version 1.00 2018/3/17
* @version 1.01 2021/8/1
*/
public class ADS7_4_test {
RouteServer routeServer;
Graph<DijkstraNode, Edge> graph;
String fileToTest = "RouteServer.java";
@BeforeEach
private void init() throws Exception {
String swiss = "Winterthur Zürich 25\n" +
"Zürich Bern 126\n" +
"Zürich Genf 277\n" +
"Zürich Luzern 54\n" +
"Zürich Chur 121\n" +
"Zürich Berikon 16\n" +
"Bern Genf 155\n" +
"Genf Lugano 363\n" +
"Lugano Luzern 206\n" +
"Lugano Chur 152\n" +
"Chur Luzern 146\n" +
"Luzern Bern 97\n" +
"Bern Berikon 102\n" +
"Luzern Berikon 41\n";
routeServer = new RouteServer();
graph = routeServer.createGraph(swiss);
}
private void testDest(List<DijkstraNode> route, String startName, String destName, double dist) {
for (DijkstraNode town : route) {
if (destName.equals(town.getName())) {
assertEquals(dist, town.getDist(), 1E-10, startName + " to " + destName);
return;
}
}
fail(startName + " not connected to " + destName);
}
@Test
public void testWinterthurLugano() {
routeServer.dijkstraRoute(graph, "Winterthur", "Lugano");
List<DijkstraNode> route = routeServer.getRoute(graph, "Lugano");
testDest(route, "Winterthur", "Winterthur", 0);
testDest(route, "Winterthur", "Zürich", 25);
testDest(route, "Winterthur", "Luzern", 79);
testDest(route, "Winterthur", "Lugano", 285);
}
@Test
public void testLuganoWinterthur() {
routeServer.dijkstraRoute(graph, "Lugano", "Winterthur");
List<DijkstraNode> route = routeServer.getRoute(graph, "Winterthur");
testDest(route, "Lugano", "Winterthur", 285);
testDest(route, "Lugano", "Zürich", 260);
testDest(route, "Lugano", "Luzern", 206);
testDest(route, "Lugano", "Lugano", 0);
}
}
+53
View File
@@ -0,0 +1,53 @@
package ch.zhaw.ads;
import java.util.LinkedList;
import java.util.List;
public class AdjListGraph<N extends Node, E extends Edge>
implements Graph<N, E> {
private final List<N> nodes = new LinkedList<>();
private final Class<N> nodeClazz;
private final Class<E> edgeClazz;
public AdjListGraph(Class<N> nodeClazz, Class<E> edgeClazz) {
this.nodeClazz = nodeClazz;
this.edgeClazz = edgeClazz;
}
/** füge Knoten hinzu, gebe alten zurück falls Knoten schon existiert */
public N addNode(String name) throws Throwable {
N node = findNode(name);
if (node == null) {
node = nodeClazz.getConstructor().newInstance();
node.setName(name);
nodes.add(node);
}
return node;
}
/** füge gerichtete Kante hinzu */
public void addEdge(String source, String dest, double weight) throws Throwable {
N src = addNode(source);
N dst = addNode(dest);
E edge = edgeClazz.getConstructor().newInstance();
edge.setDest(dst);
edge.setWeight(weight);
src.addEdge(edge);
}
/** finde den Knoten anhand seines Namens */
public N findNode(String name) {
for (N node : nodes) {
if (node.getName().equals(name)) {
return node;
}
}
return null;
}
/** Iterator über alle Knoten */
public Iterable<N> getNodes() {
return nodes;
}
}
+15
View File
@@ -0,0 +1,15 @@
package ch.zhaw.ads;
/**
* AnyServer -- Praktikum Experimentierkasten -- ADS
*
* @author E. Mumprecht
* @version 1.0 -- Geruest fuer irgendeinen Server
*/
public class AnyServer implements CommandExecutor {
//----- Dies implementiert das CommandExecutor Interface.
@Override
public String execute(String command) {
return "Die Eingabe ist \"" + command + "\"\n";
}
}
+20
View File
@@ -0,0 +1,20 @@
package ch.zhaw.ads;
/**
* CommandExecutor -- Praktikum Experimentierkasten -- SW3 Dieses Interface muss
* von jedem Server implementiert werden.
*
* @author E. Mumprecht
* @version 1.0 -- Geruest fuer irgendeinen Server
* @version 1.1 -- K. Rege Fehlerueckgabe hinzugefuegt
*/
public interface CommandExecutor {
/**
* execute -- nimmt eine Kommandozeile, tut irgendetwas gescheites, und
* berichtet das Resultat.
*
* @param command Kommandozeile
* @return Resultat, ueblicherweise eine oder mehrere Zeilen.
*/
String execute(String command) throws Exception;
}
+41
View File
@@ -0,0 +1,41 @@
package ch.zhaw.ads;
class DijkstraNode extends Node implements Comparable<DijkstraNode> {
boolean mark;
DijkstraNode prev;
double dist;
public DijkstraNode() { }
public double getDist (){
return dist;
}
public void setDist(double dist) {
this.dist = dist;
}
public void setMark(boolean m) {
mark = m;
}
public boolean getMark() {
return mark;
}
public void setPrev(DijkstraNode p) {
prev = p;
}
public DijkstraNode getPrev() {
return prev;
}
public String toString() {
return getName() + " "+getDist();
}
public int compareTo(DijkstraNode n) {
return (int)(dist - n.dist);
}
}
+19
View File
@@ -0,0 +1,19 @@
package ch.zhaw.ads;
public class Edge {
protected Node dest; // Zielknoten der Kante
protected double weight; // Kantengewicht
public Edge() {}
public Edge(Node dest, double weight) {
this.dest = dest;
this.weight = weight;
}
public void setDest(Node node) { this.dest = node; }
public Node getDest() { return dest; }
public void setWeight(double w) { this.weight = w; }
double getWeight() { return weight; }
}
+13
View File
@@ -0,0 +1,13 @@
package ch.zhaw.ads;
/**
* @author K. Rege
* @version 1.0 -- Experimentierkasten
*/
public class ExBox {
public static void main(String[] args) {
ExBoxFrame f = new ExBoxFrame();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
+294
View File
@@ -0,0 +1,294 @@
package ch.zhaw.ads;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.net.URISyntaxException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Set;
/**
* @(#)ExBoxFrame.java
*
* JFC ExBox application
*
* @author K.Rege
* @version 1.00 2014/2/3
* @version 1.01 2016/8/2
* @version 2.00 2017/8/30 Test
* @version 2.01 2018/2/5 AutoscaleFaktor
* @version 2.02 2018/3/12 Reconnect (inspired by S. Kunz)
* @version 2.03 2021/7/24 Test (repeat)
* @version 2.04 2021/9/11 Test as plugin
*/
public class ExBoxFrame extends JFrame implements ActionListener, ItemListener {
private final int UHDTHRESHOLD = 1920;
private final String STANDARDENCODING = "ISO-8859-1";
private JMenuItem connect, exit, open, test, retest, textView, graphicView, clear;
private JMenu menuServer;
private JButton enter;
private JTextField arguments;
private JComboBox<String> history;
private JTextArea output;
private JScrollPane scrollPane;
private CommandExecutor command;
private CommandExecutor unitTest;
private boolean graphicOn;
private GraphicPanel graphic;
private String lastServer;
private String lastTestFile;
public void setFontSize(int size) {
Set<Object> keySet = UIManager.getLookAndFeelDefaults().keySet();
for (Object key : keySet) {
if (key != null && key.toString().toLowerCase().contains("font")) {
Font font = UIManager.getDefaults().getFont(key);
if (font != null) {
font = font.deriveFont((float) size);
UIManager.put(key, font);
}
}
}
}
private void initMenu() {
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu menuFile = new JMenu("File");
menuBar.add(menuFile);
open = new JMenuItem("Open...");
open.addActionListener(this);
menuFile.add(open);
exit = new JMenuItem();
exit.setText("Exit");
exit.addActionListener(this);
menuFile.add(exit);
menuServer = new JMenu("Server");
menuBar.add(menuServer);
connect = new JMenuItem("Connect ...");
connect.addActionListener(this);
menuServer.add(connect);
JMenu menuView = new JMenu("View");
menuBar.add(menuView);
clear = new JMenuItem("Clear");
clear.addActionListener(this);
menuView.add(clear);
textView = new JMenuItem("Text");
textView.addActionListener(this);
menuView.add(textView);
graphicView = new JMenuItem("Graphic");
graphicView.addActionListener(this);
menuView.add(graphicView);
}
private void initJUnit() {
try {
unitTest = ServerFactory.createServer(getPathCompiled().resolve("ExBoxJUnit.class").toString());
test = new JMenuItem("Test ...");
test.addActionListener(this);
menuServer.add(test);
retest = new JMenuItem("Test");
retest.addActionListener(this);
menuServer.add(retest);
} catch (Exception e) {
warning("Test Plugin not found\n");
}
}
private void initComponents() {
setLayout(new BorderLayout());
output = new JTextArea();
scrollPane = new JScrollPane(output);
add(BorderLayout.CENTER, scrollPane);
JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
arguments = new JTextField();
arguments.addActionListener(this);
panel.add(BorderLayout.CENTER, arguments);
enter = new JButton("enter");
enter.addActionListener(this);
panel.add(BorderLayout.EAST, enter);
history = new JComboBox<>();
history.addItemListener(this);
panel.add(BorderLayout.SOUTH, history);
add(BorderLayout.SOUTH, panel);
}
/**
* get default path for file open dialog
*/
private Path getPathCompiled() {
try {
Path path = Paths.get(getClass().getProtectionDomain().getCodeSource().getLocation().toURI());
for (String part : getClass().getPackage().getName().split("\\.")) {
path = path.resolve(part);
}
return path;
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
/**
* The constructor
*/
public ExBoxFrame() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
ex.printStackTrace();
}
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
double scaleFaktor = (screenSize.getWidth() <= UHDTHRESHOLD) ? 1 : 2;
setFontSize((int) (11 * scaleFaktor));
setSize(
new Dimension((int) (400 * scaleFaktor), (int) (400 * scaleFaktor)));
setTitle("ExBox");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initComponents();
initMenu();
initJUnit();
}
private void warning(String s) {
System.err.println("\nWARNING: " + s + "\n");
}
private void error(String s) {
output.append("\nERROR: " + s + "\n");
}
private void execute(String args) throws Exception {
if (lastServer != null) {
command = ServerFactory.createServer(lastServer);
}
if (!arguments.getText().equals(history.getItemAt(0))
&& !arguments.getText().equals(history.getSelectedItem())) {
history.insertItemAt(arguments.getText(), 0);
}
if (command == null) {
error("no Server connected");
} else {
String res = command.execute(args);
if (graphicOn) {
graphic.setFigure(res);
} else {
output.append(res);
}
}
}
private void setGraphicView() {
if (!graphicOn) {
remove(scrollPane);
graphic = new GraphicPanel();
output.removeNotify();
add(BorderLayout.CENTER, graphic);
graphicOn = true;
validate();
repaint();
}
}
private void setTextView() {
if (graphicOn) {
remove(graphic);
add(BorderLayout.CENTER, scrollPane);
graphicOn = false;
validate();
repaint();
}
}
private String openFileDialog(Path startDirectory, String pattern) {
FileDialog fd = new FileDialog(this, "Open");
if (pattern != null) fd.setFile(pattern);
if (startDirectory != null) fd.setDirectory(startDirectory.toString());
fd.setVisible(true);
return fd.getDirectory() + fd.getFile();
}
private void testCommand(boolean retest) throws Exception {
if (!retest) {
lastTestFile = openFileDialog(getPathCompiled(), "*test.class");
}
if (lastTestFile == null) {
output.append("ERROR no Test spezified\n");
} else if (unitTest != null) {
output.append(unitTest.execute(lastTestFile));
}
}
private void connectCommand() throws Exception {
String name = openFileDialog(getPathCompiled(), "*Server.class");
command = ServerFactory.createServer(name);
lastServer = name;
String fullClassName = command.getClass().getName();
String simpleClassName = fullClassName.substring(
fullClassName.lastIndexOf('.') + 1);
setTitle("ExBox connected to " + simpleClassName);
}
private void openFile() throws Exception {
String name = openFileDialog(null, null);
BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream(name), STANDARDENCODING));
StringBuilder b = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
b.append(line);
b.append('\n');
}
execute(b.toString());
}
public void itemStateChanged(ItemEvent e) {
try {
arguments.setText((String) e.getItem());
execute(arguments.getText());
} catch (Throwable ex) {
error(ex.toString());
}
}
public void actionPerformed(ActionEvent e) {
try {
if ((e.getSource() == arguments) || (e.getSource() == enter)) {
execute(arguments.getText());
} else if (e.getSource() == connect) {
connectCommand();
} else if (e.getSource() == test) {
testCommand(false);
} else if (e.getSource() == retest) {
testCommand(true);
} else if (e.getSource() == open) {
openFile();
} else if (e.getSource() == textView) {
setTextView();
} else if (e.getSource() == graphicView) {
setGraphicView();
} else if (e.getSource() == clear) {
output.setText("");
} else if (e.getSource() == exit) {
System.exit(0);
}
} catch (Throwable ex) {
ex.printStackTrace();
error(ex.toString());
}
}
}
+92
View File
@@ -0,0 +1,92 @@
package ch.zhaw.ads;
import org.junit.platform.engine.TestDescriptor;
import org.junit.platform.engine.TestExecutionResult;
import org.junit.platform.engine.discovery.DiscoverySelectors;
import org.junit.platform.launcher.Launcher;
import org.junit.platform.launcher.LauncherDiscoveryRequest;
import org.junit.platform.launcher.TestExecutionListener;
import org.junit.platform.launcher.TestIdentifier;
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
import org.junit.platform.launcher.core.LauncherFactory;
import java.io.*;
import java.util.LinkedList;
import java.util.List;
public class ExBoxJUnit implements CommandExecutor {
@Override
public String execute(String testFile) throws Exception {
final List<String> successfulTests = new LinkedList<>();
final List<TestFailure> failedResults = new LinkedList<>();
StringBuilder output = new StringBuilder();
output.append("\nRUN TESTS ").append(new File(testFile).getName().split("\\.")[0]).append("\n");
LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
.selectors(DiscoverySelectors.selectClass(ServerFactory.loadClass(testFile)))
.build();
Launcher launcher = LauncherFactory.create();
launcher.discover(request);
launcher.registerTestExecutionListeners(new TestExecutionListener() {
@Override
public void executionFinished(TestIdentifier testIdentifier, TestExecutionResult testExecutionResult) {
if (testIdentifier.getType() != TestDescriptor.Type.TEST) {
return;
}
if (testExecutionResult.getStatus() == TestExecutionResult.Status.SUCCESSFUL) {
successfulTests.add(testIdentifier.getDisplayName());
} else {
failedResults.add(new TestFailure(testIdentifier.getDisplayName(),
testExecutionResult.getThrowable().orElse(null)));
}
}
});
launcher.execute(request);
for (String testName : successfulTests) {
output.append(testName).append(": OK\n");
}
for (TestFailure result : failedResults) {
output.append(result.getName()).append(": ERROR\n");
String error = result.errorString();
if (!error.isEmpty()) {
output.append(error).append("\n");
}
}
boolean wasSuccessful = failedResults.isEmpty();
output.append("TESTS ").append(wasSuccessful ? "PASSED" : "FAILED").append(": ")
.append(wasSuccessful ? "OK \u263a" : failedResults.size() + " ERRORS").append("\n");
return output.toString();
}
private static class TestFailure {
private final String name;
private final Throwable throwable;
TestFailure(String name, Throwable throwable) {
this.name = name;
this.throwable = throwable;
}
public String getName() {
return name;
}
public String errorString() {
if (throwable == null) {
return "";
}
try (StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter)) {
throwable.printStackTrace(printWriter);
return stringWriter.toString();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}
}
+15
View File
@@ -0,0 +1,15 @@
package ch.zhaw.ads;
public interface Graph<N, E> {
/** füge Knoten hinzu, tue nichts, falls Knoten schon existiert */
N addNode (String name) throws Throwable;
/** finde den Knoten anhand seines Namens */
N findNode(String name);
/** Iterator über alle Knoten des Graphen */
Iterable<N> getNodes();
/** füge gerichtete und gewichtete Kante hinzu */
void addEdge(String source, String dest, double weight) throws Throwable ;
}
+84
View File
@@ -0,0 +1,84 @@
package ch.zhaw.ads;
import javax.swing.*;
import java.awt.*;
import java.util.StringTokenizer;
public class GraphicPanel extends JPanel {
String figure;
public void setFigure(String figure) {
this.figure = figure;
paint(getGraphics());
}
private void drawRect(Graphics g, double x, double y, double width, double height, String style) {
int w = getWidth();
int h = getHeight();
int ix0 = (int) (w * x);
int iy0 = (int) (h * y);
int ix1 = (int) (w * (x + width));
int iy1 = (int) (h * (y + height));
if (style.equals("draw")) {
g.drawRect(ix0, h - iy1, ix1 - ix0, iy1 - iy0);
} else {
g.fillRect(ix0, h - iy1, ix1 - ix0, iy1 - iy0);
}
}
private void drawFigure(Graphics g) {
if (figure != null) {
int w = getWidth();
int h = getHeight();
g.setColor(Color.black);
StringTokenizer tok = new StringTokenizer(figure, " <>=/,\"\n");
while (tok.hasMoreTokens()) {
String fig = tok.nextToken();
if (fig.equals("line")) {
tok.nextToken();
double x1 = Double.parseDouble(tok.nextToken());
tok.nextToken();
double y1 = Double.parseDouble(tok.nextToken());
tok.nextToken();
double x2 = Double.parseDouble(tok.nextToken());
tok.nextToken();
double y2 = Double.parseDouble(tok.nextToken());
g.drawLine((int) (x1 * w), h - (int) (y1 * h),
(int) (x2 * w), h - (int) (y2 * h));
} else if (fig.equals("rect")) {
tok.nextToken();
double x = Double.parseDouble(tok.nextToken());
tok.nextToken();
double y = Double.parseDouble(tok.nextToken());
tok.nextToken();
double width = Double.parseDouble(tok.nextToken());
tok.nextToken();
double height = Double.parseDouble(tok.nextToken());
tok.nextToken();
String style = tok.nextToken();
drawRect(g, x, y, width, height, style);
} else if (fig.equals("color")) {
tok.nextToken();
int red = Integer.parseInt(tok.nextToken());
tok.nextToken();
int green = Integer.parseInt(tok.nextToken());
tok.nextToken();
int blue = Integer.parseInt(tok.nextToken());
g.setColor(new Color(red, green, blue));
}
}
}
}
private void clear(Graphics g) {
int w = getWidth();
int h = getHeight();
g.setColor(new Color(240, 240, 240));
g.fillRect(0, 0, w, h);
}
public void paint(Graphics g) {
clear(g);
drawFigure(g);
}
}
+34
View File
@@ -0,0 +1,34 @@
package ch.zhaw.ads;
import java.util.LinkedList;
import java.util.List;
public class Node {
protected String name; // Name
protected List<Edge> edges; // Kanten
public Node() {
edges = new LinkedList<>();
}
public Node(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Iterable<Edge> getEdges() {
return edges;
}
public void addEdge(Edge edge) {
edges.add(edge);
}
}
+66
View File
@@ -0,0 +1,66 @@
package ch.zhaw.ads;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;
public class RouteServer implements CommandExecutor {
/**
build the graph given a text file with the topology
*/
public Graph<DijkstraNode> createGraph(String topo) throws Exception {
// TODO implement
}
/**
apply the dijkstra algorithm
*/
public void dijkstraRoute(Graph<DijkstraNode> graph, String from, String to) {
// TODO implement
}
/**
find the route in the graph after applied dijkstra
the route should be returned with the start town first
*/
public List<DijkstraNode> getRoute(Graph<DijkstraNode, Edge> graph, String to) {
List<DijkstraNode> route = new LinkedList<>();
DijkstraNode town = graph.findNode(to);
do {
route.add(0, town);
town = town.getPrev();
} while (town != null);
return route;
}
public String execute(String topo) throws Exception {
Graph<DijkstraNode, Edge> graph = createGraph(topo);
dijkstraRoute(graph, "Winterthur", "Lugano");
List<DijkstraNode> route = getRoute(graph, "Lugano");
// generate result string
StringBuilder builder = new StringBuilder();
for (DijkstraNode rt : route) builder.append(rt).append("\n");
return builder.toString();
}
public static void main(String[] args)throws Exception {
String swiss = "Winterthur Zürich 25\n" +
"Zürich Bern 126\n" +
"Zürich Genf 277\n" +
"Zürich Luzern 54\n" +
"Zürich Chur 121\n" +
"Zürich Berikon 16\n" +
"Bern Genf 155\n" +
"Genf Lugano 363\n" +
"Lugano Luzern 206\n" +
"Lugano Chur 152\n" +
"Chur Luzern 146\n" +
"Luzern Bern 97\n" +
"Bern Berikon 102\n" +
"Luzern Berikon 41\n";
RouteServer server = new RouteServer();
System.out.println(server.execute(swiss));
}
}
+76
View File
@@ -0,0 +1,76 @@
package ch.zhaw.ads;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* Classloader that handles file path of class
*/
class MyClassLoader extends ClassLoader {
private String path;
MyClassLoader(ClassLoader parent) {
super(parent);
}
/**
* @param name filename of class
* return content of file as array of bytes; if file does not exist return null
*/
private byte[] getBytes(String name) {
try {
System.out.println(name);
RandomAccessFile file = new RandomAccessFile(name, "r");
byte[] data = new byte[(int) file.length()];
file.readFully(data);
file.close();
return data;
} catch (IOException e) {
}
return null;
}
/**
* @param name filename of class
*/
public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
System.out.println("load:" + name + " " + resolve);
Class<?> clazz;
byte[] classData = getBytes(name);
if (classData != null) {
clazz = defineClass(null, classData, 0, classData.length);
path = name.substring(0,
name.length() - clazz.getName().length() - ".class".length());
return clazz;
}
if (!resolve) {
classData = getBytes(
path + name.replace(".", File.separator) + ".class");
if (classData != null) {
return defineClass(null, classData, 0, classData.length);
}
}
return findSystemClass(name);
}
}
/**
* ServerFactory -- Praktikum Experimentierkasten --
*
* @author K. Rege
* @version 1.0 -- Factory zur Erstellung von Server Objekten
* @version 2.0 -- Dynamisches Nachladen
* @version 2.01 -- Fix deprecated Functions
*/
public class ServerFactory {
public static Class<?> loadClass(String name) throws Exception {
MyClassLoader myClassLoader = new MyClassLoader(
MyClassLoader.class.getClassLoader());
return myClassLoader.loadClass(name, true);
}
public static CommandExecutor createServer(String name) throws Exception {
return (CommandExecutor) loadClass(name).getConstructor(new Class[]{}).newInstance();
}
}
+14
View File
@@ -0,0 +1,14 @@
Winterthur Zürich 25
Zürich Bern 126
Zürich Genf 277
Zürich Luzern 54
Zürich Chur 121
Zürich Berikon 16
Bern Genf 155
Genf Lugano 363
Lugano Luzern 206
Lugano Chur 152
Chur Luzern 146
Luzern Bern 97
Bern Berikon 102
Luzern Berikon 41