You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ace.apache.org by ma...@apache.org on 2013/02/20 09:06:06 UTC
svn commit: r1448029 - in /ace/trunk: org.apache.ace.client.repository.impl/
org.apache.ace.client.repository.impl/src/org/apache/ace/client/repository/impl/
org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/
org.apache.ace.webui.vaadin/src/o...
Author: marrs
Date: Wed Feb 20 08:06:06 2013
New Revision: 1448029
URL: http://svn.apache.org/r1448029
Log:
ACE-318 Fixed the cleanup of sessions and their services. Added a 'sessions' shell command to see the open sessions.
Modified:
ace/trunk/org.apache.ace.client.repository.impl/bnd.bnd
ace/trunk/org.apache.ace.client.repository.impl/src/org/apache/ace/client/repository/impl/Activator.java
ace/trunk/org.apache.ace.client.repository.impl/src/org/apache/ace/client/repository/impl/RepositoryAdminImpl.java
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinClient.java
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinServlet.java
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/component/MainActionToolbar.java
Modified: ace/trunk/org.apache.ace.client.repository.impl/bnd.bnd
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.client.repository.impl/bnd.bnd?rev=1448029&r1=1448028&r2=1448029&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.client.repository.impl/bnd.bnd (original)
+++ ace/trunk/org.apache.ace.client.repository.impl/bnd.bnd Wed Feb 20 08:06:06 2013
@@ -5,6 +5,7 @@
xpp3;version=1.1.4,\
xstream;version=1.2.2,\
org.apache.felix.dependencymanager,\
+ org.apache.felix.gogo.runtime,\
org.apache.ace.log;version=latest,\
org.apache.ace.connectionfactory;version=latest,\
org.apache.ace.client.repository.api;version=latest,\
Modified: ace/trunk/org.apache.ace.client.repository.impl/src/org/apache/ace/client/repository/impl/Activator.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.client.repository.impl/src/org/apache/ace/client/repository/impl/Activator.java?rev=1448029&r1=1448028&r2=1448029&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.client.repository.impl/src/org/apache/ace/client/repository/impl/Activator.java (original)
+++ ace/trunk/org.apache.ace.client.repository.impl/src/org/apache/ace/client/repository/impl/Activator.java Wed Feb 20 08:06:06 2013
@@ -24,6 +24,8 @@ import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
import org.apache.ace.client.repository.RepositoryAdmin;
import org.apache.ace.client.repository.SessionFactory;
@@ -45,6 +47,7 @@ import org.apache.ace.server.log.store.L
import org.apache.felix.dm.Component;
import org.apache.felix.dm.DependencyActivatorBase;
import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.service.command.CommandProcessor;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.service.event.EventAdmin;
@@ -69,12 +72,32 @@ public class Activator extends Dependenc
@Override
public synchronized void init(BundleContext context, DependencyManager manager) throws Exception {
m_dependencyManager = manager;
+
+ Properties props = new Properties();
+ props.put(CommandProcessor.COMMAND_SCOPE, "clientrepo");
+ props.put(CommandProcessor.COMMAND_FUNCTION, new String[] { "sessions" });
+
manager.add(createComponent()
- .setInterface(SessionFactory.class.getName(), null)
+ .setInterface(SessionFactory.class.getName(), props)
.setImplementation(this)
);
}
+ /** Shell command to show the active sessions. */
+ public void sessions() {
+ synchronized (m_sessions) {
+ if (m_sessions.isEmpty()) {
+ System.out.println("No sessions.");
+ }
+ else {
+ System.out.println("Sessions:");
+ for (Entry<String, SessionData> session : m_sessions.entrySet()) {
+ System.out.println(" * " + session.getKey());
+ }
+ }
+ }
+ }
+
/**
* {@inheritDoc}
*/
Modified: ace/trunk/org.apache.ace.client.repository.impl/src/org/apache/ace/client/repository/impl/RepositoryAdminImpl.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.client.repository.impl/src/org/apache/ace/client/repository/impl/RepositoryAdminImpl.java?rev=1448029&r1=1448028&r2=1448029&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.client.repository.impl/src/org/apache/ace/client/repository/impl/RepositoryAdminImpl.java (original)
+++ ace/trunk/org.apache.ace.client.repository.impl/src/org/apache/ace/client/repository/impl/RepositoryAdminImpl.java Wed Feb 20 08:06:06 2013
@@ -401,9 +401,13 @@ public class RepositoryAdminImpl impleme
}
public void deleteLocal() {
- for (RepositorySet set : m_repositorySets) {
- set.deleteLocal();
- }
+ synchronized (m_lock) {
+ if (m_user != null && m_repositorySets != null) {
+ for (RepositorySet set : m_repositorySets) {
+ set.deleteLocal();
+ }
+ }
+ }
}
private boolean loggedIn() {
Modified: ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinClient.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinClient.java?rev=1448029&r1=1448028&r2=1448029&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinClient.java (original)
+++ ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinClient.java Wed Feb 20 08:06:06 2013
@@ -23,6 +23,7 @@ import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -76,6 +77,7 @@ import com.vaadin.event.dd.DropHandler;
import com.vaadin.event.dd.TargetDetails;
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
import com.vaadin.event.dd.acceptcriteria.Or;
+import com.vaadin.service.ApplicationContext;
import com.vaadin.ui.AbstractSelect.AbstractSelectTargetDetails;
import com.vaadin.ui.AbstractSelect.VerticalLocationIs;
import com.vaadin.ui.Button;
@@ -109,7 +111,7 @@ public class VaadinClient extends com.va
private static final long serialVersionUID = 1L;
- private static long SESSION_ID = 12345;
+ private static long SESSION_ID = 1;
private static String targetRepo = "target";
private static String shopRepo = "shop";
@@ -118,7 +120,6 @@ public class VaadinClient extends com.va
private static String endpoint = "/repository";
private volatile AuthenticationService m_authenticationService;
- private volatile DependencyManager m_manager;
private volatile BundleContext m_context;
private volatile SessionFactory m_sessionFactory;
private volatile UserAdmin m_userAdmin;
@@ -156,6 +157,9 @@ public class VaadinClient extends com.va
private final AtomicBoolean m_dependenciesResolved = new AtomicBoolean(false);
private ProgressIndicator m_progress;
+ private DependencyManager m_manager;
+ private Component m_component;
+ private final List<Component> m_eventHandlers = new ArrayList<Component>();
// basic session ID generator
private static long generateSessionID() {
@@ -184,13 +188,15 @@ public class VaadinClient extends com.va
/**
* Creates a new {@link VaadinClient} instance.
+ * @param m_manager2
*
* @param aceHost the hostname where the management service can be reached;
* @param obrUrl the URL of the OBR to use;
* @param useAuth <code>true</code> to use authentication, <code>false</code> to disable authentication;
* @param userName the hardcoded username to use when authentication is disabled.
*/
- public VaadinClient(URL aceHost, URL obrUrl, boolean useAuth, String userName) {
+ public VaadinClient(DependencyManager manager, URL aceHost, URL obrUrl, boolean useAuth, String userName) {
+ m_manager = manager;
try {
m_repository = new URL(aceHost, endpoint);
}
@@ -205,9 +211,44 @@ public class VaadinClient extends com.va
throw new IllegalArgumentException("Need a valid user name when no authentication is used!");
}
}
+
+ @Override
+ public void start(URL applicationUrl, Properties applicationProperties, ApplicationContext context) {
+ m_component = m_manager.createComponent()
+ .setImplementation(this)
+ .setCallbacks("setupDependencies", "start", "stop", "destroyDependencies")
+ .add(m_manager.createServiceDependency()
+ .setService(SessionFactory.class)
+ .setRequired(true)
+ )
+ .add(m_manager.createServiceDependency()
+ .setService(UserAdmin.class)
+ .setRequired(true)
+ )
+ .add(m_manager.createServiceDependency()
+ .setService(AuthenticationService.class)
+ .setRequired(m_useAuth)
+ )
+ .add(m_manager.createServiceDependency()
+ .setService(LogService.class)
+ .setRequired(false)
+ );
+ m_manager.add(m_component);
+ super.start(applicationUrl, applicationProperties, context);
+ }
+
+ @Override
+ public void close() {
+ if (isRunning()) {
+ m_admin.deleteLocal();
+ cleanupListeners();
+ m_manager.remove(m_component);
+ super.close();
+ }
+ }
public void setupDependencies(Component component) {
- m_sessionID = "" + generateSessionID();
+ m_sessionID = "web-" + generateSessionID();
File dir = m_context.getDataFile(m_sessionID);
dir.mkdir();
m_sessionDir = dir;
@@ -522,10 +563,24 @@ public class VaadinClient extends com.va
Properties props = new Properties();
props.put(EventConstants.EVENT_TOPIC, topics);
props.put(EventConstants.EVENT_FILTER, "(" + SessionFactory.SERVICE_SID + "=" + m_sessionID + ")");
- m_manager.add(
- m_manager.createComponent()
- .setInterface(EventHandler.class.getName(), props)
- .setImplementation(implementation));
+ Component component = m_manager.createComponent()
+ .setInterface(EventHandler.class.getName(), props)
+ .setImplementation(implementation);
+ synchronized (m_eventHandlers) {
+ m_eventHandlers.add(component);
+ }
+ m_manager.add(component);
+ }
+
+ private void cleanupListeners() {
+ Component[] components;
+ synchronized (m_eventHandlers) {
+ components = m_eventHandlers.toArray(new Component[m_eventHandlers.size()]);
+ m_eventHandlers.clear();
+ }
+ for (Component component : components) {
+ m_manager.remove(component);
+ }
}
/**
@@ -936,12 +991,6 @@ public class VaadinClient extends com.va
return m_statefulTargetRepository.get(name);
}
- @Override
- public void close() {
- m_admin.deleteLocal();
- super.close();
- }
-
private void showAddArtifactDialog() {
final AddArtifactWindow window = new AddArtifactWindow(m_sessionDir, m_obrUrl) {
@Override
Modified: ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinServlet.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinServlet.java?rev=1448029&r1=1448028&r2=1448029&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinServlet.java (original)
+++ ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinServlet.java Wed Feb 20 08:06:06 2013
@@ -39,7 +39,7 @@ import com.vaadin.terminal.gwt.server.Ab
import com.vaadin.terminal.gwt.server.WebApplicationContext;
public class VaadinServlet extends AbstractApplicationServlet implements ManagedService {
- private static final int SESSION_TIMEOUT = 120; // in seconds (so 120 = 2 minutes)
+ private static final int SESSION_TIMEOUT = 30; // in seconds (so 120 = 2 minutes)
private static final long serialVersionUID = 1L;
@@ -68,28 +68,7 @@ public class VaadinServlet extends Abstr
@Override
protected Application getNewApplication(HttpServletRequest request) throws ServletException {
- Application application = new VaadinClient(m_aceHost, m_obrUrl, m_useAuth, m_userName);
- m_manager.add(m_manager.createComponent()
- .setImplementation(application)
- .setCallbacks("setupDependencies", "start", "stop", "destroyDependencies")
- .add(m_manager.createServiceDependency()
- .setService(SessionFactory.class)
- .setRequired(true)
- )
- .add(m_manager.createServiceDependency()
- .setService(UserAdmin.class)
- .setRequired(true)
- )
- .add(m_manager.createServiceDependency()
- .setService(AuthenticationService.class)
- .setRequired(m_useAuth)
- )
- .add(m_manager.createServiceDependency()
- .setService(LogService.class)
- .setRequired(false)
- )
- );
- return application;
+ return new VaadinClient(m_manager, m_aceHost, m_obrUrl, m_useAuth, m_userName);
}
@Override
Modified: ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/component/MainActionToolbar.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/component/MainActionToolbar.java?rev=1448029&r1=1448028&r2=1448029&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/component/MainActionToolbar.java (original)
+++ ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/component/MainActionToolbar.java Wed Feb 20 08:06:06 2013
@@ -300,17 +300,19 @@ public abstract class MainActionToolbar
setWidth("100%");
setSpacing(true);
- m_manager.add(m_manager.createComponent()
- .setImplementation(this)
- .add(m_manager.createServiceDependency()
- .setService(UIExtensionFactory.class, "(" + UIExtensionFactory.EXTENSION_POINT_KEY + "=" + UIExtensionFactory.EXTENSION_POINT_VALUE_MENU + ")")
- .setCallbacks("add", "remove")
- )
- );
-
initComponent();
}
+ public void init(org.apache.felix.dm.Component component) {
+ DependencyManager dm = component.getDependencyManager();
+ component.add(dm.createServiceDependency()
+ .setService(UIExtensionFactory.class, "(" + UIExtensionFactory.EXTENSION_POINT_KEY + "=" + UIExtensionFactory.EXTENSION_POINT_VALUE_MENU + ")")
+ .setCallbacks("add", "remove")
+ .setRequired(false)
+ .setInstanceBound(true)
+ );
+ }
+
public void add(ServiceReference ref, UIExtensionFactory factory) {
m_extensions.put(ref, factory);
}