You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by io...@apache.org on 2011/01/05 18:05:00 UTC
svn commit: r1055528 - in /karaf/trunk/shell/dev/src/main:
java/org/apache/karaf/shell/dev/Watch.java
java/org/apache/karaf/shell/dev/watch/BundleWatcher.java
resources/OSGI-INF/blueprint/shell-dev.xml
Author: iocanel
Date: Wed Jan 5 17:04:59 2011
New Revision: 1055528
URL: http://svn.apache.org/viewvc?rev=1055528&view=rev
Log:
[KARAF-317] Bundle resolution occurs in each interval, to affect new bundles too. Code cleanup with the use of blueprint. In each interval the a new configuration object is created.
Modified:
karaf/trunk/shell/dev/src/main/java/org/apache/karaf/shell/dev/Watch.java
karaf/trunk/shell/dev/src/main/java/org/apache/karaf/shell/dev/watch/BundleWatcher.java
karaf/trunk/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml
Modified: karaf/trunk/shell/dev/src/main/java/org/apache/karaf/shell/dev/Watch.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/dev/src/main/java/org/apache/karaf/shell/dev/Watch.java?rev=1055528&r1=1055527&r2=1055528&view=diff
==============================================================================
--- karaf/trunk/shell/dev/src/main/java/org/apache/karaf/shell/dev/Watch.java (original)
+++ karaf/trunk/shell/dev/src/main/java/org/apache/karaf/shell/dev/Watch.java Wed Jan 5 17:04:59 2011
@@ -24,7 +24,6 @@ import org.apache.karaf.shell.dev.watch.
import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
-import java.util.ArrayList;
import java.util.List;
@Command(scope = "dev", name = "watch", description = "Watch and Update bundles")
@@ -36,6 +35,9 @@ public class Watch extends OsgiCommandSu
@Option(name = "-i", aliases = {}, description = "Watch interval", required = false, multiValued = false)
private long interval;
+ @Option(name = "--start", description = "Starts watching the selcted bundles", required = false, multiValued = false)
+ protected boolean start;
+
@Option(name = "--stop", description = "Stops watching all bundles", required = false, multiValued = false)
protected boolean stop;
@@ -45,94 +47,53 @@ public class Watch extends OsgiCommandSu
@Option(name = "--list", description = "Displays the watch list", required = false, multiValued = false)
protected boolean list;
+ private BundleWatcher watcher;
@Override
protected Object doExecute() throws Exception {
- //Set the interval if exists.
- if (interval > 0) {
- BundleWatcher.getInstance().setInterval(interval);
- }
-
- if (stop || list) {
- doExecute(null);
+ if (urls == null && (interval == 0 && !stop && !start && !list)) {
+ System.out.println("No option specified. Bundle id/url is required.");
return null;
- } else if (urls != null && urls.trim().length() > 0) {
+ }
- List<Bundle> bundleList = new ArrayList<Bundle>();
- //Check if an id is passed instead of URLs
- try {
- Long id = Long.parseLong(urls);
- Bundle bundle = getBundleContext().getBundle(id);
- if (bundle != null) {
- bundleList.add(bundle);
- }
- } catch (NumberFormatException e) {
+ if (interval > 0) { //Set the interval if exists.
+ watcher.setInterval(interval);
+ }
- for (int i = 0; i < getBundleContext().getBundles().length; i++) {
- Bundle bundle = getBundleContext().getBundles()[i];
- if (wildCardMatch(bundle.getLocation(), urls)) {
- bundleList.add(bundle);
+ if (list) { //List the watched bundles.
+ String format = "%-40s %6s %-80s";
+ System.out.println(String.format(format, "URL", "ID", "Bundle Name"));
+ for (String url : watcher.getWatchURLs()) {
+
+ List<Bundle> bundleList = watcher.getBundlesByURL(url);
+ if (bundleList != null && bundleList.size() > 0) {
+ for (Bundle bundle : bundleList) {
+ System.out.println(String.format(format, url, bundle.getBundleId(), (String) bundle.getHeaders().get(Constants.BUNDLE_NAME)));
}
+ } else {
+ System.out.println(String.format(format, url, "", ""));
}
}
- if (bundleList.size() > 0) {
- doExecute(bundleList);
- }
- return null;
- } else {
- return null;
- }
- }
-
- /**
- * Exectues watch/stop watching the passed bundles.
- *
- * @param bundleList
- */
- public void doExecute(List<Bundle> bundleList) {
- BundleWatcher watcher = BundleWatcher.getInstance();
- if (stop) {
+ } else if (start) {
+ watcher.start();
+ } else if (stop) {
watcher.stop();
- } else if (list) {
- List<Bundle> watchList = watcher.getWatchList();
- if (watchList != null && watchList.size() > 0) {
- String format = "%6s %-40s";
- System.out.println(String.format(format, "ID", "Name"));
- for (Bundle bundle : watcher.getWatchList()) {
- System.out.println(String.format(format, bundle.getBundleId(), (String) bundle.getHeaders().get(Constants.BUNDLE_NAME)));
- }
- } else System.out.println("No bundle is being watched.");
+ } else if (remove) {
+ watcher.remove(urls);
} else {
- if (remove) {
- watcher.remove(bundleList);
- } else {
- watcher.add(bundleList);
- }
+ watcher.start();
+ watcher.add(urls);
}
- }
+ return null;
+ }
- /**
- * Matches text using a pattern containing wildchards.
- *
- * @param text
- * @param pattern
- * @return
- */
- public static boolean wildCardMatch(String text, String pattern) {
- String[] cards = pattern.split("\\*");
- // Iterate over the cards.
- for (String card : cards) {
- int idx = text.indexOf(card);
- // Card not detected in the text.
- if (idx == -1) {
- return false;
- }
+ public BundleWatcher getWatcher() {
+ return watcher;
+ }
- // Move ahead, towards the right of the text.
- text = text.substring(idx + card.length());
- }
- return true;
+ public void setWatcher(BundleWatcher watcher) {
+ this.watcher = watcher;
}
}
Modified: karaf/trunk/shell/dev/src/main/java/org/apache/karaf/shell/dev/watch/BundleWatcher.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/dev/src/main/java/org/apache/karaf/shell/dev/watch/BundleWatcher.java?rev=1055528&r1=1055527&r2=1055528&view=diff
==============================================================================
--- karaf/trunk/shell/dev/src/main/java/org/apache/karaf/shell/dev/watch/BundleWatcher.java (original)
+++ karaf/trunk/shell/dev/src/main/java/org/apache/karaf/shell/dev/watch/BundleWatcher.java Wed Jan 5 17:04:59 2011
@@ -19,6 +19,7 @@ package org.apache.karaf.shell.dev.watch
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.ops4j.pax.url.maven.commons.MavenConfiguration;
import org.ops4j.pax.url.maven.commons.MavenConfigurationImpl;
import org.ops4j.pax.url.maven.commons.MavenRepositoryURL;
import org.ops4j.pax.url.mvn.ServiceConstants;
@@ -28,15 +29,17 @@ import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.BundleReference;
-import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Constants;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.cm.ManagedService;
import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
-import java.net.URL;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.HashMap;
@@ -50,54 +53,45 @@ public class BundleWatcher implements Ru
private static Log logger = LogFactory.getLog(BundleWatcher.class);
- private static BundleWatcher instance = null;
-
private ConfigurationAdmin configurationAdmin;
- private Boolean running = true;
+ private Boolean running = false;
private Long interval = 10000L;
+ private List<String> watchURLs = new ArrayList<String>();
private Map<Bundle, Long> lastModificationTimes = new HashMap<Bundle, Long>();
- /**
- * Construcotr
- */
- private BundleWatcher() {
- Thread thread = new Thread(this);
- thread.start();
- }
/**
- * Returns the singleton instance.
- *
- * @return
+ * Construcotr
*/
- public static synchronized BundleWatcher getInstance() {
- if (instance == null)
- instance = new BundleWatcher();
- return instance;
+ public BundleWatcher() {
}
public void run() {
if (logger.isDebugEnabled()) {
logger.debug("Bundle watcher thread started");
}
- running = true;
while (running) {
- for (Bundle bundle : lastModificationTimes.keySet()) {
- try {
- Long lastModifiedTime = getBundleLastModifiedTime(bundle);
- Long oldLastModifiedTime = lastModificationTimes.get(bundle);
- if (!lastModifiedTime.equals(oldLastModifiedTime)) {
- URL bundleLocation = new URL(bundle.getLocation());
- InputStream is = bundleLocation.openStream();
- bundle.update(is);
- is.close();
- lastModificationTimes.put(bundle, lastModifiedTime);
+ for (String bundleURL : watchURLs) {
+ for (Bundle bundle : getBundlesByURL(bundleURL)) {
+ try {
+ Long lastModifiedTime = getBundleLastModifiedTime(bundle);
+ Long oldLastModifiedTime = lastModificationTimes.get(bundle);
+ if (!lastModifiedTime.equals(oldLastModifiedTime)) {
+ String externalLocation = getBundleExternalLocation(bundle);
+ if (externalLocation != null) {
+ File f = new File(externalLocation);
+ InputStream is = new FileInputStream(f);
+ bundle.update(is);
+ is.close();
+ lastModificationTimes.put(bundle, lastModifiedTime);
+ }
+ }
+ } catch (IOException ex) {
+ logger.error("Error watching bundle.", ex);
+ } catch (BundleException ex) {
+ logger.error("Error updating bundle.", ex);
}
- } catch (IOException ex) {
- logger.error("Error watching bundle.", ex);
- } catch (BundleException ex) {
- logger.error("Error updating bundle.", ex);
}
}
try {
@@ -112,99 +106,175 @@ public class BundleWatcher implements Ru
}
}
-
/**
- * Adds a Bundle to the watch list.
- *
- * @param bundleList
+ * Adds a Bundle URLs to the watch list.
+ * @param urls
*/
- public void add(List<Bundle> bundleList) {
- for (Bundle bundle : bundleList) {
+ public void add(String urls) {
+ watchURLs.add(urls);
+ for (Bundle bundle : getBundlesByURL(urls)) {
lastModificationTimes.put(bundle, getBundleLastModifiedTime(bundle));
}
}
/**
- * Removes a bundle from the watch list.
- *
- * @param bundleList
+ * Removes a bundle URLs from the watch list.
+ * @param urls
*/
- public void remove(List<Bundle> bundleList) {
- for (Bundle bundle : bundleList) {
+ public void remove(String urls) {
+ watchURLs.remove(urls);
+ for (Bundle bundle : getBundlesByURL(urls)) {
lastModificationTimes.remove(bundle);
}
}
/**
* Returns the last modification time of the bundle artifact as Long.
- *
* @param bundle
* @return
*/
private Long getBundleLastModifiedTime(Bundle bundle) {
- BundleContext bundleContext = null;
- ServiceReference ref = null;
+ Long lastModificationTime = 0L;
+ String bundleExternalLocation = getBundleExternalLocation(bundle);
+ if (bundleExternalLocation != null) {
+ File bundleFile = new File(bundleExternalLocation);
+ lastModificationTime = bundleFile.lastModified();
+ }
+ return lastModificationTime;
+ }
+ /**
+ * Returns the location of the Bundle inside the local maven repository.
+ * @param bundle
+ * @return
+ */
+ public String getBundleExternalLocation(Bundle bundle) {
+ Parser p = null;
+ String bundleExternalLocation = null;
String localRepository = null;
- Long lastModificationTime = 0L;
+
+ //Attempt to retrieve local repository location from MavenConfiguration
+ MavenConfiguration configuration = retrieveMavenConfiguration();
+ if (configuration != null) {
+ MavenRepositoryURL localRepositoryURL = configuration.getLocalRepository();
+ if (localRepositoryURL != null) {
+ localRepository = localRepositoryURL.getFile().getAbsolutePath();
+ }
+ }
+
+ //If local repository not found assume default.
+ if (localRepository == null) {
+ localRepository = System.getProperty("user.home") + File.separator + ".m2" + File.separator + "repository";
+ }
try {
- bundleContext = ((BundleReference) getClass().getClassLoader()).getBundle().getBundleContext();
- //Get a reference to the configuration admin.
- ref = bundleContext.getServiceReference(ConfigurationAdmin.class.getName());
- configurationAdmin = (ConfigurationAdmin) bundleContext.getService(ref);
+ p = new Parser(bundle.getLocation().substring(4));
+ bundleExternalLocation = localRepository + File.separator + p.getArtifactPath();
+ } catch (MalformedURLException e) {
+ logger.error("Could not parse artifact path for bundle" + bundle.getSymbolicName(), e);
+ }
+ return bundleExternalLocation;
+ }
+
+ public MavenConfiguration retrieveMavenConfiguration() {
+ MavenConfiguration mavenConfiguration=null;
+
+ try {
Configuration configuration = configurationAdmin.getConfiguration(ServiceConstants.PID);
+ if(configuration != null){
+ Dictionary dictonary = configuration.getProperties();
+ if(dictonary != null) {
+ DictionaryPropertyResolver resolver = new DictionaryPropertyResolver(dictonary);
+ mavenConfiguration = new MavenConfigurationImpl(resolver,ServiceConstants.PID);
+ }
+ }
- //Attempt to retrieve local repository location from MavenConfiguration
- if (configuration != null) {
- Dictionary dictionary = configuration.getProperties();
- MavenConfigurationImpl config = new MavenConfigurationImpl(new DictionaryPropertyResolver(dictionary), ServiceConstants.PID);
-
- MavenRepositoryURL localRepositoryURL = config.getLocalRepository();
- if (localRepositoryURL != null) {
- localRepository = localRepositoryURL.getFile().getAbsolutePath();
+ } catch (IOException e) {
+ logger.error("Error retrieving maven configuration",e);
+ }
+ return mavenConfiguration;
+ }
+
+ /**
+ * Returns the bundles that match
+ * @param url
+ * @return
+ */
+ public List<Bundle> getBundlesByURL(String url) {
+ BundleContext bundleContext = ((BundleReference) getClass().getClassLoader()).getBundle().getBundleContext();
+ List<Bundle> bundleList = new ArrayList<Bundle>();
+ try {
+ Long id = Long.parseLong(url);
+ Bundle bundle = bundleContext.getBundle(id);
+ if (bundle != null) {
+ bundleList.add(bundle);
+ }
+ } catch (NumberFormatException e) {
+
+ for (int i = 0; i < bundleContext.getBundles().length; i++) {
+ Bundle bundle = bundleContext.getBundles()[i];
+ if (wildCardMatch(bundle.getLocation(), url)) {
+ bundleList.add(bundle);
}
}
+ }
+ return bundleList;
+ }
- //If local repository not found assume default.
- if (localRepository == null) {
- localRepository = System.getProperty("user.home") + File.separator + ".m2" + File.separator + "repository";
+ /**
+ * Matches text using a pattern containing wildchards.
+ *
+ * @param text
+ * @param pattern
+ * @return
+ */
+ protected boolean wildCardMatch(String text, String pattern) {
+ String[] cards = pattern.split("\\*");
+ // Iterate over the cards.
+ for (String card : cards) {
+ int idx = text.indexOf(card);
+ // Card not detected in the text.
+ if (idx == -1) {
+ return false;
}
- Parser p = new Parser(bundle.getLocation().substring(4));
- p.getArtifactPath();
+ // Move ahead, towards the right of the text.
+ text = text.substring(idx + card.length());
+ }
+ return true;
+ }
- String bundlePath = localRepository + File.separator + p.getArtifactPath();
- File bundleFile = new File(bundlePath);
- lastModificationTime = bundleFile.lastModified();
- } catch (MalformedURLException e) {
- logger.warn("ConfigAdmin service is unavailable.");
- } catch (IOException e) {
- logger.warn("ConfigAdmin service is unavailable.");
- } finally {
- bundleContext.ungetService(ref);
+ public void start() {
+ if (!running) {
+ Thread thread = new Thread(this);
+ setRunning(true);
+ thread.start();
}
- return lastModificationTime;
}
-
/**
* Stops the execution of the thread and releases the singleton instance
*/
public void stop() {
setRunning(false);
- this.instance = null;
}
- /**
- * Returns the list of bundles that are being watched.
- *
- * @return
- */
- public List<Bundle> getWatchList() {
- return new ArrayList(lastModificationTimes.keySet());
+ public ConfigurationAdmin getConfigurationAdmin() {
+ return configurationAdmin;
+ }
+
+ public void setConfigurationAdmin(ConfigurationAdmin configurationAdmin) {
+ this.configurationAdmin = configurationAdmin;
+ }
+
+ public List<String> getWatchURLs() {
+ return watchURLs;
+ }
+
+ public void setWatchURLs(List<String> watchURLs) {
+ this.watchURLs = watchURLs;
}
public Long getInterval() {
Modified: karaf/trunk/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml?rev=1055528&r1=1055527&r2=1055528&view=diff
==============================================================================
--- karaf/trunk/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml (original)
+++ karaf/trunk/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml Wed Jan 5 17:04:59 2011
@@ -17,7 +17,9 @@
limitations under the License.
-->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+ xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
+ xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">
<command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
<command name="dev/show-tree">
@@ -36,8 +38,17 @@
<action class="org.apache.karaf.shell.dev.Restart" />
</command>
<command name="dev/watch">
- <action class="org.apache.karaf.shell.dev.Watch" />
+ <action class="org.apache.karaf.shell.dev.Watch" >
+ <property name="watcher" ref="watcher"/>
+ </action>
</command>
</command-bundle>
+ <!-- Referenace to the Configuration Admin Service -->
+ <reference id="configurationAdmin" interface="org.osgi.service.cm.ConfigurationAdmin"/>
+
+ <bean id="watcher" class="org.apache.karaf.shell.dev.watch.BundleWatcher">
+ <property name="configurationAdmin" ref="configurationAdmin"/>
+ </bean>
+
</blueprint>