<html>
<head>
<style>
body {
  font-family: Verdana, sans-serif;
  font-size: 0.8em;
  color:#484848;
}
h1, h2, h3 { font-family: "Trebuchet MS", Verdana, sans-serif; margin: 0px; }
h1 { font-size: 1.2em; }
h2, h3 { font-size: 1.1em; }
a, a:link, a:visited { color: #2A5685;}
a:hover, a:active { color: #c61a1a; }
a.wiki-anchor { display: none; }
hr {
  width: 100%;
  height: 1px;
  background: #ccc;
  border: 0;
}
.footer {
  font-size: 0.8em;
  font-style: italic;
}
</style>
</head>
<body>
<span class="header"></span>
Issue #70 has been updated by Pablo Ojanguren.

<ul>
  <li><strong>File</strong> <a href="http://redmine.ourproject.org/attachments/download/14/jmx-in-action-1.png">jmx-in-action-1.png</a> added</li>
</ul>

<p>Implemented initial version following these steps:</p>


        <p>1) Create MBean interface for class to manage</p>


        <p>KunePropertiesDefaultMBean</p>


<pre>

package cc.kune.core.server.properties;

/**
 * MBean interface for JMX management of server properties
 *
 */
public interface KunePropertiesDefaultMBean {

    String reload();
    String getProperty(String key);
    void setProperty(String key, String value);

}

</pre>

        <p>2) Implement mbean interface new methods</p>


        <p>KunePropertiesDefault</p>


<pre>
diff --git a/src/main/java/cc/kune/core/server/properties/KunePropertiesDefault.java b/src/main/java/cc/kune/core/server/properties/KunePropertiesDefault.java
index aa8639f..ed79f6d 100644
--- a/src/main/java/cc/kune/core/server/properties/KunePropertiesDefault.java
+++ b/src/main/java/cc/kune/core/server/properties/KunePropertiesDefault.java
@@ -1,6 +1,6 @@
 /*
  *
- * Copyright (C) 2007-2012 The kune development team (see CREDITS for details)
+ * Copyright (C) 2007-2013 The kune development team (see CREDITS for details)
  * This file is part of kune.
  *
  * This program is free software: you can redistribute it and/or modify
@@ -35,7 +35,7 @@
 import com.google.inject.Singleton;

 @Singleton
-public class KunePropertiesDefault implements KuneProperties {
+public class KunePropertiesDefault implements KuneProperties, KunePropertiesDefaultMBean {
   public static final Log LOG = LogFactory.getLog(KunePropertiesDefault.class);
   private CompositeConfiguration config;
   private final String fileName;
@@ -124,4 +124,33 @@
     }
   }

+  @Override
+  public String reload() {
+     
+      String resultInfoStr = "OK";
+      
+      try {
+          
+          loadConfiguration();
+          
+      } catch (final ServerException e) {
+          
+          resultInfoStr = e.getMessage();
+      }
+     
+      return resultInfoStr;
+  }
+
+  @Override
+  public String getProperty(String key) {
+      
+      return this.get(key);
+  }
+
+  @Override
+  public void setProperty(String key, String value) {
+      
+      this.setProperty(key, value);
+  }
+
 }
</pre>

        <p>3) Add mbean activation just after KuneProperties object is created</p>


        <p>DataSourceKunePersistModule</p>


<pre>
diff --git a/src/main/java/cc/kune/core/server/persist/DataSourceKunePersistModule.java b/src/main/java/cc/kune/core/server/persist/DataSourceKunePersistModule.java
index 5b097bf..2ae371b 100644
--- a/src/main/java/cc/kune/core/server/persist/DataSourceKunePersistModule.java
+++ b/src/main/java/cc/kune/core/server/persist/DataSourceKunePersistModule.java
@@ -21,8 +21,15 @@

 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.management.ManagementFactory;
 import java.util.Properties;

+import javax.management.InstanceAlreadyExistsException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectName;
 import javax.persistence.EntityManager;

 import org.apache.commons.configuration.SystemConfiguration;
@@ -220,6 +227,33 @@
     final SystemConfiguration sysConf = new SystemConfiguration();
     kuneConfig = settedProperties != null ? settedProperties : sysConf.getString("kune.server.config");
     kuneProperties = new KunePropertiesDefault(kuneConfig);
+    
+    /* #70 Reload Configuration Properties via JMX */
+    MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); 
+    ObjectName mbeanName = null;
+    try {
+    
+        mbeanName = new ObjectName("cc.kune.mbeans:type=KuneProperties");
+    
+    } catch (MalformedObjectNameException e) {
+        e.printStackTrace();        
+    } catch (NullPointerException e) {        
+        e.printStackTrace();
+    } 
+    
+    try {
+    
+        mbeanServer.registerMBean(kuneProperties, mbeanName);
+    
+    } catch (InstanceAlreadyExistsException e) {
+        e.printStackTrace();
+    } catch (MBeanRegistrationException e) {
+        e.printStackTrace();
+    } catch (NotCompliantMBeanException e) {
+        e.printStackTrace();
+    }
+    
+    
     log4Conf = sysConf.getString("log4j.configuration");
   }
 </pre>

        <p>4) Tested successfully using jconsole through local jetty-java process (see attached picture)</p>


        <p><strong>Next steps</strong></p>


        <ul>
        <li>Remote access to JMX Mbeans hasn't been tested. Maybe jetty additional configuration is needed. (in progress)</li>
        </ul>


        <ul>
        <li>Regression test. Unknown  collateral effects when some properties are changed (e.g. db connection?)</li>
        </ul>


        <ul>
        <li>To change a property doesn't imply to system be aware of it. If some object has already read the property (e.g. on its constructor) won't get new value anyway. Maybe JMX event feature should be enabled for these classes.</li>
        </ul>


        <ul>
        <li>It only affects to server side of RPC server. How are changes populated to GWT client?</li>
        </ul>
