You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ace.apache.org by br...@apache.org on 2013/08/21 21:20:56 UTC
svn commit: r1516265 - in /ace/trunk/org.apache.ace.agent: bnd.bnd
src/org/apache/ace/agent/AgentContext.java
src/org/apache/ace/agent/impl/Activator.java
src/org/apache/ace/agent/impl/AgentContextImpl.java
Author: bramk
Date: Wed Aug 21 19:20:55 2013
New Revision: 1516265
URL: http://svn.apache.org/r1516265
Log:
ACE-347 Internalized EventAdmin package
Modified:
ace/trunk/org.apache.ace.agent/bnd.bnd
ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/AgentContext.java
ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/Activator.java
ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/AgentContextImpl.java
Modified: ace/trunk/org.apache.ace.agent/bnd.bnd
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/bnd.bnd?rev=1516265&r1=1516264&r2=1516265&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.agent/bnd.bnd (original)
+++ ace/trunk/org.apache.ace.agent/bnd.bnd Wed Aug 21 19:20:55 2013
@@ -23,6 +23,7 @@ Private-Package: org.apache.ace.range,\
org.apache.felix.dm.tracker,\
org.osgi.service.metatype,\
org.osgi.service.cm,\
+ org.osgi.service.event,\
org.osgi.service.log,\
org.osgi.util.tracker
@@ -34,11 +35,9 @@ Import-Package:javax.net.ssl,\
# This is a minimal set on purpose. Are you really sure the agent must
# expose another package? Probably not...
-# FIXME Decouple api from event admin as well
Export-Package: org.apache.ace.agent,\
org.osgi.service.deploymentadmin;-split-package:=merge-last,\
- org.osgi.service.deploymentadmin.spi;-split-package:=merge-last,\
- org.osgi.service.event
+ org.osgi.service.deploymentadmin.spi;-split-package:=merge-last
-buildpath: osgi.core;version=4.2,\
osgi.cmpn;version=4.2,\
Modified: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/AgentContext.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/AgentContext.java?rev=1516265&r1=1516264&r2=1516265&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/AgentContext.java (original)
+++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/AgentContext.java Wed Aug 21 19:20:55 2013
@@ -19,11 +19,10 @@
package org.apache.ace.agent;
import java.io.File;
+import java.util.Dictionary;
import java.util.Formatter;
import java.util.concurrent.ScheduledExecutorService;
-import org.osgi.service.event.EventAdmin;
-
/**
* Internal interface that provides access to handlers, supporting services and static configuration.
*
@@ -94,18 +93,20 @@ public interface AgentContext {
ScheduledExecutorService getExecutorService();
/**
- * Return the event admin.
+ * Return the work directory.
*
- * @return The service
+ * @return The directory
*/
- EventAdmin getEventAdmin();
+ File getWorkDir();
/**
- * Return the work directory.
+ * Post an event to any eventAdmin services outside the agent available at this time. There is no guarantee on
+ * delivery. Only string values are supported to avoid any potential class-loading issues.
*
- * @return The directory
+ * @param topic The topic
+ * @param properties The payload
*/
- File getWorkDir();
+ void postEvent(String topic, Dictionary<String, String> payload);
/**
* Log a debug message. If <code>args</code> are provided the message will be processed as a format using the
Modified: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/Activator.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/Activator.java?rev=1516265&r1=1516264&r2=1516265&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/Activator.java (original)
+++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/Activator.java Wed Aug 21 19:20:55 2013
@@ -22,6 +22,7 @@ import static org.apache.ace.agent.impl.
import static org.apache.ace.agent.impl.ReflectionUtil.invokeMethod;
import java.util.Date;
+import java.util.Dictionary;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
@@ -54,7 +55,7 @@ import org.osgi.service.packageadmin.Pac
public class Activator extends DependencyActivatorBase {
// internal delegates
- private final InternalEventAdmin m_internalEventAdmin = new InternalEventAdmin();
+ private final InternalEvents m_internalEvents = new InternalEvents();
private final InternalLogger m_internalLogger = new InternalLogger(1);
// managed state
@@ -65,10 +66,10 @@ public class Activator extends Dependenc
private DeploymentAdmin m_internalDeploymentAdmin;
private Component m_agentControlComponent = null;
private EventLoggerImpl m_eventLoggerImpl;
+ private DefaultController m_defaultController;
// injected services
private volatile PackageAdmin m_packageAdmin;
- private volatile EventAdmin m_externalEventAdmin;
@Override
public void init(BundleContext context, DependencyManager manager) throws Exception {
@@ -78,15 +79,14 @@ public class Activator extends Dependenc
m_internalDeploymentAdmin = new DeploymentAdminImpl();
configureField(m_internalDeploymentAdmin, BundleContext.class, context);
configureField(m_internalDeploymentAdmin, PackageAdmin.class, null);
- configureField(m_internalDeploymentAdmin, EventAdmin.class, m_internalEventAdmin);
+ configureField(m_internalDeploymentAdmin, EventAdmin.class, new InternalEventAdmin(m_internalEvents));
configureField(m_internalDeploymentAdmin, LogService.class, new InternalLogService(m_internalLogger, "deployment"));
- m_agentContext = new AgentContextImpl(context.getDataFile(""), m_internalLogger);
+ m_agentContext = new AgentContextImpl(context.getDataFile(""), m_internalLogger, m_internalEvents);
m_agentControl = new AgentControlImpl(m_agentContext);
m_agentUpdateHandler = new AgentUpdateHandlerImpl(context);
configureField(m_agentContext, AgentControl.class, m_agentControl);
- configureField(m_agentContext, EventAdmin.class, m_internalEventAdmin);
configureField(m_agentContext, ConfigurationHandler.class, new ConfigurationHandlerImpl());
configureField(m_agentContext, ConnectionHandler.class, new ConnectionHandlerImpl());
configureField(m_agentContext, DeploymentHandler.class, new DeploymentHandlerImpl(m_internalDeploymentAdmin));
@@ -104,10 +104,7 @@ public class Activator extends Dependenc
.setAutoConfig(Component.class, false)
.add(createServiceDependency()
.setService(PackageAdmin.class).setRequired(true)
- .setCallbacks(this, "packageAdminAdded", "packageAdminRemoved"))
- .add(createServiceDependency()
- .setService(EventAdmin.class).setRequired(false)
- .setCallbacks(this, "eventAdminAdded", "eventAdminRemoved"));
+ .setCallbacks(this, "packageAdminAdded", "packageAdminRemoved"));
// FIXME fake config
if (Boolean.parseBoolean(System.getProperty("agent.identificationhandler.disabled"))) {
@@ -146,27 +143,10 @@ public class Activator extends Dependenc
}
}
- synchronized void eventAdminAdded(EventAdmin eventAdmin) {
- if (m_externalEventAdmin == null) {
- m_externalEventAdmin = eventAdmin;
- configureField(m_internalEventAdmin, EventAdmin.class, eventAdmin);
- }
- }
-
- synchronized void eventAdminRemoved(EventAdmin eventAdmin) {
- if (m_externalEventAdmin == eventAdmin) {
- m_externalEventAdmin = null;
- configureField(m_internalEventAdmin, EventAdmin.class, null);
- }
- }
-
- private DefaultController m_defaultController;
-
void startAgent() throws Exception {
m_internalLogger.logInfo("activator", "Agent starting...", null);
- m_internalLogger.logInfo("activator", "Agent starting...", null);
invokeMethod(m_internalDeploymentAdmin, "start", new Class<?>[] {}, new Object[] {});
m_agentContext.start();
@@ -192,7 +172,7 @@ public class Activator extends Dependenc
BundleContext bundleContext = getDependencyManager().getBundleContext();
bundleContext.addBundleListener(m_eventLoggerImpl);
bundleContext.addFrameworkListener(m_eventLoggerImpl);
- m_internalEventAdmin.registerHandler(m_eventLoggerImpl, EventLoggerImpl.TOPICS_INTEREST);
+ m_internalEvents.registerHandler(m_eventLoggerImpl, EventLoggerImpl.TOPICS_INTEREST);
m_internalLogger.logInfo("activator", "Audit logger started", null);
}
else {
@@ -220,7 +200,7 @@ public class Activator extends Dependenc
BundleContext bundleContext = getDependencyManager().getBundleContext();
bundleContext.removeFrameworkListener(m_eventLoggerImpl);
bundleContext.removeBundleListener(m_eventLoggerImpl);
- m_internalEventAdmin.unregisterHandler(m_eventLoggerImpl);
+ m_internalEvents.unregisterHandler(m_eventLoggerImpl);
}
m_agentContext.stop();
@@ -228,25 +208,33 @@ public class Activator extends Dependenc
m_internalLogger.logInfo("activator", "Agent stopped", null);
}
- static class InternalEventAdmin implements EventAdmin {
+ /**
+ * InternalEvents that posts events to internal handlers and external admins.
+ */
+ static class InternalEvents {
private final Map<EventHandler, String[]> m_eventHandlers = new HashMap<EventHandler, String[]>();
- private volatile EventAdmin m_eventAdmin;
- @Override
+ public void postEvent(String topic, Dictionary<String, String> payload) {
+ Event event = new Event(topic, payload);
+ postEvent(event);
+ }
+
public void postEvent(Event event) {
sendInternal(event);
- EventAdmin eventAdmin = m_eventAdmin;
- if (eventAdmin != null)
- eventAdmin.postEvent(event);
+ sendExternal(event);
}
- @Override
- public void sendEvent(Event event) {
- sendInternal(event);
- EventAdmin eventAdmin = m_eventAdmin;
- if (eventAdmin != null)
- eventAdmin.sendEvent(event);
+ void registerHandler(EventHandler eventHandler, String[] topics) {
+ synchronized (m_eventHandlers) {
+ m_eventHandlers.put(eventHandler, topics);
+ }
+ }
+
+ void unregisterHandler(EventHandler eventHandler) {
+ synchronized (m_eventHandlers) {
+ m_eventHandlers.remove(eventHandler);
+ }
}
private void sendInternal(Event event) {
@@ -264,19 +252,38 @@ public class Activator extends Dependenc
}
}
- void registerHandler(EventHandler eventHandler, String[] topics) {
- synchronized (m_eventHandlers) {
- m_eventHandlers.put(eventHandler, topics);
- }
+ private void sendExternal(Event event) {
+ // TODO this requires looking for all service references and invoking any found admins using reflection
}
- void unregisterHandler(EventHandler eventHandler) {
- synchronized (m_eventHandlers) {
- m_eventHandlers.remove(eventHandler);
- }
+ }
+
+ /**
+ * Internal EventAdmin that delegates to actual InternalEvents. Used to inject into the DeploymentAdmin only.
+ */
+ static class InternalEventAdmin implements EventAdmin {
+
+ private final InternalEvents m_events;
+
+ public InternalEventAdmin(InternalEvents events) {
+ m_events = events;
+ }
+
+ @Override
+ public void postEvent(Event event) {
+ m_events.postEvent(event);
+ }
+
+ @Override
+ public void sendEvent(Event event) {
+ m_events.postEvent(event);
}
}
+ /**
+ * Internal logger that writes to system out for now. It minimizes work until it is determined the loglevel is
+ * loggable.
+ */
static class InternalLogger {
private final int m_level;
@@ -317,6 +324,9 @@ public class Activator extends Dependenc
}
}
+ /**
+ * Internal LogService that wraps delegates to actual InternalLogger. Used to inject into the DeploymentAdmin only.
+ */
static class InternalLogService implements LogService {
private final InternalLogger m_logger;
@@ -361,6 +371,9 @@ public class Activator extends Dependenc
}
}
+ /**
+ * Internal thread factory that assigns recognizable names to the threads it creates and sets them in daemon mode.
+ */
static class InternalThreadFactory implements ThreadFactory {
private static final String m_name = "ACE Agent worker (%s)";
Modified: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/AgentContextImpl.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/AgentContextImpl.java?rev=1516265&r1=1516264&r2=1516265&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/AgentContextImpl.java (original)
+++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/AgentContextImpl.java Wed Aug 21 19:20:55 2013
@@ -19,6 +19,7 @@
package org.apache.ace.agent.impl;
import java.io.File;
+import java.util.Dictionary;
import java.util.concurrent.ScheduledExecutorService;
import org.apache.ace.agent.AgentContext;
@@ -31,8 +32,8 @@ import org.apache.ace.agent.DeploymentHa
import org.apache.ace.agent.DiscoveryHandler;
import org.apache.ace.agent.DownloadHandler;
import org.apache.ace.agent.IdentificationHandler;
+import org.apache.ace.agent.impl.Activator.InternalEvents;
import org.apache.ace.agent.impl.Activator.InternalLogger;
-import org.osgi.service.event.EventAdmin;
/**
* Implementation of the internal agent context service.
@@ -51,13 +52,15 @@ public class AgentContextImpl implements
private volatile AgentUpdateHandler m_agentUpdateHandler;
private volatile ScheduledExecutorService m_executorService;
- private volatile EventAdmin m_eventAdmin;
private final InternalLogger m_logger;
+ private final InternalEvents m_events;
+
private final File m_workDir;
- public AgentContextImpl(File workDir, InternalLogger logger) {
+ public AgentContextImpl(File workDir, InternalLogger logger, InternalEvents events) {
m_logger = logger;
+ m_events = events;
m_workDir = workDir;
}
@@ -141,18 +144,18 @@ public class AgentContextImpl implements
}
@Override
- public EventAdmin getEventAdmin() {
- return m_eventAdmin;
+ public AgentControl getAgentControl() {
+ return m_agentControl;
}
@Override
- public AgentControl getAgentControl() {
- return m_agentControl;
+ public void postEvent(String topic, Dictionary<String, String> payload) {
+ m_events.postEvent(topic, payload);
}
@Override
public void logDebug(String component, String message, Object... args) {
- m_logger.logDebug(component, message, null,args);
+ m_logger.logDebug(component, message, null, args);
}
@Override
@@ -189,4 +192,5 @@ public class AgentContextImpl implements
public void logError(String component, String message, Throwable exception, Object... args) {
m_logger.logDebug(component, message, exception, args);
}
+
}