Author: aparfonov
Date: 2010-07-09 10:46:40 -0400 (Fri, 09 Jul 2010)
New Revision: 2763
Added:
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/ResourceListener.java
Modified:
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/RequestHandlerImpl.java
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/ResourceBinder.java
Log:
EXOJCR-824:
Modified:
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/RequestHandlerImpl.java
===================================================================
---
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/RequestHandlerImpl.java 2010-07-09
13:39:29 UTC (rev 2762)
+++
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/RequestHandlerImpl.java 2010-07-09
14:46:40 UTC (rev 2763)
@@ -329,6 +329,8 @@
*/
public void stop()
{
+ // TODO improve
+ ResourceBinder.cleanerStop = true;
}
//
Modified:
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/ResourceBinder.java
===================================================================
---
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/ResourceBinder.java 2010-07-09
13:39:29 UTC (rev 2762)
+++
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/ResourceBinder.java 2010-07-09
14:46:40 UTC (rev 2763)
@@ -68,6 +68,12 @@
public class ResourceBinder
{
+ /**
+ * Name of property which may contains resource expiration date. Date
+ * expected as string representation of java.util.Date in long format.
+ */
+ public static final String RESOURCE_EXPIRED = "resource.expiration.date";
+
/** Logger. */
private static final Log LOG =
ExoLogger.getLogger("exo.ws.rest.core.ResourceBinder");
@@ -93,12 +99,81 @@
}
};
+ static boolean cleanerStop = false;
+
+ protected class ResourceCleaner implements Runnable
+ {
+
+ private final int cleanerDelay;
+
+ /**
+ * @param cleanerDelay cleaner process delay in seconds
+ */
+ public ResourceCleaner(int cleanerDelay)
+ {
+ this.cleanerDelay = cleanerDelay;
+ }
+
+ public void run()
+ {
+ while (!cleanerStop)
+ {
+ try
+ {
+ Thread.sleep(cleanerDelay * 1000L);
+ }
+ catch (InterruptedException e)
+ {
+ ;
+ }
+ if (!cleanerStop)
+ {
+ processResources();
+ }
+ }
+ }
+
+ protected void processResources()
+ {
+ if (LOG.isDebugEnabled())
+ LOG.debug("Start resource cleaner");
+
+ synchronized (rootResources)
+ {
+ for (Iterator<ObjectFactory<AbstractResourceDescriptor>> iter =
rootResources.iterator(); iter.hasNext();)
+ {
+ ObjectFactory<AbstractResourceDescriptor> next = iter.next();
+ List<String> str =
next.getObjectModel().getProperty(RESOURCE_EXPIRED);
+ long expirationDate = -1;
+ if (str != null && str.size() > 0)
+ {
+ try
+ {
+ expirationDate = Long.parseLong(str.get(0));
+ }
+ catch (NumberFormatException e)
+ {
+ ;
+ }
+ }
+ if (expirationDate > 0 && expirationDate <
System.currentTimeMillis())
+ {
+ iter.remove();
+ for (ResourceListener listener: resourceListeners)
+ {
+ listener.resourceRemoved(next.getObjectModel());
+ }
+ if (LOG.isDebugEnabled())
+ LOG.debug("Remove expired resource: " +
next.getObjectModel());
+ }
+ }
+ }
+ }
+ }
+
/** Validator. */
protected final ResourceDescriptorVisitor rdv =
ResourceDescriptorValidator.getInstance();
- /** Amount of available root resources. */
- protected int size = 0;
-
/** @see RuntimeDelegate */
protected final RuntimeDelegate rd;
@@ -112,6 +187,9 @@
protected final List<ObjectFactory<AbstractResourceDescriptor>>
rootResources =
new ArrayList<ObjectFactory<AbstractResourceDescriptor>>();
+ /** Resource listeners. */
+ protected final List<ResourceListener> resourceListeners = new
ArrayList<ResourceListener>();
+
public ResourceBinder(ExoContainerContext containerContext) throws Exception
{
this(containerContext, null);
@@ -163,6 +241,10 @@
LOG.error("Failed add JAX-RS resource " +
resource.getClass().getName(), e);
}
}
+
+ Thread cleaner = new Thread(new ResourceCleaner(60));
+ cleaner.setDaemon(true);
+ cleaner.start();
}
/**
@@ -377,13 +459,29 @@
}
rootResources.add(resourceFactory);
Collections.sort(rootResources, RESOURCE_COMPARATOR);
- size++;
+ for (ResourceListener listener: resourceListeners)
+ {
+ listener.resourceAdded(resourceFactory.getObjectModel());
+ }
if (LOG.isDebugEnabled())
LOG.debug("Add resource: " + resourceFactory.getObjectModel());
}
}
/**
+ * Register new resource listener.
+ *
+ * @param listener listener
+ * @see ResourceListener
+ */
+ public void addResourceListener(ResourceListener listener)
+ {
+ resourceListeners.add(listener);
+ if (LOG.isDebugEnabled())
+ LOG.debug("Resource listener added: " + listener);
+ }
+
+ /**
* Register root resource.
*
* @param resourceClass class of candidate to be root resource
@@ -437,7 +535,6 @@
synchronized (rootResources)
{
rootResources.clear();
- size = 0;
}
}
@@ -493,7 +590,7 @@
@Deprecated
public List<AbstractResourceDescriptor> getRootResources()
{
- List<AbstractResourceDescriptor> l = new
ArrayList<AbstractResourceDescriptor>(size);
+ List<AbstractResourceDescriptor> l = new
ArrayList<AbstractResourceDescriptor>(rootResources.size());
synchronized (rootResources)
{
for (ObjectFactory<AbstractResourceDescriptor> f : rootResources)
@@ -509,7 +606,7 @@
*/
public int getSize()
{
- return size;
+ return rootResources.size();
}
/**
@@ -538,7 +635,10 @@
}
if (resource != null)
{
- size--;
+ for (ResourceListener listener: resourceListeners)
+ {
+ listener.resourceRemoved(resource.getObjectModel());
+ }
if (LOG.isDebugEnabled())
LOG.debug("Remove resource: " + resource.getObjectModel());
}
@@ -573,7 +673,10 @@
}
if (resource != null)
{
- size--;
+ for (ResourceListener listener: resourceListeners)
+ {
+ listener.resourceRemoved(resource.getObjectModel());
+ }
if (LOG.isDebugEnabled())
LOG.debug("Remove resource: " + resource.getObjectModel());
}
Added:
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/ResourceListener.java
===================================================================
---
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/ResourceListener.java
(rev 0)
+++
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/ResourceListener.java 2010-07-09
14:46:40 UTC (rev 2763)
@@ -0,0 +1,47 @@
+/**
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+
+package org.exoplatform.services.rest.impl;
+
+import org.exoplatform.services.rest.resource.AbstractResourceDescriptor;
+
+/**
+ * Listener for adding/removing JAX-RS resources.
+ *
+ * @author <a href="mailto:andrew00x@gmail.com">Andrey
Parfonov</a>
+ * @version $Id$
+ */
+public interface ResourceListener
+{
+
+ /**
+ * Method will be called if new resource add in {@link ResourceBinder} .
+ *
+ * @param resource added resource
+ */
+ void resourceAdded(AbstractResourceDescriptor resource);
+
+ /**
+ * Method will be called if resource removed from {@link ResourceBinder} .
+ *
+ * @param resource removed resource
+ */
+ void resourceRemoved(AbstractResourceDescriptor resource);
+
+}
Property changes on:
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/ResourceListener.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native