MyDaemonInstallationNodeContribution.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package uraxis.impl;
  2. import com.ur.urcap.api.contribution.DaemonContribution;
  3. import com.ur.urcap.api.contribution.InstallationNodeContribution;
  4. import com.ur.urcap.api.domain.data.DataModel;
  5. import com.ur.urcap.api.domain.script.ScriptWriter;
  6. import com.ur.urcap.api.ui.annotation.Input;
  7. import com.ur.urcap.api.ui.annotation.Label;
  8. import com.ur.urcap.api.ui.component.InputButton;
  9. import com.ur.urcap.api.ui.component.InputEvent;
  10. import com.ur.urcap.api.ui.component.InputTextField;
  11. import com.ur.urcap.api.ui.component.LabelComponent;
  12. import java.awt.EventQueue;
  13. import java.util.Timer;
  14. import java.util.TimerTask;
  15. public class MyDaemonInstallationNodeContribution implements InstallationNodeContribution {
  16. private static final String POPUPTITLE_KEY = "popuptitle";
  17. private static final String XMLRPC_VARIABLE = "my_daemon";
  18. private static final String ENABLED_KEY = "enabled";
  19. private static final String DEFAULT_VALUE = "HelloWorld";
  20. private DataModel model;
  21. private final MyDaemonDaemonService daemonService;
  22. // private XmlRpcMyDaemonInterface xmlRpcDaemonInterface;
  23. private MyDaemonInterface daemonInterface;
  24. private Timer uiTimer;
  25. public MyDaemonInstallationNodeContribution(MyDaemonDaemonService daemonService, DataModel model) {
  26. this.daemonService = daemonService;
  27. this.model = model;
  28. daemonInterface = new MyDaemonInterface("127.0.0.1", 40404);
  29. applyDesiredDaemonStatus();
  30. }
  31. @Input(id = POPUPTITLE_KEY)
  32. private InputTextField popupTitleField;
  33. @Input(id = "btnEnableDaemon")
  34. private InputButton enableDaemonButton;
  35. @Input(id = "btnDisableDaemon")
  36. private InputButton disableDaemonButton;
  37. @Label(id = "lblDaemonStatus")
  38. private LabelComponent daemonStatusLabel;
  39. @Input(id = POPUPTITLE_KEY)
  40. public void onMessageChange(InputEvent event) {
  41. if (event.getEventType() == InputEvent.EventType.ON_CHANGE) {
  42. setPopupTitle(popupTitleField.getText());
  43. }
  44. }
  45. @Input(id = "btnEnableDaemon")
  46. public void onStartClick(InputEvent event) {
  47. if (event.getEventType() == InputEvent.EventType.ON_CHANGE) {
  48. setDaemonEnabled(true);
  49. applyDesiredDaemonStatus();
  50. }
  51. }
  52. @Input(id = "btnDisableDaemon")
  53. public void onStopClick(InputEvent event) {
  54. if (event.getEventType() == InputEvent.EventType.ON_CHANGE) {
  55. setDaemonEnabled(false);
  56. applyDesiredDaemonStatus();
  57. }
  58. }
  59. @Override
  60. public void openView() {
  61. enableDaemonButton.setText("Start Daemon");
  62. disableDaemonButton.setText("Stop daemon");
  63. popupTitleField.setText(getPopupTitle());
  64. //UI updates from non-GUI threads must use EventQueue.invokeLater (or SwingUtilities.invokeLater)
  65. uiTimer = new Timer(true);
  66. uiTimer.schedule(new TimerTask() {
  67. @Override
  68. public void run() {
  69. EventQueue.invokeLater(new Runnable() {
  70. @Override
  71. public void run() {
  72. updateUI();
  73. }
  74. });
  75. }
  76. }, 0, 1000);
  77. }
  78. private void updateUI() {
  79. DaemonContribution.State state = getDaemonState();
  80. if (state == DaemonContribution.State.RUNNING) {
  81. enableDaemonButton.setEnabled(false);
  82. disableDaemonButton.setEnabled(true);
  83. } else {
  84. enableDaemonButton.setEnabled(true);
  85. disableDaemonButton.setEnabled(false);
  86. }
  87. String text = "";
  88. switch (state) {
  89. case RUNNING:
  90. text = "My Daemon runs";
  91. break;
  92. case STOPPED:
  93. text = "My Daemon stopped";
  94. break;
  95. case ERROR:
  96. text = "My Daemon failed";
  97. break;
  98. }
  99. daemonStatusLabel.setText(text);
  100. }
  101. @Override
  102. public void closeView() {
  103. if (uiTimer != null) {
  104. uiTimer.cancel();
  105. }
  106. }
  107. public boolean isDefined() {
  108. return !getPopupTitle().isEmpty() && getDaemonState() == DaemonContribution.State.RUNNING;
  109. }
  110. @Override
  111. public void generateScript(ScriptWriter writer) {
  112. writer.globalVariable(XMLRPC_VARIABLE, "rpc_factory(\"xmlrpc\", \"http://127.0.0.1:40404/RPC2\")");
  113. // Apply the settings to the daemon on program start in the Installation pre-amble
  114. writer.appendLine(XMLRPC_VARIABLE + ".set_title(\"" + getPopupTitle() + "\")");
  115. }
  116. public String getPopupTitle() {
  117. if (!model.isSet(POPUPTITLE_KEY)) {
  118. resetToDefaultValue();
  119. }
  120. return model.get(POPUPTITLE_KEY, DEFAULT_VALUE);
  121. }
  122. private void setPopupTitle(String title) {
  123. if ("".equals(title)) {
  124. resetToDefaultValue();
  125. } else {
  126. model.set(POPUPTITLE_KEY, title);
  127. // Apply the new setting to the daemon for real-time preview purposes
  128. // Note this might influence a running program, since the actual state is stored in the daemon.
  129. setDaemonTitle(title);
  130. }
  131. }
  132. private void resetToDefaultValue() {
  133. popupTitleField.setText(DEFAULT_VALUE);
  134. model.set(POPUPTITLE_KEY, DEFAULT_VALUE);
  135. setDaemonTitle(DEFAULT_VALUE);
  136. }
  137. private void setDaemonTitle(String title) {
  138. try {
  139. daemonInterface.setTitle(title);
  140. } catch(Exception e){
  141. System.err.println("Could not set the title in the daemon process.");
  142. }
  143. }
  144. private void applyDesiredDaemonStatus() {
  145. new Thread(new Runnable() {
  146. @Override
  147. public void run() {
  148. if (isDaemonEnabled()) {
  149. // Download the daemon settings to the daemon process on initial start for real-time preview purposes
  150. try {
  151. awaitDaemonRunning(5000);
  152. daemonInterface.setTitle(getPopupTitle());
  153. } catch (Exception e) {
  154. System.err.println("Could not set the title in the daemon process.");
  155. }
  156. } else {
  157. daemonService.getDaemon().stop();
  158. }
  159. }
  160. }).start();
  161. }
  162. private void awaitDaemonRunning(long timeOutMilliSeconds) throws InterruptedException {
  163. daemonService.getDaemon().start();
  164. long endTime = System.nanoTime() + timeOutMilliSeconds * 1000L * 1000L;
  165. while(System.nanoTime() < endTime && (daemonService.getDaemon().getState() != DaemonContribution.State.RUNNING || !daemonInterface.isReachable())) {
  166. Thread.sleep(100);
  167. }
  168. }
  169. private DaemonContribution.State getDaemonState(){
  170. return daemonService.getDaemon().getState();
  171. }
  172. private Boolean isDaemonEnabled() {
  173. return model.get(ENABLED_KEY, true); //This daemon is enabled by default
  174. }
  175. private void setDaemonEnabled(Boolean enable) {
  176. model.set(ENABLED_KEY, enable);
  177. }
  178. public String getXMLRPCVariable(){
  179. return XMLRPC_VARIABLE;
  180. }
  181. public MyDaemonInterface getDaemonInterface() {return daemonInterface; }
  182. }