AlgorithmMenu.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package ui.view;
  2. import java.awt.event.ActionEvent;
  3. import java.awt.event.ActionListener;
  4. import java.io.BufferedReader;
  5. import java.io.File;
  6. import java.io.FileReader;
  7. import java.net.URL;
  8. import java.net.URLClassLoader;
  9. import java.util.HashMap;
  10. import javax.swing.JFileChooser;
  11. import javax.swing.JFrame;
  12. import javax.swing.JMenu;
  13. import javax.swing.JMenuItem;
  14. import javax.tools.JavaCompiler;
  15. import javax.tools.ToolProvider;
  16. import ui.controller.Control;
  17. import ui.model.Model;
  18. /**
  19. * This Class represents the Menu, where you can select the Algorithms.
  20. *
  21. * @author Gruppe14
  22. */
  23. public class AlgorithmMenu extends JMenu {
  24. private static final long serialVersionUID = 1L;
  25. JMenuItem algoFolderButton = new JMenuItem("Select Algorithm Folder");
  26. private JMenu mnSelectAlgorithm = new JMenu("Select Algorithm");
  27. private HashMap<String, File> algosHash = new HashMap<>();
  28. private JMenuItem noneItem= new JMenuItem("none");
  29. // root Directory
  30. File root = null;
  31. Model model;
  32. Control controller;
  33. /**
  34. * Constructor.
  35. *
  36. * @param mod
  37. * the Model
  38. * @param cont
  39. * the Controller
  40. */
  41. public AlgorithmMenu(Model mod, Control cont) {
  42. super();
  43. // Init Stuff
  44. this.model = mod;
  45. this.controller = cont;
  46. this.setText("Algorithm");
  47. // algoFolderButton Action
  48. algoFolderButton.addActionListener(new ActionListener() {
  49. @Override
  50. public void actionPerformed(java.awt.event.ActionEvent evt) {
  51. menuSetFolderActionPerformed(evt);
  52. }
  53. private void menuSetFolderActionPerformed(java.awt.event.ActionEvent evt) {
  54. JFileChooser fileChooser = new JFileChooser();
  55. JFrame test = new JFrame();
  56. fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
  57. fileChooser.setAcceptAllFileFilterUsed(false);
  58. if (fileChooser.showOpenDialog(test) == JFileChooser.APPROVE_OPTION) {
  59. //empty everything and reset the selected algorithm
  60. controller.setAlgorithm(null);
  61. mnSelectAlgorithm.removeAll();
  62. mnSelectAlgorithm.add(noneItem);
  63. noneItem.doClick();
  64. File[] files = fileChooser.getSelectedFile().listFiles();
  65. // Set Root Folder Path
  66. root = new File(fileChooser.getCurrentDirectory().getPath());
  67. for (int i = 0; i < files.length; i++) {
  68. if (files[i].toString()
  69. .endsWith(".java") /*
  70. * || files[i].toString().
  71. * endsWith(".class")
  72. */) {
  73. String name = files[i].getName();
  74. int tmpB = name.lastIndexOf('.');
  75. name = name.substring(0, tmpB);
  76. algosHash.put(name, files[i]);
  77. JMenuItem tempItem = new JMenuItem(name);
  78. tempItem.addActionListener(new ActionListener() {
  79. @Override
  80. public void actionPerformed(ActionEvent e) {
  81. setAlgorithm(algosHash.get(tempItem.getText()), tempItem.getText());
  82. }
  83. });
  84. mnSelectAlgorithm.add(tempItem);
  85. }
  86. }
  87. }
  88. }
  89. });
  90. // Add to Panel
  91. this.add(algoFolderButton);
  92. this.add(mnSelectAlgorithm);
  93. mnSelectAlgorithm.add(noneItem);
  94. noneItem.addActionListener(new ActionListener() {
  95. @Override
  96. public void actionPerformed(ActionEvent e) {
  97. controller.setAlgorithm(null);
  98. }
  99. });
  100. }
  101. public void setAlgorithm(File file, String name) {
  102. try {
  103. BufferedReader br = new BufferedReader(new FileReader(file.getPath()));
  104. String line = br.readLine();
  105. // Package Name
  106. String packageName = "";
  107. while (line != null) {
  108. line = line.trim();
  109. if (!line.isEmpty()) {
  110. if (line.length() >= 7 && line.substring(0, 7).equals("package")) {
  111. packageName = line.substring(8, line.length() - 1);
  112. }
  113. }
  114. if (packageName.isEmpty()) {
  115. line = br.readLine();
  116. } else {
  117. line = null;
  118. }
  119. }
  120. // Compile source file.
  121. JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
  122. compiler.run(null, null, null, file.getPath());
  123. // Load and instantiate compiled class.
  124. URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
  125. Class<?> cls;
  126. if (packageName.isEmpty()) {
  127. cls = Class.forName(name, true, classLoader);
  128. } else {
  129. cls = Class.forName(packageName + "." + name, true, classLoader);
  130. }
  131. Object t = cls.newInstance();
  132. controller.setAlgorithm(t);
  133. } catch (Exception e) {
  134. controller.addTextToConsole(e.toString());
  135. }
  136. }
  137. }