AlgorithmMenu.java 4.7 KB

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