AlgorithmMenu.java 5.7 KB

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