<hr />
<h1><a href="http://redmine.ourproject.org/issues/70#change-742">Enhancement #70: Implement some kind of &quot;/etc/init.d/kune reload&quot; to reload configuration</a></h1>

<ul>
<li>Author: Vicente J. Ruiz Jurado</li>
<li>Status: New</li>
<li>Priority: Normal</li>
<li>Assignee: Pablo Ojanguren</li>
<li>Category: Server side</li>
<li>Target version: </li>
  <li>Resolution: </li>
  <li>Tags: </li>
</ul>

<p>Related<br /><a class="external" href="http://ykyuen.wordpress.com/2010/07/26/jetty-stop-a-jetty-server-by-command/">http://ykyuen.wordpress.com/2010/07/26/jetty-stop-a-jetty-server-by-command/</a><br /><a class="external" href="http://wiki.eclipse.org/Jetty/Howto/Secure_Termination">http://wiki.eclipse.org/Jetty/Howto/Secure_Termination</a><br /><a class="external" href="http://irc.codehaus.org/display/JETTY/How+to+gracefully+shutdown">http://irc.codehaus.org/display/JETTY/How+to+gracefully+shutdown</a><br /><a class="external" href="http://ptrthomas.wordpress.com/2009/01/24/how-to-start-and-stop-jetty-revisited/">http://ptrthomas.wordpress.com/2009/01/24/how-to-start-and-stop-jetty-revisited/</a><br /><a class="external" href="http://eureka.ykyuen.info/2010/07/26/jetty-stop-a-jetty-server-by-command/">http://eureka.ykyuen.info/2010/07/26/jetty-stop-a-jetty-server-by-command/</a></p>


<hr />
<span class="footer"><p>You have received this notification because you have either subscribed to it, or are involved in it.<br />To change your notification preferences, please click here: <a class="external" href="http://redmine.ourproject.org/my/account">http://redmine.ourproject.org/my/account</a></p></span>
</body>
</html>