exo-jcr SVN: r1233 - ws/branches/2.2.x/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl.
by do-not-reply@jboss.org
Author: max_shaposhnik
Date: 2009-12-29 07:38:58 -0500 (Tue, 29 Dec 2009)
New Revision: 1233
Modified:
ws/branches/2.2.x/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/RequestHandlerImpl.java
Log:
EXOJCR-353 added message & header when WebApplicationexception occurs
Modified: ws/branches/2.2.x/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/RequestHandlerImpl.java
===================================================================
--- ws/branches/2.2.x/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/RequestHandlerImpl.java 2009-12-29 12:26:31 UTC (rev 1232)
+++ ws/branches/2.2.x/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/RequestHandlerImpl.java 2009-12-29 12:38:58 UTC (rev 1233)
@@ -178,6 +178,12 @@
errorResponse = excmap.toResponse(e);
}
}
+
+ if (e.getMessage() != null)
+ errorResponse =
+ Response.status(errorResponse.getStatus()).entity(new String(e.getMessage())).type(
+ MediaType.TEXT_PLAIN).header("JAXRS-Message-Provided", "true").build();
+
response.setResponse(errorResponse);
}
else
@@ -202,10 +208,17 @@
LOG.warn("WedApplication exception occurs.", e.getCause());
}
- // add stack trace as message body
- errorResponse =
- Response.status(errorResponse.getStatus()).entity(new ErrorStreaming(e)).type(
- MediaType.TEXT_PLAIN).build();
+ // print stack trace & adding ex message into body
+ if (LOG.isDebugEnabled())
+ {
+ e.printStackTrace();
+ }
+ if (e.getMessage() != null)
+ errorResponse =
+ Response.status(errorResponse.getStatus()).entity(new String(e.getMessage())).type(
+ MediaType.TEXT_PLAIN).header("JAXRS-Message-Provided", "true").build();
+ else
+ errorResponse = Response.status(errorResponse.getStatus()).header("JAXRS-Message-Provided", "false").build();
}
}
response.setResponse(errorResponse);
16 years, 4 months
exo-jcr SVN: r1232 - in ws/trunk/exo.ws.rest.core/src: test/java/org/exoplatform/services/rest/impl/method and 1 other directory.
by do-not-reply@jboss.org
Author: max_shaposhnik
Date: 2009-12-29 07:26:31 -0500 (Tue, 29 Dec 2009)
New Revision: 1232
Added:
ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/method/WebApplicationExceptionTest.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/test/java/org/exoplatform/services/rest/impl/method/MethodExceptionTest.java
Log:
EXOJCR-353 added message & header when WebApplicationexception occurs
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 2009-12-29 12:18:42 UTC (rev 1231)
+++ ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/RequestHandlerImpl.java 2009-12-29 12:26:31 UTC (rev 1232)
@@ -147,7 +147,7 @@
{
if (LOG.isDebugEnabled() && e.getCause() != null)
{
- LOG.warn("WedApplication exception occurs.", e.getCause());
+ LOG.warn("WebApplication exception occurs.", e.getCause());
}
if (errorResponse.getEntity() == null)
{
@@ -156,6 +156,12 @@
errorResponse = excmap.toResponse(e);
}
}
+
+ if (e.getMessage() != null)
+ errorResponse =
+ Response.status(errorResponse.getStatus()).entity(new String(e.getMessage())).type(
+ MediaType.TEXT_PLAIN).header("JAXRS-Message-Provided", "true").build();
+
response.setResponse(errorResponse);
}
else
@@ -168,7 +174,7 @@
if (LOG.isDebugEnabled() && e.getCause() != null)
{
// Hide error message if exception mapper exists.
- LOG.warn("WedApplication exception occurs.", e.getCause());
+ LOG.warn("WebApplication exception occurs.", e.getCause());
}
errorResponse = excmap.toResponse(e);
@@ -177,13 +183,20 @@
{
if (e.getCause() != null)
{
- LOG.warn("WedApplication exception occurs.", e.getCause());
+ LOG.warn("WebApplication exception occurs.", e.getCause());
}
- // add stack trace as message body
- errorResponse =
- Response.status(errorResponse.getStatus()).entity(new ErrorStreaming(e)).type(
- MediaType.TEXT_PLAIN).build();
+ // print stack trace & adding ex message into body
+ if (LOG.isDebugEnabled())
+ {
+ e.printStackTrace();
+ }
+ if (e.getMessage() != null)
+ errorResponse =
+ Response.status(errorResponse.getStatus()).entity(new String(e.getMessage())).type(
+ MediaType.TEXT_PLAIN).header("JAXRS-Message-Provided", "true").build();
+ else
+ errorResponse = Response.status(errorResponse.getStatus()).header("JAXRS-Message-Provided", "false").build();
}
}
response.setResponse(errorResponse);
Modified: ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/method/MethodExceptionTest.java
===================================================================
--- ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/method/MethodExceptionTest.java 2009-12-29 12:18:42 UTC (rev 1231)
+++ ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/method/MethodExceptionTest.java 2009-12-29 12:26:31 UTC (rev 1232)
@@ -31,7 +31,7 @@
* Date: 21 Jan 2009
*
* @author <a href="mailto:dmitry.kataev@exoplatform.com.ua">Dmytro Katayev</a>
- * @version $Id: TestMethodException.java
+ * @version $Id: MethodExceptionTest.java
*/
public class MethodExceptionTest extends AbstractResourceTest
{
Added: ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/method/WebApplicationExceptionTest.java
===================================================================
--- ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/method/WebApplicationExceptionTest.java (rev 0)
+++ ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/method/WebApplicationExceptionTest.java 2009-12-29 12:26:31 UTC (rev 1232)
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2009 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.method;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Response;
+
+import org.exoplatform.services.rest.AbstractResourceTest;
+import org.exoplatform.services.rest.impl.method.MethodExceptionTest.UncheckedException;
+
+/**
+ * Created by The eXo Platform SAS. <br/>
+ * Date: 24 Dec 2009
+ *
+ * @author <a href="mailto:max.shaposhnik@exoplatform.com">Max Shaposhnik</a>
+ * @version $Id: WebApplicationExceptionTest.java
+ */
+public class WebApplicationExceptionTest extends AbstractResourceTest
+{
+
+ @Path("/a")
+ public static class Resource1
+ {
+
+ @GET
+ @Path("/0")
+ public void m0() throws WebApplicationException
+ {
+ Exception e = new Exception("testmsg");
+ throw new WebApplicationException(e, 500);
+ }
+
+ @GET
+ @Path("/1")
+ public Response m1() throws WebApplicationException
+ {
+ throw new WebApplicationException(500);
+ }
+
+ @GET
+ @Path("/2")
+ public void m2() throws Exception
+ {
+ throw new UncheckedException("Unchecked exception");
+ }
+
+ }
+
+ public void testExceptionMessage() throws Exception
+ {
+ Resource1 resource = new Resource1();
+ registry(resource);
+
+ assertEquals(500, service("GET", "/a/0", "", null, null).getStatus());
+ String entity = (String)service("GET", "/a/0", "", null, null).getEntity();
+ assertTrue(entity.indexOf("testmsg") > 0);
+
+ assertEquals(500, service("GET", "/a/1", "", null, null).getStatus());
+ assertEquals(null, service("GET", "/a/1", "", null, null).getEntity());
+ unregistry(resource);
+ }
+
+}
Property changes on: ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/method/WebApplicationExceptionTest.java
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
16 years, 4 months
exo-jcr SVN: r1231 - in jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query: lucene and 1 other directory.
by do-not-reply@jboss.org
Author: nzamosenchuk
Date: 2009-12-29 07:18:42 -0500 (Tue, 29 Dec 2009)
New Revision: 1231
Modified:
jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexInfos.java
jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java
Log:
EXOJCR-327: MultiIndex is set to IndexInfos on the end of constructor and indexNames saved to local variable before creating PersistedIndexes
Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexInfos.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexInfos.java 2009-12-29 12:16:11 UTC (rev 1230)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexInfos.java 2009-12-29 12:18:42 UTC (rev 1231)
@@ -20,6 +20,7 @@
import org.exoplatform.services.jcr.impl.core.query.IndexerIoMode;
import org.exoplatform.services.jcr.impl.core.query.lucene.IndexInfos;
+import org.exoplatform.services.jcr.impl.core.query.lucene.MultiIndex;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.jboss.cache.Cache;
@@ -104,7 +105,6 @@
// Currently READ_ONLY is set, so new lists should be fired to multiIndex.
cache.addCacheListener(this);
}
- log.info("/!\\ created jboss cache index infos");
}
/**
@@ -201,7 +201,11 @@
// callback multiIndex to refresh lists
try
{
- getMultiIndex().refreshIndexList();
+ MultiIndex multiIndex = getMultiIndex();
+ if (multiIndex != null)
+ {
+ multiIndex.refreshIndexList();
+ }
}
catch (IOException e)
{
Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java 2009-12-29 12:16:11 UTC (rev 1230)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java 2009-12-29 12:18:42 UTC (rev 1231)
@@ -241,7 +241,6 @@
this.flushTask = null;
this.indexNames = indexInfos;
this.indexNames.setDirectory(indexDir);
- this.indexNames.setMultiIndex(this);
this.indexNames.read();
// as of 1.5 deletable file is not used anymore
@@ -257,11 +256,12 @@
// initialize indexing queue
this.indexingQueue = new IndexingQueue(store);
-
+ // copy current index names
+ Set<String> currentNames = new HashSet<String>(indexNames.getNames());
+
// open persistent indexes
- for (int i = 0; i < indexNames.size(); i++)
+ for (String name:currentNames)
{
- String name = indexNames.getName(i);
// only open if it still exists
// it is possible that indexNames still contains a name for
// an index that has been deleted, but indexNames has not been
@@ -301,6 +301,7 @@
{
setReadWrite();
}
+ this.indexNames.setMultiIndex(this);
}
/**
16 years, 4 months
exo-jcr SVN: r1230 - jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core.
by do-not-reply@jboss.org
Author: tolusha
Date: 2009-12-29 07:16:11 -0500 (Tue, 29 Dec 2009)
New Revision: 1230
Modified:
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
Log:
EXOJCR-344: small fix
Modified: jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
===================================================================
--- jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java 2009-12-29 11:56:33 UTC (rev 1229)
+++ jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java 2009-12-29 12:16:11 UTC (rev 1230)
@@ -1577,7 +1577,7 @@
protected List<? extends ItemData> mergeNodes(ItemData rootData, DataManager dataManager) throws RepositoryException
{
// 1 get all transient descendants
- List<ItemState> transientDescendants = new ArrayList(changesLog.getLastChildrenStates(rootData, true));
+ Collection<ItemState> transientDescendants = changesLog.getLastChildrenStates(rootData, true);
if (!transientDescendants.isEmpty())
{
@@ -1615,7 +1615,7 @@
protected List<? extends ItemData> mergeProps(ItemData rootData, DataManager dataManager) throws RepositoryException
{
// 1 get all transient descendants
- List<ItemState> transientDescendants = new ArrayList(changesLog.getLastChildrenStates(rootData, false));
+ Collection<ItemState> transientDescendants = changesLog.getLastChildrenStates(rootData, false);
if (!transientDescendants.isEmpty())
{
@@ -1712,7 +1712,8 @@
* @throws RepositoryException
*/
private void traverseStoredDescendants(ItemData parent, DataManager dataManager, int action,
- Map<String, ItemData> ret, boolean listOnly, List<ItemState> transientDescendants) throws RepositoryException
+ Map<String, ItemData> ret, boolean listOnly, Collection<ItemState> transientDescendants)
+ throws RepositoryException
{
if (parent.isNode())
16 years, 4 months
exo-jcr SVN: r1229 - jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core.
by do-not-reply@jboss.org
Author: tolusha
Date: 2009-12-29 06:56:33 -0500 (Tue, 29 Dec 2009)
New Revision: 1229
Modified:
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
Log:
EXOJCR-344: SessionDataManager small refactoring merge() methods
Modified: jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
===================================================================
--- jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java 2009-12-29 10:16:00 UTC (rev 1228)
+++ jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java 2009-12-29 11:56:33 UTC (rev 1229)
@@ -664,7 +664,7 @@
try
{
- return (List<NodeData>)merge(parent, transactionableManager, false, MERGE_NODES);
+ return (List<NodeData>)mergeNodes(parent, transactionableManager);
}
finally
{
@@ -704,7 +704,7 @@
try
{
- return (List<PropertyData>)merge(parent, transactionableManager, false, MERGE_PROPS);
+ return (List<PropertyData>)mergeProps(parent, transactionableManager);
}
finally
{
@@ -728,7 +728,7 @@
try
{
- return (List<PropertyData>)mergeList(parent, transactionableManager, false, MERGE_PROPS);
+ return (List<PropertyData>)mergeProps(parent, transactionableManager);
}
finally
{
@@ -1566,31 +1566,63 @@
}
/**
- * merges incoming data with changes stored in this log i.e: 1. incoming data still not modified
+ * Merges incoming node with changes stored in this log i.e: 1. incoming data still not modified
* if there are no corresponding changes 2. incoming data is refreshed with corresponding changes
* if any 3. new datas is added from changes 4. if chaged data is marked as "deleted" it removes
* from outgoing list WARN. THIS METHOD HAS SIBLING - mergeList, see below
*
* @param rootData
- * @param deep
- * if true - traverses
- * @param action
- * : MERGE_NODES | MERGE_PROPS | MERGE_ITEMS
* @return
*/
- protected List<? extends ItemData> merge(ItemData rootData, DataManager dataManager, boolean deep, int action)
- throws RepositoryException
+ protected List<? extends ItemData> mergeNodes(ItemData rootData, DataManager dataManager) throws RepositoryException
{
// 1 get all transient descendants
- List<ItemState> transientDescendants = new ArrayList<ItemState>();
- traverseTransientDescendants(rootData, false, action, transientDescendants);
+ List<ItemState> transientDescendants = new ArrayList(changesLog.getLastChildrenStates(rootData, true));
- // 2 get ALL persisted descendants
- Map<String, ItemData> descendants = new LinkedHashMap<String, ItemData>();
- List<? extends ItemData> result = traverseStoredDescendants(rootData, dataManager, false, action, descendants, false, transientDescendants);
+ if (!transientDescendants.isEmpty())
+ {
+ // 2 get ALL persisted descendants
+ Map<String, ItemData> descendants = new LinkedHashMap<String, ItemData>();
+ traverseStoredDescendants(rootData, dataManager, MERGE_NODES, descendants, false, transientDescendants);
- if (deep || !transientDescendants.isEmpty())
+ // merge data
+ for (ItemState state : transientDescendants)
+ {
+ ItemData data = state.getData();
+ if (!state.isDeleted())
+ descendants.put(data.getIdentifier(), data);
+ else
+ descendants.remove(data.getIdentifier());
+ }
+ Collection<ItemData> desc = descendants.values();
+ return new ArrayList<ItemData>(desc);
+ }
+ else
{
+ return new ArrayList<ItemData>(dataManager.getChildNodesData((NodeData)rootData));
+ }
+ }
+
+ /**
+ * Merges incoming property data with changes stored in this log i.e: 1. incoming data still not modified
+ * if there are no corresponding changes 2. incoming data is refreshed with corresponding changes
+ * if any 3. new datas is added from changes 4. if chaged data is marked as "deleted" it removes
+ * from outgoing list WARN. THIS METHOD HAS SIBLING - mergeList, see below
+ *
+ * @param rootData
+ * @return
+ */
+ protected List<? extends ItemData> mergeProps(ItemData rootData, DataManager dataManager) throws RepositoryException
+ {
+ // 1 get all transient descendants
+ List<ItemState> transientDescendants = new ArrayList(changesLog.getLastChildrenStates(rootData, false));
+
+ if (!transientDescendants.isEmpty())
+ {
+ // 2 get ALL persisted descendants
+ Map<String, ItemData> descendants = new LinkedHashMap<String, ItemData>();
+ traverseStoredDescendants(rootData, dataManager, MERGE_PROPS, descendants, false, transientDescendants);
+
// merge data
for (ItemState state : transientDescendants)
{
@@ -1600,29 +1632,12 @@
else
descendants.remove(data.getIdentifier());
}
- Collection<? extends ItemData> desc = result != null ? result : descendants.values();
- List<ItemData> retval;
- if (deep)
- {
- int size = desc.size();
- retval = new ArrayList<ItemData>(size < 10 ? 10 : size);
-
- for (ItemData itemData : desc)
- {
- retval.add(itemData);
- if (deep)
- retval.addAll(merge(itemData, dataManager, true, action));
- }
- }
- else
- {
- retval = new ArrayList<ItemData>(desc);
- }
- return retval;
+ Collection<ItemData> desc = descendants.values();
+ return new ArrayList<ItemData>(desc);
}
else
{
- return new ArrayList<ItemData>(result);
+ return new ArrayList<ItemData>(dataManager.getChildPropertiesData((NodeData)rootData));
}
}
@@ -1643,14 +1658,14 @@
// 1 get all transient descendants
List<ItemState> transientDescendants = new ArrayList<ItemState>();
- traverseTransientDescendants(rootData, false, action, transientDescendants);
+ traverseTransientDescendants(rootData, action, transientDescendants);
- // 2 get ALL persisted descendants
- Map<String, ItemData> descendants = new LinkedHashMap<String, ItemData>();
- List<? extends ItemData> result = traverseStoredDescendants(rootData, dataManager, false, action, descendants, true, transientDescendants);
-
if (deep || !transientDescendants.isEmpty())
{
+ // 2 get ALL persisted descendants
+ Map<String, ItemData> descendants = new LinkedHashMap<String, ItemData>();
+ traverseStoredDescendants(rootData, dataManager, action, descendants, true, transientDescendants);
+
// merge data
for (ItemState state : transientDescendants)
{
@@ -1660,7 +1675,7 @@
else
descendants.remove(data.getIdentifier());
}
- Collection<? extends ItemData> desc = result != null ? result : descendants.values();
+ Collection<ItemData> desc = descendants.values();
List<ItemData> retval;
if (deep)
{
@@ -1678,11 +1693,11 @@
{
retval = new ArrayList<ItemData>(desc);
}
- return retval;
+ return retval;
}
else
{
- return new ArrayList<ItemData>(result);
+ return new ArrayList<ItemData>(getStoredDescendants(rootData, dataManager, action));
}
}
@@ -1696,78 +1711,83 @@
* @param ret
* @throws RepositoryException
*/
- private List<? extends ItemData> traverseStoredDescendants(ItemData parent, DataManager dataManager, boolean deep, int action,
+ private void traverseStoredDescendants(ItemData parent, DataManager dataManager, int action,
Map<String, ItemData> ret, boolean listOnly, List<ItemState> transientDescendants) throws RepositoryException
{
if (parent.isNode())
{
- List<ItemData> childItems = null;
if (action != MERGE_PROPS)
{
List<NodeData> childNodes = dataManager.getChildNodesData((NodeData)parent);
- if (deep || !transientDescendants.isEmpty())
+ for (NodeData childNode : childNodes)
{
- for (NodeData childNode : childNodes)
- {
- ret.put(childNode.getIdentifier(), childNode);
+ ret.put(childNode.getIdentifier(), childNode);
- if (log.isDebugEnabled())
- log.debug("Traverse stored (N) " + childNode.getQPath().getAsString());
-
- // TODO [PN] Not used
- if (deep)
- traverseStoredDescendants(childNode, dataManager, deep, action, ret, listOnly, transientDescendants);
- }
+ if (log.isDebugEnabled())
+ log.debug("Traverse stored (N) " + childNode.getQPath().getAsString());
}
- else
- {
- if (action != MERGE_NODES)
- {
- childItems = new ArrayList<ItemData>(childNodes);
- }
- else
- {
- return childNodes;
- }
- }
}
if (action != MERGE_NODES)
{
List<PropertyData> childProps =
listOnly ? dataManager.listChildPropertiesData((NodeData)parent) : dataManager
.getChildPropertiesData((NodeData)parent);
- if (deep || !transientDescendants.isEmpty())
+ outer : for (PropertyData childProp : childProps)
{
- outer : for (PropertyData childProp : childProps)
+ for (ItemState transientState : transientDescendants)
{
- for (ItemState transientState : transientDescendants)
+ if (!transientState.isNode() && !transientState.isDeleted()
+ && transientState.getData().getQPath().getDepth() == childProp.getQPath().getDepth()
+ && transientState.getData().getQPath().getName().equals(childProp.getQPath().getName()))
{
- if (!transientState.isNode() && !transientState.isDeleted()
- && transientState.getData().getQPath().getDepth() == childProp.getQPath().getDepth()
- && transientState.getData().getQPath().getName().equals(childProp.getQPath().getName()))
- {
- continue outer;
- }
+ continue outer;
}
- ret.put(childProp.getIdentifier(), childProp);
+ }
+ ret.put(childProp.getIdentifier(), childProp);
- if (log.isDebugEnabled())
- log.debug("Traverse stored (P) " + childProp.getQPath().getAsString());
- }
+ if (log.isDebugEnabled())
+ log.debug("Traverse stored (P) " + childProp.getQPath().getAsString());
}
- else
- {
- if (action != MERGE_PROPS)
- {
- childItems.addAll(childProps);
- }
- else
- {
- return childProps;
- }
- }
}
+ }
+ }
+
+ /**
+ * Get all stored descendants for the given parent node
+ *
+ * @param parent
+ * @param dataManager
+ * @param action
+ * @throws RepositoryException
+ */
+ private List<? extends ItemData> getStoredDescendants(ItemData parent, DataManager dataManager, int action)
+ throws RepositoryException
+ {
+ if (parent.isNode())
+ {
+ List<ItemData> childItems = null;
+
+ List<NodeData> childNodes = dataManager.getChildNodesData((NodeData)parent);
+ if (action != MERGE_NODES)
+ {
+ childItems = new ArrayList<ItemData>(childNodes);
+ }
+ else
+ {
+ return childNodes;
+ }
+
+ List<PropertyData> childProps = dataManager.getChildPropertiesData((NodeData)parent);
+ if (action != MERGE_PROPS)
+ {
+ childItems.addAll(childProps);
+ }
+ else
+ {
+ return childProps;
+ }
+
return childItems;
}
return null;
@@ -1782,7 +1802,7 @@
* @param ret
* @throws RepositoryException
*/
- private void traverseTransientDescendants(ItemData parent, boolean deep, int action, List<ItemState> ret)
+ private void traverseTransientDescendants(ItemData parent, int action, List<ItemState> ret)
throws RepositoryException
{
@@ -1794,9 +1814,6 @@
for (ItemState childNode : childNodes)
{
ret.add(childNode);
-
- if (deep)
- traverseTransientDescendants(childNode.getData(), deep, action, ret);
}
}
if (action != MERGE_NODES)
16 years, 4 months
exo-jcr SVN: r1228 - in kernel/trunk/exo.kernel.container/src: main/java/org/exoplatform/management/annotations and 5 other directories.
by do-not-reply@jboss.org
Author: julien_viet
Date: 2009-12-29 05:16:00 -0500 (Tue, 29 Dec 2009)
New Revision: 1228
Added:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/annotations/package-info.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/annotations/package-info.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/ExoMBeanInfoBuilder.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/ExoModelMBean.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/JMX.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/JMXManagementProvider.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/MBeanScopingData.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/ObjectNameBuilder.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/PropertiesInfo.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/PropertyInfo.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/package-info.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/package-info.java
Removed:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/jmx/
Modified:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedResource.java
kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/AbstractTestExoMBean.java
kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestNameTemplate.java
Log:
EXOJCR-330 : Enable plugability of management layer : added javadoc and did move the jmx stuff to the right place
Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java 2009-12-29 09:58:06 UTC (rev 1227)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java 2009-12-29 10:16:00 UTC (rev 1228)
@@ -25,8 +25,8 @@
import org.exoplatform.management.annotations.Managed;
import org.exoplatform.management.annotations.ManagedDescription;
import org.exoplatform.management.annotations.ManagedName;
+import org.exoplatform.management.jmx.impl.JMXManagementProvider;
import org.exoplatform.management.spi.ManagementProvider;
-import org.exoplatform.management.spi.jmx.JMXManagementProvider;
import org.picocontainer.ComponentAdapter;
import org.picocontainer.PicoContainer;
import org.picocontainer.PicoException;
Added: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/annotations/package-info.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/annotations/package-info.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/annotations/package-info.java 2009-12-29 10:16:00 UTC (rev 1228)
@@ -0,0 +1,8 @@
+/**
+ * <p>This package defines the annotations the defines the management interface of a service. The annotations are
+ * agnostic of any management layer implementation to avoid the coupling to a specific management layer.</p>
+ *
+ * <p>It is possible for a management layer to define additional annotations that are used by that layer to
+ * provide more information to manage the resource.</p>
+ */
+package org.exoplatform.management.annotations;
\ No newline at end of file
Added: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/annotations/package-info.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/annotations/package-info.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/annotations/package-info.java 2009-12-29 10:16:00 UTC (rev 1228)
@@ -0,0 +1,4 @@
+/**
+ * This package defines additional meta data for the JMX management layer.
+ */
+package org.exoplatform.management.jmx.annotations;
\ No newline at end of file
Copied: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/ExoMBeanInfoBuilder.java (from rev 1218, kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/jmx/ExoMBeanInfoBuilder.java)
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/ExoMBeanInfoBuilder.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/ExoMBeanInfoBuilder.java 2009-12-29 10:16:00 UTC (rev 1228)
@@ -0,0 +1,228 @@
+/*
+ * Copyright (C) 2009 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.management.jmx.impl;
+
+import org.exoplatform.management.spi.ManagedMethodMetaData;
+import org.exoplatform.management.spi.ManagedMethodParameterMetaData;
+import org.exoplatform.management.spi.ManagedPropertyMetaData;
+import org.exoplatform.management.spi.ManagedTypeMetaData;
+import org.exoplatform.container.management.MetaDataBuilder;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.management.Descriptor;
+import javax.management.IntrospectionException;
+import javax.management.MBeanParameterInfo;
+import javax.management.modelmbean.ModelMBeanAttributeInfo;
+import javax.management.modelmbean.ModelMBeanConstructorInfo;
+import javax.management.modelmbean.ModelMBeanInfo;
+import javax.management.modelmbean.ModelMBeanInfoSupport;
+import javax.management.modelmbean.ModelMBeanNotificationInfo;
+import javax.management.modelmbean.ModelMBeanOperationInfo;
+
+/**
+ * <p>A class that build mbean meta data</p>
+ *
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class ExoMBeanInfoBuilder
+{
+
+ private static enum Role {
+ SET("setter"), IS("getter"), GET("getter"), OP("operation");
+
+ private final String name;
+
+ private Role(String role)
+ {
+ this.name = role;
+ }
+ }
+
+ private ManagedTypeMetaData typeMD;
+
+ /**
+ * Create a new builder.
+ *
+ * @param clazz the clazz
+ * @throws IllegalArgumentException if the class is null or does not contain meta data
+ */
+ public ExoMBeanInfoBuilder(Class clazz) throws IllegalArgumentException
+ {
+ this.typeMD = new MetaDataBuilder(clazz).build();
+ }
+
+ public ExoMBeanInfoBuilder(ManagedTypeMetaData typeMD) throws IllegalArgumentException
+ {
+ this.typeMD = typeMD;
+ }
+
+ private ModelMBeanOperationInfo buildOperationInfo(Method method, String description, Role role,
+ Collection<ManagedMethodParameterMetaData> parametersMD)
+ {
+ ModelMBeanOperationInfo operationInfo = new ModelMBeanOperationInfo(description, method);
+
+ //
+ if (description == null)
+ {
+ description = "Management operation";
+ }
+
+ //
+ MBeanParameterInfo[] parameterInfos = operationInfo.getSignature();
+ for (ManagedMethodParameterMetaData parameterMD : parametersMD)
+ {
+ int i = parameterMD.getIndex();
+ MBeanParameterInfo parameterInfo = parameterInfos[i];
+ String parameterName = parameterInfo.getName();
+ String parameterDescription = operationInfo.getSignature()[i].getDescription();
+ if (parameterMD.getName() != null)
+ {
+ parameterName = parameterMD.getName();
+ }
+ else if (parameterMD.getDescription() != null)
+ {
+ parameterDescription = parameterMD.getDescription();
+ }
+ parameterInfos[i] = new MBeanParameterInfo(parameterName, parameterInfo.getType(), parameterDescription);
+ }
+
+ //
+ Descriptor operationDescriptor = operationInfo.getDescriptor();
+ operationDescriptor.setField("role", role.name);
+
+ //
+ return new ModelMBeanOperationInfo(operationInfo.getName(), description, parameterInfos, operationInfo
+ .getReturnType(), operationInfo.getImpact(), operationDescriptor);
+ }
+
+ /**
+ * Build the info.
+ *
+ * @return returns the info
+ * @throws IllegalStateException raised by any build time issue
+ */
+ public ModelMBeanInfo build() throws IllegalStateException
+ {
+ String mbeanDescription = "Exo model mbean";
+ if (typeMD.getDescription() != null)
+ {
+ mbeanDescription = typeMD.getDescription();
+ }
+
+ //
+ ArrayList<ModelMBeanOperationInfo> operations = new ArrayList<ModelMBeanOperationInfo>();
+ for (ManagedMethodMetaData methodMD : typeMD.getMethods())
+ {
+ ModelMBeanOperationInfo operationInfo =
+ buildOperationInfo(methodMD.getMethod(), methodMD.getDescription(), Role.OP, methodMD.getParameters());
+ operations.add(operationInfo);
+ }
+
+ //
+ Map<String, ModelMBeanAttributeInfo> attributeInfos = new HashMap<String, ModelMBeanAttributeInfo>();
+ for (ManagedPropertyMetaData propertyMD : typeMD.getProperties())
+ {
+
+ Method getter = propertyMD.getGetter();
+ if (getter != null)
+ {
+ Role role;
+ String getterName = getter.getName();
+ if (getterName.startsWith("get") && getterName.length() > 3)
+ {
+ role = Role.GET;
+ }
+ else if (getterName.startsWith("is") && getterName.length() > 2)
+ {
+ role = Role.IS;
+ }
+ else
+ {
+ throw new AssertionError();
+ }
+ Collection<ManagedMethodParameterMetaData> blah = Collections.emptyList();
+ ModelMBeanOperationInfo operationInfo =
+ buildOperationInfo(getter, propertyMD.getGetterDescription(), role, blah);
+ operations.add(operationInfo);
+ }
+
+ //
+ Method setter = propertyMD.getSetter();
+ if (setter != null)
+ {
+ ManagedMethodParameterMetaData s = new ManagedMethodParameterMetaData(0);
+ s.setDescription(propertyMD.getSetterParameter().getDescription());
+ s.setName(propertyMD.getSetterParameter().getName());
+ Collection<ManagedMethodParameterMetaData> blah = Collections.singletonList(s);
+ ModelMBeanOperationInfo operationInfo =
+ buildOperationInfo(setter, propertyMD.getSetterDescription(), Role.SET, blah);
+ operations.add(operationInfo);
+ }
+
+ //
+ try
+ {
+ String attributeDescription =
+ propertyMD.getDescription() != null ? propertyMD.getDescription() : ("Managed attribute " + propertyMD
+ .getName());
+
+ //
+ ModelMBeanAttributeInfo attributeInfo =
+ new ModelMBeanAttributeInfo(propertyMD.getName(), attributeDescription, getter, setter);
+
+ //
+ Descriptor attributeDescriptor = attributeInfo.getDescriptor();
+ if (getter != null)
+ {
+ attributeDescriptor.setField("getMethod", getter.getName());
+ }
+ if (setter != null)
+ {
+ attributeDescriptor.setField("setMethod", setter.getName());
+ }
+ attributeDescriptor.setField("currencyTimeLimit", "-1");
+ attributeDescriptor.setField("persistPolicy", "Never");
+ attributeInfo.setDescriptor(attributeDescriptor);
+
+ //
+ ModelMBeanAttributeInfo previous = attributeInfos.put(propertyMD.getName(), attributeInfo);
+ if (previous != null)
+ {
+ throw new IllegalArgumentException();
+ }
+ }
+ catch (IntrospectionException e)
+ {
+ throw new AssertionError(e);
+ }
+ }
+
+ //
+ return new ModelMBeanInfoSupport(typeMD.getType().getName(), mbeanDescription, attributeInfos.values().toArray(
+ new ModelMBeanAttributeInfo[attributeInfos.size()]), new ModelMBeanConstructorInfo[0], operations
+ .toArray(new ModelMBeanOperationInfo[operations.size()]), new ModelMBeanNotificationInfo[0]);
+ }
+}
Copied: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/ExoModelMBean.java (from rev 1226, kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/jmx/ExoModelMBean.java)
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/ExoModelMBean.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/ExoModelMBean.java 2009-12-29 10:16:00 UTC (rev 1228)
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2009 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.management.jmx.impl;
+
+import org.exoplatform.management.spi.ManagedResource;
+import org.exoplatform.management.ManagementAware;
+import org.exoplatform.management.jmx.annotations.NamingContext;
+
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanException;
+import javax.management.MBeanRegistration;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+import javax.management.ReflectionException;
+import javax.management.RuntimeOperationsException;
+import javax.management.modelmbean.InvalidTargetObjectTypeException;
+import javax.management.modelmbean.ModelMBeanInfo;
+import javax.management.modelmbean.RequiredModelMBean;
+
+/**
+ * A convenient subclass of {@link RequiredModelMBean) that routes the invocation of the interface
+ * {@link MBeanRegistration} to the managed resource when it implements the method.
+ *
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class ExoModelMBean extends RequiredModelMBean
+{
+
+ /** . */
+ private Object mr;
+
+ /** . */
+ private final ManagedResource context;
+
+ public ExoModelMBean(ManagedResource context, Object mr, ModelMBeanInfo mbi) throws MBeanException,
+ RuntimeOperationsException, InstanceNotFoundException, InvalidTargetObjectTypeException
+ {
+ super(mbi);
+
+ //
+ this.context = context;
+ this.mr = mr;
+
+ //
+ setManagedResource(mr, "ObjectReference");
+ }
+
+ @Override
+ public Object invoke(String opName, Object[] opArgs, String[] sig) throws MBeanException, ReflectionException
+ {
+ context.beforeInvoke(mr);
+ try
+ {
+ return super.invoke(opName, opArgs, sig);
+ }
+ finally
+ {
+ context.afterInvoke(mr);
+ }
+ }
+
+ @Override
+ public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception
+ {
+ name = super.preRegister(server, name);
+
+ //
+ if (mr instanceof MBeanRegistration)
+ {
+ ((MBeanRegistration)mr).preRegister(server, name);
+ }
+
+ //
+ return name;
+ }
+
+ @Override
+ public void postRegister(Boolean registrationDone)
+ {
+ super.postRegister(registrationDone);
+
+ //
+ PropertiesInfo info = PropertiesInfo.resolve(mr.getClass(), NamingContext.class);
+
+ //
+ MBeanScopingData scopingData = info != null ? info.resolve(mr) : new MBeanScopingData();
+
+ //
+ context.setScopingData(MBeanScopingData.class, scopingData);
+
+ //
+ if (mr instanceof MBeanRegistration)
+ {
+ ((MBeanRegistration)mr).postRegister(registrationDone);
+ }
+ }
+
+ @Override
+ public void preDeregister() throws Exception
+ {
+ if (mr instanceof MBeanRegistration)
+ {
+ ((MBeanRegistration)mr).preDeregister();
+ }
+
+ //
+ if (mr instanceof ManagementAware)
+ {
+ ((ManagementAware)mr).setContext(null);
+ }
+
+ //
+ super.preDeregister();
+ }
+
+ @Override
+ public void postDeregister()
+ {
+ if (mr instanceof MBeanRegistration)
+ {
+ ((MBeanRegistration)mr).postDeregister();
+ }
+
+ //
+ super.postDeregister();
+ }
+}
Copied: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/JMX.java (from rev 1218, kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/jmx/JMX.java)
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/JMX.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/JMX.java 2009-12-29 10:16:00 UTC (rev 1228)
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2009 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.management.jmx.impl;
+
+import java.util.Hashtable;
+import java.util.Map;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+/**
+ * Various JMX utilities.
+ *
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class JMX
+{
+
+ private JMX()
+ {
+ }
+
+ /**
+ * This method create an object name from a generic map argument. The main reason is that
+ * the method {@link javax.management.ObjectName#getInstance(String, java.util.Hashtable)} has
+ * uses a non generic Hashtable with Java 5 and use a Hashtable<String, String> constructor in Java 6.
+ *
+ * The suitable solution is therefore to use a non generic Hashtable but that creates compilation warning therefore
+ * we encapsulate there this code in order to use the warning supression in that single place.
+ *
+ * @see ObjectName#getInstance(String, java.util.Hashtable)
+ *
+ * @param domain The domain part of the object name.
+ * @param table A hash table containing one or more key
+ * properties. The key of each entry in the table is the key of a
+ * key property in the object name. The associated value in the
+ * table is the associated value in the object name.
+ *
+ * @return an ObjectName corresponding to the given domain and
+ * key mappings.
+ * @exception MalformedObjectNameException The <code>domain</code>
+ * contains an illegal character, or one of the keys or values in
+ * <code>table</code> contains an illegal character, or one of the
+ * values in <code>table</code> does not follow the rules for
+ * quoting.
+ * @exception NullPointerException One of the parameters is null.
+ */
+ @SuppressWarnings("unchecked")
+ public static ObjectName createObjectName(String domain, Map<String, String> table)
+ throws MalformedObjectNameException, NullPointerException
+ {
+ Hashtable tmp = new Hashtable(table);
+ return ObjectName.getInstance(domain, tmp);
+ }
+}
Copied: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/JMXManagementProvider.java (from rev 1226, kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/jmx/JMXManagementProvider.java)
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/JMXManagementProvider.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/JMXManagementProvider.java 2009-12-29 10:16:00 UTC (rev 1228)
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2009 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.management.jmx.impl;
+
+import org.exoplatform.management.spi.ManagedResource;
+import org.exoplatform.management.spi.ManagementProvider;
+import org.exoplatform.management.jmx.annotations.NameTemplate;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.MBeanServerFactory;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.modelmbean.ModelMBeanInfo;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class JMXManagementProvider implements ManagementProvider
+{
+
+ /** . */
+ private final MBeanServer server;
+
+ public JMXManagementProvider()
+ {
+ this(MBeanServerFactory.createMBeanServer());
+ }
+
+ public JMXManagementProvider(MBeanServer server)
+ {
+ this.server = server;
+ }
+
+ public Object manage(ManagedResource context)
+ {
+ ExoModelMBean mbean = null;
+ try
+ {
+ ExoMBeanInfoBuilder infoBuilder = new ExoMBeanInfoBuilder(context.getMetaData());
+ ModelMBeanInfo info = infoBuilder.build();
+ mbean = new ExoModelMBean(context, context.getResource(), info);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+
+ //
+ if (mbean != null)
+ {
+ ObjectName on = null;
+ PropertiesInfo oni = PropertiesInfo.resolve(context.getResource().getClass(), NameTemplate.class);
+ if (oni != null)
+ {
+ try
+ {
+ Map<String, String> foo = oni.resolve(context.getResource());
+ on = JMX.createObjectName("exo", foo);
+ }
+ catch (MalformedObjectNameException e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ if (on != null)
+ {
+ // Merge with the container hierarchy context
+ try
+ {
+ Map<String, String> props = new Hashtable<String, String>();
+
+ // Merge scoping properties
+ List<MBeanScopingData> list = context.getScopingData(MBeanScopingData.class);
+ for (MBeanScopingData scopingData : list)
+ {
+ props.putAll(scopingData);
+ }
+
+ // Julien : I know it's does not look great but it's necessary
+ // for compiling under Java 5 and Java 6 properly. The methods
+ // ObjectName#getKeyPropertyList() returns an Hashtable with Java 5
+ // and a Hashtable<String, String> with Java 6.
+ for (Object o : on.getKeyPropertyList().entrySet())
+ {
+ Map.Entry entry = (Map.Entry)o;
+ String key = (String)entry.getKey();
+ String value = (String)entry.getValue();
+ props.put(key, value);
+ }
+
+ //
+ on = JMX.createObjectName(on.getDomain(), props);
+
+ //
+ attemptToRegister(on, mbean);
+
+ //
+ return on;
+ }
+ catch (MalformedObjectNameException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ //
+ return null;
+ }
+
+ private void attemptToRegister(ObjectName name, Object mbean)
+ {
+ synchronized (server)
+ {
+ try
+ {
+ server.registerMBean(mbean, name);
+ }
+ catch (InstanceAlreadyExistsException e)
+ {
+ try
+ {
+
+ server.unregisterMBean(name);
+ server.registerMBean(mbean, name);
+
+ }
+ catch (Exception e1)
+ {
+ throw new RuntimeException("Failed to register MBean '" + name + " due to " + e.getMessage(), e);
+ }
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException("Failed to register MBean '" + name + " due to " + e.getMessage(), e);
+ }
+ }
+ }
+
+ public void unmanage(Object key)
+ {
+ ObjectName name = (ObjectName)key;
+ try
+ {
+ server.unregisterMBean(name);
+ }
+ catch (InstanceNotFoundException e)
+ {
+ e.printStackTrace();
+ }
+ catch (MBeanRegistrationException e)
+ {
+ e.printStackTrace();
+ }
+ }
+}
Copied: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/MBeanScopingData.java (from rev 1218, kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/jmx/MBeanScopingData.java)
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/MBeanScopingData.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/MBeanScopingData.java 2009-12-29 10:16:00 UTC (rev 1228)
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2009 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.management.jmx.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class MBeanScopingData extends HashMap<String, String>
+{
+ public MBeanScopingData(int initialCapacity, float loadFactor)
+ {
+ super(initialCapacity, loadFactor);
+ }
+
+ public MBeanScopingData(int initialCapacity)
+ {
+ super(initialCapacity);
+ }
+
+ public MBeanScopingData()
+ {
+ }
+
+ public MBeanScopingData(Map<? extends String, ? extends String> m)
+ {
+ super(m);
+ }
+}
Copied: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/ObjectNameBuilder.java (from rev 1218, kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/jmx/ObjectNameBuilder.java)
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/ObjectNameBuilder.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/ObjectNameBuilder.java 2009-12-29 10:16:00 UTC (rev 1228)
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2009 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.management.jmx.impl;
+
+import org.exoplatform.management.jmx.annotations.NameTemplate;
+
+import java.util.Map;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+/**
+ * A builder for object name templates.
+ *
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class ObjectNameBuilder<T>
+{
+
+ /** . */
+ private String domain;
+
+ /** . */
+ private Class<? extends T> clazz;
+
+ /**
+ * Create a new builder.
+ *
+ * @param clazz the class
+ * @throws IllegalArgumentException if the object is null
+ */
+ public ObjectNameBuilder(String domain, Class<? extends T> clazz) throws IllegalArgumentException
+ {
+ if (clazz == null)
+ {
+ throw new IllegalArgumentException("Clazz cannot be null");
+ }
+ this.domain = domain;
+ this.clazz = clazz;
+ }
+
+ /**
+ * Build the object name or return null if the class is not annotated by
+ * {@link NameTemplate}.
+ *
+ * @param object the object
+ * @return the built name
+ * @throws IllegalStateException raised by a build time issue
+ */
+ public ObjectName build(T object) throws IllegalStateException
+ {
+ PropertiesInfo info = PropertiesInfo.resolve(clazz, NameTemplate.class);
+
+ //
+ if (info != null)
+ {
+
+ try
+ {
+ Map<String, String> props = info.resolve(object);
+ return JMX.createObjectName(domain, props);
+ }
+ catch (MalformedObjectNameException e)
+ {
+ throw new IllegalArgumentException("ObjectName template is malformed", e);
+ }
+ }
+
+ //
+ return null;
+ }
+}
Copied: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/PropertiesInfo.java (from rev 1218, kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/jmx/PropertiesInfo.java)
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/PropertiesInfo.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/PropertiesInfo.java 2009-12-29 10:16:00 UTC (rev 1228)
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2009 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.management.jmx.impl;
+
+import org.exoplatform.commons.reflect.AnnotationIntrospector;
+import org.exoplatform.management.jmx.annotations.NameTemplate;
+import org.exoplatform.management.jmx.annotations.NamingContext;
+import org.exoplatform.management.jmx.annotations.Property;
+
+import java.lang.annotation.Annotation;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class PropertiesInfo
+{
+
+ /** . */
+ private Map<String, PropertyInfo> properties;
+
+ public PropertiesInfo(Map<String, PropertyInfo> properties)
+ {
+ this.properties = properties;
+ }
+
+ public static PropertiesInfo resolve(Class clazz, Class<? extends Annotation> annotationClass)
+ {
+ Annotation tpl2 = AnnotationIntrospector.resolveClassAnnotations(clazz, annotationClass);
+ Property[] blah = null;
+ if (tpl2 instanceof NamingContext)
+ {
+ blah = ((NamingContext)tpl2).value();
+ }
+ else if (tpl2 instanceof NameTemplate)
+ {
+ blah = ((NameTemplate)tpl2).value();
+ }
+ if (blah != null)
+ {
+ Map<String, PropertyInfo> properties = new HashMap<String, PropertyInfo>();
+ for (Property property : blah)
+ {
+ PropertyInfo propertyInfo = new PropertyInfo(clazz, property);
+ properties.put(propertyInfo.getKey(), propertyInfo);
+ }
+ return new PropertiesInfo(properties);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public Collection<PropertyInfo> getProperties()
+ {
+ return properties.values();
+ }
+
+ public MBeanScopingData resolve(Object instance)
+ {
+ MBeanScopingData props = new MBeanScopingData();
+ for (PropertyInfo propertyInfo : properties.values())
+ {
+ String key = propertyInfo.getKey();
+ String value = propertyInfo.resolveValue(instance);
+ props.put(key, value);
+ }
+ return props;
+ }
+}
Copied: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/PropertyInfo.java (from rev 1218, kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/jmx/PropertyInfo.java)
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/PropertyInfo.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/PropertyInfo.java 2009-12-29 10:16:00 UTC (rev 1228)
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2009 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.management.jmx.impl;
+
+import org.exoplatform.management.jmx.annotations.Property;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
+import javax.management.ObjectName;
+
+/**
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class PropertyInfo
+{
+
+ /** . */
+ private final String key;
+
+ /** . */
+ private final Value value;
+
+ public PropertyInfo(Class clazz, Property def)
+ {
+ String tmp = def.value();
+ Value value;
+ int length = tmp.length();
+ if (length > 2 && tmp.charAt(0) == '{' && tmp.charAt(length - 1) == '}')
+ {
+ String s = tmp.substring(1, length - 1);
+ String getterName = "get" + s;
+ Method getter;
+ try
+ {
+ getter = clazz.getMethod(getterName);
+ }
+ catch (NoSuchMethodException e)
+ {
+ throw new IllegalArgumentException("Getter parameter for property " + s + " on class " + clazz.getName()
+ + " does not exist", e);
+ }
+
+ //
+ if (getter.getReturnType() == void.class)
+ {
+ throw new IllegalArgumentException("Getter return type for property " + s + " on class " + clazz.getName()
+ + " cannot be void");
+ }
+ if (getter.getParameterTypes().length > 0)
+ {
+ throw new IllegalArgumentException("Getter parameter type for property " + s + " on class "
+ + clazz.getName() + " is not empty");
+ }
+ if (Modifier.isStatic(getter.getModifiers()))
+ {
+ throw new IllegalArgumentException("Getter for property " + s + " on class " + clazz.getName()
+ + " is static");
+ }
+
+ //
+ value = new DynamicValue(getter);
+ }
+ else
+ {
+ value = new LitteralValue(tmp);
+ }
+
+ //
+ this.key = def.key();
+ this.value = value;
+ }
+
+ public String resolveValue(Object instance)
+ {
+ return value.resolve(instance);
+ }
+
+ public String getKey()
+ {
+ return key;
+ }
+
+ private abstract static class Value
+ {
+ abstract String resolve(Object instance);
+ }
+
+ private class DynamicValue extends Value
+ {
+
+ /** . */
+ private final Method getter;
+
+ private DynamicValue(Method getter)
+ {
+ this.getter = getter;
+ }
+
+ String resolve(Object instance)
+ {
+ Object value;
+ try
+ {
+ value = getter.invoke(instance);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new IllegalArgumentException("Getter for property " + key + " on class "
+ + getter.getClass().getName() + " cannot be invoked", e);
+ }
+ catch (InvocationTargetException e)
+ {
+ throw new IllegalArgumentException("Getter for property " + key + " on class "
+ + getter.getClass().getName() + " threw an exception during invocation", e);
+ }
+ if (value == null)
+ {
+ throw new IllegalArgumentException("Getter for property " + key + " on class "
+ + getter.getClass().getName() + " returned a null value");
+ }
+ return ObjectName.quote(value.toString());
+ }
+ }
+
+ private static class LitteralValue extends Value
+ {
+
+ /** . */
+ private final String litteral;
+
+ private LitteralValue(String litteral)
+ {
+ this.litteral = litteral;
+ }
+
+ String resolve(Object instance)
+ {
+ return litteral;
+ }
+ }
+
+}
Added: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/package-info.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/package-info.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/jmx/impl/package-info.java 2009-12-29 10:16:00 UTC (rev 1228)
@@ -0,0 +1,4 @@
+/**
+ * The implementation of the management SPI (@link org.exoplatform.management.spi} for the JMX management system.
+ */
+package org.exoplatform.management.jmx.impl;
\ No newline at end of file
Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedResource.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedResource.java 2009-12-29 09:58:06 UTC (rev 1227)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedResource.java 2009-12-29 10:16:00 UTC (rev 1228)
@@ -23,7 +23,9 @@
import java.util.List;
/**
- * The contract between a management provider and the kernel.
+ * The managed resource provided by the kernel to a management provider. It gives access
+ * to the resource itself, the meta data of the managed resource, the attached scoped data
+ * and the before/after invoke contract when a resource is invoked from the management layer.
*
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
@@ -57,7 +59,7 @@
<S> List<S> getScopingData(Class<S> scopeType);
/**
- * Callback made by the provie to the resource to signal that scopgin data is used for the managed resource.
+ * Callback made by the provider to the resource to signal that scoping data that is used for the managed resource.
*
* @param scopeType the scope type
* @param <S> the generic type of the scope type
Added: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/package-info.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/package-info.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/package-info.java 2009-12-29 10:16:00 UTC (rev 1228)
@@ -0,0 +1,11 @@
+/**
+ * <p>The Service Provider Interface for the eXo management framework. The entry point for plugged management system
+ * is the implementation of the interface {@link org.exoplatform.management.spi.ManagementProvider}.</p>
+ *
+ * <p>A part of the package defines the meta data that is given to the provider to build the management interface
+ * of the managed resource.</p>
+ *
+ * <p>The {@link org.exoplatform.management.spi.ManagedResource} interface wraps a resource and is provided by the
+ * kernel to the provider.</p>
+ */
+package org.exoplatform.management.spi;
\ No newline at end of file
Modified: kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/AbstractTestExoMBean.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/AbstractTestExoMBean.java 2009-12-29 09:58:06 UTC (rev 1227)
+++ kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/AbstractTestExoMBean.java 2009-12-29 10:16:00 UTC (rev 1228)
@@ -19,7 +19,7 @@
package org.exoplatform.container.jmx;
import junit.framework.TestCase;
-import org.exoplatform.management.spi.jmx.ExoMBeanInfoBuilder;
+import org.exoplatform.management.jmx.impl.ExoMBeanInfoBuilder;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
Modified: kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestNameTemplate.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestNameTemplate.java 2009-12-29 09:58:06 UTC (rev 1227)
+++ kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestNameTemplate.java 2009-12-29 10:16:00 UTC (rev 1228)
@@ -22,7 +22,7 @@
import org.exoplatform.management.jmx.annotations.NameTemplate;
import org.exoplatform.management.jmx.annotations.Property;
-import org.exoplatform.management.spi.jmx.ObjectNameBuilder;
+import org.exoplatform.management.jmx.impl.ObjectNameBuilder;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
16 years, 4 months
exo-jcr SVN: r1227 - in kernel/trunk/exo.kernel.container/src: main/java/org/exoplatform/container/jmx and 2 other directories.
by do-not-reply@jboss.org
Author: julien_viet
Date: 2009-12-29 04:58:06 -0500 (Tue, 29 Dec 2009)
New Revision: 1227
Added:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/KernelManagementContext.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapter.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapterFactory.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManagementContextImpl.java
Removed:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/KernelManagementContext.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapter.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapterFactory.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableContainer.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManagementContextImpl.java
Modified:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ExoContainer.java
kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestPortalContainerManagedIntegration.java
Log:
EXOJCR-350 : Enable plugability of management layer : move the management code in the management package
M trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestPortalContainerManagedIntegration.java
D trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableContainer.java
D trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapter.java
D trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/KernelManagementContext.java
D trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManagementContextImpl.java
D trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapterFactory.java
A trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java
A trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapter.java
A trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/KernelManagementContext.java
A trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManagementContextImpl.java
A trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapterFactory.java
M trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ExoContainer.java
Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ExoContainer.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ExoContainer.java 2009-12-29 09:52:07 UTC (rev 1226)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ExoContainer.java 2009-12-29 09:58:06 UTC (rev 1227)
@@ -21,7 +21,7 @@
import org.exoplatform.commons.utils.PropertyManager;
import org.exoplatform.container.component.ComponentLifecyclePlugin;
import org.exoplatform.container.configuration.ConfigurationManager;
-import org.exoplatform.container.jmx.ManageableContainer;
+import org.exoplatform.container.management.ManageableContainer;
import org.exoplatform.container.util.ContainerUtil;
import org.exoplatform.container.xml.InitParams;
import org.exoplatform.services.log.ExoLogger;
Deleted: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/KernelManagementContext.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/KernelManagementContext.java 2009-12-29 09:52:07 UTC (rev 1226)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/KernelManagementContext.java 2009-12-29 09:58:06 UTC (rev 1227)
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2009 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.container.jmx;
-
-import org.exoplatform.management.spi.ManagementProvider;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class KernelManagementContext
-{
-
- /** . */
- final ManagementContextImpl root;
-
- /** . */
- private final Set<ManagementProvider> providers;
-
- /** . */
- private final ManageableContainer container;
-
- public KernelManagementContext(ManageableContainer container)
- {
- this.providers = new HashSet<ManagementProvider>();
- this.container = container;
-
- // Done last as we pass 'this' as argument
- this.root = new ManagementContextImpl(this, container);
- }
-
- public synchronized Collection<ManagementProvider> getProviders() {
- return providers;
- }
-
- public synchronized boolean addProvider(ManagementProvider provider)
- {
- // Prevent double registration just in case...
- if (providers.contains(provider)) {
- return false;
- }
-
- //
- providers.add(provider);
-
- // Perform registration of already registered managed components
- root.install(provider);
-
- //
- return false;
- }
-}
Deleted: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapter.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapter.java 2009-12-29 09:52:07 UTC (rev 1226)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapter.java 2009-12-29 09:58:06 UTC (rev 1227)
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2009 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.container.jmx;
-
-import org.exoplatform.management.spi.ManagementProvider;
-import org.exoplatform.services.log.ExoLogger;
-import org.exoplatform.services.log.Log;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.PicoContainer;
-import org.picocontainer.PicoInitializationException;
-import org.picocontainer.PicoIntrospectionException;
-import org.picocontainer.PicoVisitor;
-
-/**
- * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class ManageableComponentAdapter implements ComponentAdapter
-{
-
- /** . */
- private Log log = ExoLogger.getLogger(ManageableComponentAdapter.class);
-
- /** . */
- private ComponentAdapter delegate;
-
- /** . */
- private final ManageableContainer container;
-
- /** . */
- private volatile boolean registered = false;
-
- public ManageableComponentAdapter(ManageableContainer container, ComponentAdapter delegate)
- {
- this.delegate = delegate;
- this.container = container;
- }
-
- public Object getComponentKey()
- {
- return delegate.getComponentKey();
- }
-
- public Class getComponentImplementation()
- {
- return delegate.getComponentImplementation();
- }
-
- public Object getComponentInstance(PicoContainer pico) throws PicoInitializationException,
- PicoIntrospectionException
- {
- Object instance = delegate.getComponentInstance(pico);
-
- //
- if (!registered)
- {
- registered = true;
-
- //
- if (container.managementContext != null)
- {
- // Registry the instance against the management context
- log.debug("==> add " + instance + " to a mbean server");
- container.managementContext.register(instance);
-
- // Register if it is a management provider
- if (instance instanceof ManagementProvider)
- {
- ManagementProvider provider = (ManagementProvider)instance;
- container.managementContext.kernelContext.addProvider(provider);
- }
- }
- }
- return instance;
- }
-
- public void verify(PicoContainer container) throws PicoIntrospectionException
- {
- delegate.verify(container);
- }
-
- public void accept(PicoVisitor visitor)
- {
- delegate.accept(visitor);
- }
-}
Deleted: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapterFactory.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapterFactory.java 2009-12-29 09:52:07 UTC (rev 1226)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapterFactory.java 2009-12-29 09:58:06 UTC (rev 1227)
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2009 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.container.jmx;
-
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.Parameter;
-import org.picocontainer.PicoIntrospectionException;
-import org.picocontainer.defaults.AssignabilityRegistrationException;
-import org.picocontainer.defaults.ComponentAdapterFactory;
-import org.picocontainer.defaults.NotConcreteRegistrationException;
-
-/**
- * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class ManageableComponentAdapterFactory implements ComponentAdapterFactory
-{
-
- /** . */
- private ComponentAdapterFactory delegate;
-
- /** . */
- ManageableContainer container;
-
- public ManageableComponentAdapterFactory(ComponentAdapterFactory delegate)
- {
- this.delegate = delegate;
- }
-
- public ComponentAdapter createComponentAdapter(Object componentKey, Class componentImplementation,
- Parameter[] parameters) throws PicoIntrospectionException, AssignabilityRegistrationException,
- NotConcreteRegistrationException
- {
- ComponentAdapter adapter = delegate.createComponentAdapter(componentKey, componentImplementation, parameters);
- return new ManageableComponentAdapter(container, adapter);
- }
-}
Deleted: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableContainer.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableContainer.java 2009-12-29 09:52:07 UTC (rev 1226)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableContainer.java 2009-12-29 09:58:06 UTC (rev 1227)
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2009 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.container.jmx;
-
-import org.exoplatform.container.CachingContainer;
-import org.exoplatform.container.monitor.jvm.J2EEServerInfo;
-import org.exoplatform.management.ManagementContext;
-import org.exoplatform.management.annotations.Managed;
-import org.exoplatform.management.annotations.ManagedDescription;
-import org.exoplatform.management.annotations.ManagedName;
-import org.exoplatform.management.spi.ManagementProvider;
-import org.exoplatform.management.spi.jmx.JMXManagementProvider;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.PicoContainer;
-import org.picocontainer.PicoException;
-import org.picocontainer.PicoRegistrationException;
-import org.picocontainer.defaults.ComponentAdapterFactory;
-import org.picocontainer.defaults.DuplicateComponentKeyRegistrationException;
-
-import java.lang.management.ManagementFactory;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.management.MBeanServer;
-
-/**
- * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class ManageableContainer extends CachingContainer
-{
-
- private static MBeanServer findMBeanServer()
- {
- J2EEServerInfo serverenv_ = new J2EEServerInfo();
- MBeanServer server = serverenv_.getMBeanServer();
- if (server == null)
- {
- server = ManagementFactory.getPlatformMBeanServer();
- }
- return server;
- }
-
- /** . */
- private static final ThreadLocal<ManageableComponentAdapterFactory> hack =
- new ThreadLocal<ManageableComponentAdapterFactory>();
-
- /** . */
- protected ManagementContextImpl managementContext;
-
- /** . */
- protected MBeanServer server;
-
- public ManageableContainer()
- {
- this((PicoContainer)null);
- }
-
- public ManageableContainer(PicoContainer parent)
- {
- this(new MX4JComponentAdapterFactory(), parent);
- }
-
- public ManageableContainer(ComponentAdapterFactory componentAdapterFactory, PicoContainer parent)
- {
- super(getComponentAdapterFactory(componentAdapterFactory), parent);
-
- // Yeah this is not pretty but a necessary evil to make it work
- ManageableComponentAdapterFactory factory = hack.get();
- factory.container = this;
- hack.set(null);
-
- // Reference the same mbean server that the parent has
- if (parent instanceof ManageableContainer)
- {
- ManageableContainer manageableParent = (ManageableContainer)parent;
-
- //
- ManagementContextImpl parentManagementContext = manageableParent.managementContext;
- if (parentManagementContext != null)
- {
- managementContext = new ManagementContextImpl(parentManagementContext, this);
- }
-
- // Get server from parent
- server = manageableParent.server;
- } else {
- KernelManagementContext kernelCtx = new KernelManagementContext(this);
-
- //
- server = findMBeanServer();
- managementContext = kernelCtx.root;
-
- //
- kernelCtx.addProvider(new JMXManagementProvider(server));
- }
- }
-
- public ManageableContainer(ComponentAdapterFactory componentAdapterFactory)
- {
- this(componentAdapterFactory, null);
- }
-
- @Managed
- @ManagedName("RegisteredComponentNames")
- @ManagedDescription("Return the list of the registered component names")
- public Set<String> getRegisteredComponentNames() throws PicoException
- {
- Set<String> names = new HashSet<String>();
- Collection<ComponentAdapter> adapters = getComponentAdapters();
- for (ComponentAdapter adapter : adapters)
- {
- Object key = adapter.getComponentKey();
- String name = String.valueOf(key);
- names.add(name);
- }
- return names;
- }
-
- private static ManageableComponentAdapterFactory getComponentAdapterFactory(
- ComponentAdapterFactory componentAdapterFactory)
- {
- ManageableComponentAdapterFactory factory = new ManageableComponentAdapterFactory(componentAdapterFactory);
- hack.set(factory);
- return factory;
- }
-
- public ManagementContext getManagementContext()
- {
- return managementContext;
- }
-
- public final MBeanServer getMBeanServer()
- {
- return server;
- }
-
- @Override
- public ComponentAdapter registerComponent(ComponentAdapter componentAdapter)
- throws DuplicateComponentKeyRegistrationException
- {
- return super.registerComponent(componentAdapter);
- }
-
- public ComponentAdapter registerComponentInstance(Object componentKey, Object componentInstance)
- throws PicoRegistrationException
- {
- ComponentAdapter adapter = super.registerComponentInstance(componentKey, componentInstance);
- if (managementContext != null)
- {
- managementContext.register(componentInstance);
-
- // Register if it is a management provider
- if (componentInstance instanceof ManagementProvider)
- {
- ManagementProvider provider = (ManagementProvider)componentInstance;
- managementContext.kernelContext.addProvider(provider);
- }
- }
- return adapter;
- }
-}
Deleted: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManagementContextImpl.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManagementContextImpl.java 2009-12-29 09:52:07 UTC (rev 1226)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManagementContextImpl.java 2009-12-29 09:58:06 UTC (rev 1227)
@@ -1,328 +0,0 @@
-/*
- * Copyright (C) 2009 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.container.jmx;
-
-import org.exoplatform.container.ExoContainer;
-import org.exoplatform.container.component.RequestLifeCycle;
-import org.exoplatform.management.ManagementAware;
-import org.exoplatform.management.spi.ManagedResource;
-import org.exoplatform.management.spi.ManagedTypeMetaData;
-import org.exoplatform.container.management.MetaDataBuilder;
-import org.exoplatform.management.spi.ManagementProvider;
-import org.exoplatform.management.ManagementContext;
-import org.exoplatform.management.annotations.ManagedBy;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public class ManagementContextImpl implements ManagementContext, ManagedResource
-{
-
- /** . */
- private final Map<Class<?>, Object> scopingDataList;
-
- /** The registrations done by this mbean. */
- private final Map<Object, ManagementContextImpl> registrations;
-
- /** . */
- final Map<ManagementProvider, Object> bilto;
-
- /** . */
- private final ManagementContextImpl parent;
-
- /** . */
- final KernelManagementContext kernelContext;
-
- /** . */
- private final Object resource;
-
- /** . */
- private final ManagedTypeMetaData typeMD;
-
- /** An optional container setup when the management context is attached to a container. */
- private final ManageableContainer container;
-
- public ManagementContextImpl(KernelManagementContext kernelContext, ManageableContainer container)
- {
- if (kernelContext == null)
- {
- throw new NullPointerException();
- }
- if (container == null)
- {
- throw new NullPointerException();
- }
-
- //
- Object resource = null;
- ManagedTypeMetaData typeMD = null;
- MetaDataBuilder builder = new MetaDataBuilder(container.getClass());
- if (builder.isBuildable())
- {
- resource = container;
- typeMD = builder.build();
- }
-
- //
- this.bilto = new HashMap<ManagementProvider, Object>();
- this.registrations = new HashMap<Object, ManagementContextImpl>();
- this.parent = null;
- this.scopingDataList = new HashMap<Class<?>, Object>();
- this.kernelContext = kernelContext;
- this.resource = resource;
- this.typeMD = typeMD;
- this.container = container;
- }
-
- public ManagementContextImpl(ManagementContextImpl parent, ManageableContainer container)
- {
- if (parent == null)
- {
- throw new NullPointerException();
- }
- if (container == null)
- {
- throw new NullPointerException();
- }
-
- //
- Object resource = null;
- ManagedTypeMetaData typeMD = null;
- MetaDataBuilder builder = new MetaDataBuilder(container.getClass());
- if (builder.isBuildable())
- {
- resource = container;
- typeMD = builder.build();
- }
-
- //
- this.bilto = new HashMap<ManagementProvider, Object>();
- this.registrations = new HashMap<Object, ManagementContextImpl>();
- this.parent = parent;
- this.scopingDataList = new HashMap<Class<?>, Object>();
- this.kernelContext = parent.kernelContext;
- this.resource = resource;
- this.typeMD = typeMD;
- this.container = container;
- }
-
- public ManagementContextImpl(ManagementContextImpl parent, Object resource, ManagedTypeMetaData typeMD)
- {
- if (parent == null)
- {
- throw new NullPointerException();
- }
- if ((resource != null && typeMD == null) && (resource == null && typeMD != null))
- {
- throw new IllegalArgumentException("Can't have resource null and meta data not null or the converse");
- }
-
- //
- this.bilto = new HashMap<ManagementProvider, Object>();
- this.registrations = new HashMap<Object, ManagementContextImpl>();
- this.parent = parent;
- this.scopingDataList = new HashMap<Class<?>, Object>();
- this.kernelContext = parent.kernelContext;
- this.resource = resource;
- this.typeMD = typeMD;
- this.container = null;
- }
-
- public ManagementContext getParent()
- {
- return parent;
- }
-
- public <S> void setScopingData(Class<S> scopeType, S scopingData)
- {
- this.scopingDataList.put(scopeType, scopingData);
- }
-
- public void register(Object o)
- {
- Object resource = null;
-
- // Apply managed by annotation
- ManagedBy managedBy = o.getClass().getAnnotation(ManagedBy.class);
- if (managedBy != null)
- {
- try
- {
- Class managedByClass = managedBy.value();
- Constructor<?> blah = managedByClass.getConstructor(o.getClass());
- resource = blah.newInstance(o);
- }
- catch (NoSuchMethodException e)
- {
- e.printStackTrace();
- }
- catch (InstantiationException e)
- {
- e.printStackTrace();
- }
- catch (IllegalAccessException e)
- {
- e.printStackTrace();
- }
- catch (InvocationTargetException e)
- {
- e.printStackTrace();
- }
- }
- else
- {
- resource = o;
- }
-
- //
- if (resource != null) {
-
- MetaDataBuilder builder = new MetaDataBuilder(resource.getClass());
- if (builder.isBuildable()) {
- ManagedTypeMetaData metaData = builder.build();
-
- //
- ManagementContextImpl managementContext;
- if (resource instanceof ManageableContainer)
- {
- managementContext = ((ManageableContainer)resource).managementContext;
- }
- else
- {
- managementContext = new ManagementContextImpl(this, resource, metaData);
- }
-
- //
- registrations.put(resource, managementContext);
-
- //
- for (ManagementProvider provider : kernelContext.getProviders())
- {
- Object name = provider.manage(managementContext);
- if (name != null)
- {
- managementContext.bilto.put(provider, name);
- }
- }
-
- // Allow for more resource management
- if (resource instanceof ManagementAware)
- {
- ((ManagementAware)resource).setContext(managementContext);
- }
- }
- }
- }
-
- public void unregister(Object o)
- {
- ManagementContextImpl context = registrations.remove(o);
- if (context != null)
- {
- for (Map.Entry<ManagementProvider, Object> entry : context.bilto.entrySet()) {
- entry.getKey().unmanage(entry.getValue());
- }
- }
- }
-
- public <S> List<S> getScopingData(Class<S> scopeType)
- {
- ArrayList<S> list = new ArrayList<S>();
- for (ManagementContextImpl current = this; current != null; current = current.parent)
- {
- Object scopedData = current.scopingDataList.get(scopeType);
- if (scopedData != null)
- {
- // It must be that type since we put it
- list.add((S)scopedData);
- }
- }
- return list;
- }
-
- public ExoContainer findContainer()
- {
- for (ManagementContextImpl current = this;true;current = current.parent)
- {
- if (current.container instanceof ExoContainer)
- {
- return (ExoContainer)current.container;
- }
- else if (current.parent == null)
- {
- return null;
- }
- }
- }
-
- public void beforeInvoke(Object managedResource)
- {
- ExoContainer container = findContainer();
- if (container != null)
- {
- RequestLifeCycle.begin(container);
- }
- }
-
- public void afterInvoke(Object managedResource)
- {
- RequestLifeCycle.end();
- }
-
- @Override
- public String toString()
- {
- return "ManagementContextImpl[container=" + container + "]";
- }
-
- public Object getResource()
- {
- return resource;
- }
-
- public ManagedTypeMetaData getMetaData()
- {
- return typeMD;
- }
-
- void install(ManagementProvider provider) {
- if (resource != null&& typeMD != null)
- {
- Object name = provider.manage(this);
- if (name != null)
- {
- bilto.put(provider, name);
- }
- }
-
- // Install for all
- for (ManagementContextImpl registration : registrations.values())
- {
- registration.install(provider);
- }
- }
-}
Copied: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/KernelManagementContext.java (from rev 1226, kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/KernelManagementContext.java)
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/KernelManagementContext.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/KernelManagementContext.java 2009-12-29 09:58:06 UTC (rev 1227)
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2009 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.container.management;
+
+import org.exoplatform.management.spi.ManagementProvider;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class KernelManagementContext
+{
+
+ /** . */
+ final ManagementContextImpl root;
+
+ /** . */
+ private final Set<ManagementProvider> providers;
+
+ /** . */
+ private final ManageableContainer container;
+
+ public KernelManagementContext(ManageableContainer container)
+ {
+ this.providers = new HashSet<ManagementProvider>();
+ this.container = container;
+
+ // Done last as we pass 'this' as argument
+ this.root = new ManagementContextImpl(this, container);
+ }
+
+ public synchronized Collection<ManagementProvider> getProviders() {
+ return providers;
+ }
+
+ public synchronized boolean addProvider(ManagementProvider provider)
+ {
+ // Prevent double registration just in case...
+ if (providers.contains(provider)) {
+ return false;
+ }
+
+ //
+ providers.add(provider);
+
+ // Perform registration of already registered managed components
+ root.install(provider);
+
+ //
+ return false;
+ }
+}
Copied: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapter.java (from rev 1223, kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapter.java)
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapter.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapter.java 2009-12-29 09:58:06 UTC (rev 1227)
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2009 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.container.management;
+
+import org.exoplatform.management.spi.ManagementProvider;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.picocontainer.ComponentAdapter;
+import org.picocontainer.PicoContainer;
+import org.picocontainer.PicoInitializationException;
+import org.picocontainer.PicoIntrospectionException;
+import org.picocontainer.PicoVisitor;
+
+/**
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class ManageableComponentAdapter implements ComponentAdapter
+{
+
+ /** . */
+ private Log log = ExoLogger.getLogger(ManageableComponentAdapter.class);
+
+ /** . */
+ private ComponentAdapter delegate;
+
+ /** . */
+ private final ManageableContainer container;
+
+ /** . */
+ private volatile boolean registered = false;
+
+ public ManageableComponentAdapter(ManageableContainer container, ComponentAdapter delegate)
+ {
+ this.delegate = delegate;
+ this.container = container;
+ }
+
+ public Object getComponentKey()
+ {
+ return delegate.getComponentKey();
+ }
+
+ public Class getComponentImplementation()
+ {
+ return delegate.getComponentImplementation();
+ }
+
+ public Object getComponentInstance(PicoContainer pico) throws PicoInitializationException,
+ PicoIntrospectionException
+ {
+ Object instance = delegate.getComponentInstance(pico);
+
+ //
+ if (!registered)
+ {
+ registered = true;
+
+ //
+ if (container.managementContext != null)
+ {
+ // Registry the instance against the management context
+ log.debug("==> add " + instance + " to a mbean server");
+ container.managementContext.register(instance);
+
+ // Register if it is a management provider
+ if (instance instanceof ManagementProvider)
+ {
+ ManagementProvider provider = (ManagementProvider)instance;
+ container.managementContext.kernelContext.addProvider(provider);
+ }
+ }
+ }
+ return instance;
+ }
+
+ public void verify(PicoContainer container) throws PicoIntrospectionException
+ {
+ delegate.verify(container);
+ }
+
+ public void accept(PicoVisitor visitor)
+ {
+ delegate.accept(visitor);
+ }
+}
Copied: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapterFactory.java (from rev 1209, kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapterFactory.java)
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapterFactory.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapterFactory.java 2009-12-29 09:58:06 UTC (rev 1227)
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2009 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.container.management;
+
+import org.picocontainer.ComponentAdapter;
+import org.picocontainer.Parameter;
+import org.picocontainer.PicoIntrospectionException;
+import org.picocontainer.defaults.AssignabilityRegistrationException;
+import org.picocontainer.defaults.ComponentAdapterFactory;
+import org.picocontainer.defaults.NotConcreteRegistrationException;
+
+/**
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class ManageableComponentAdapterFactory implements ComponentAdapterFactory
+{
+
+ /** . */
+ private ComponentAdapterFactory delegate;
+
+ /** . */
+ ManageableContainer container;
+
+ public ManageableComponentAdapterFactory(ComponentAdapterFactory delegate)
+ {
+ this.delegate = delegate;
+ }
+
+ public ComponentAdapter createComponentAdapter(Object componentKey, Class componentImplementation,
+ Parameter[] parameters) throws PicoIntrospectionException, AssignabilityRegistrationException,
+ NotConcreteRegistrationException
+ {
+ ComponentAdapter adapter = delegate.createComponentAdapter(componentKey, componentImplementation, parameters);
+ return new ManageableComponentAdapter(container, adapter);
+ }
+}
Copied: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java (from rev 1226, kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableContainer.java)
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java 2009-12-29 09:58:06 UTC (rev 1227)
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2009 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.container.management;
+
+import org.exoplatform.container.CachingContainer;
+import org.exoplatform.container.jmx.MX4JComponentAdapterFactory;
+import org.exoplatform.container.monitor.jvm.J2EEServerInfo;
+import org.exoplatform.management.ManagementContext;
+import org.exoplatform.management.annotations.Managed;
+import org.exoplatform.management.annotations.ManagedDescription;
+import org.exoplatform.management.annotations.ManagedName;
+import org.exoplatform.management.spi.ManagementProvider;
+import org.exoplatform.management.spi.jmx.JMXManagementProvider;
+import org.picocontainer.ComponentAdapter;
+import org.picocontainer.PicoContainer;
+import org.picocontainer.PicoException;
+import org.picocontainer.PicoRegistrationException;
+import org.picocontainer.defaults.ComponentAdapterFactory;
+import org.picocontainer.defaults.DuplicateComponentKeyRegistrationException;
+
+import java.lang.management.ManagementFactory;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.management.MBeanServer;
+
+/**
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class ManageableContainer extends CachingContainer
+{
+
+ private static MBeanServer findMBeanServer()
+ {
+ J2EEServerInfo serverenv_ = new J2EEServerInfo();
+ MBeanServer server = serverenv_.getMBeanServer();
+ if (server == null)
+ {
+ server = ManagementFactory.getPlatformMBeanServer();
+ }
+ return server;
+ }
+
+ /** . */
+ private static final ThreadLocal<ManageableComponentAdapterFactory> hack =
+ new ThreadLocal<ManageableComponentAdapterFactory>();
+
+ /** . */
+ protected ManagementContextImpl managementContext;
+
+ /** . */
+ protected MBeanServer server;
+
+ public ManageableContainer()
+ {
+ this((PicoContainer)null);
+ }
+
+ public ManageableContainer(PicoContainer parent)
+ {
+ this(new MX4JComponentAdapterFactory(), parent);
+ }
+
+ public ManageableContainer(ComponentAdapterFactory componentAdapterFactory, PicoContainer parent)
+ {
+ super(getComponentAdapterFactory(componentAdapterFactory), parent);
+
+ // Yeah this is not pretty but a necessary evil to make it work
+ ManageableComponentAdapterFactory factory = hack.get();
+ factory.container = this;
+ hack.set(null);
+
+ // Reference the same mbean server that the parent has
+ if (parent instanceof ManageableContainer)
+ {
+ ManageableContainer manageableParent = (ManageableContainer)parent;
+
+ //
+ ManagementContextImpl parentManagementContext = manageableParent.managementContext;
+ if (parentManagementContext != null)
+ {
+ managementContext = new ManagementContextImpl(parentManagementContext, this);
+ }
+
+ // Get server from parent
+ server = manageableParent.server;
+ } else {
+ KernelManagementContext kernelCtx = new KernelManagementContext(this);
+
+ //
+ server = findMBeanServer();
+ managementContext = kernelCtx.root;
+
+ //
+ kernelCtx.addProvider(new JMXManagementProvider(server));
+ }
+ }
+
+ public ManageableContainer(ComponentAdapterFactory componentAdapterFactory)
+ {
+ this(componentAdapterFactory, null);
+ }
+
+ @Managed
+ @ManagedName("RegisteredComponentNames")
+ @ManagedDescription("Return the list of the registered component names")
+ public Set<String> getRegisteredComponentNames() throws PicoException
+ {
+ Set<String> names = new HashSet<String>();
+ Collection<ComponentAdapter> adapters = getComponentAdapters();
+ for (ComponentAdapter adapter : adapters)
+ {
+ Object key = adapter.getComponentKey();
+ String name = String.valueOf(key);
+ names.add(name);
+ }
+ return names;
+ }
+
+ private static ManageableComponentAdapterFactory getComponentAdapterFactory(
+ ComponentAdapterFactory componentAdapterFactory)
+ {
+ ManageableComponentAdapterFactory factory = new ManageableComponentAdapterFactory(componentAdapterFactory);
+ hack.set(factory);
+ return factory;
+ }
+
+ public ManagementContext getManagementContext()
+ {
+ return managementContext;
+ }
+
+ public final MBeanServer getMBeanServer()
+ {
+ return server;
+ }
+
+ @Override
+ public ComponentAdapter registerComponent(ComponentAdapter componentAdapter)
+ throws DuplicateComponentKeyRegistrationException
+ {
+ return super.registerComponent(componentAdapter);
+ }
+
+ public ComponentAdapter registerComponentInstance(Object componentKey, Object componentInstance)
+ throws PicoRegistrationException
+ {
+ ComponentAdapter adapter = super.registerComponentInstance(componentKey, componentInstance);
+ if (managementContext != null)
+ {
+ managementContext.register(componentInstance);
+
+ // Register if it is a management provider
+ if (componentInstance instanceof ManagementProvider)
+ {
+ ManagementProvider provider = (ManagementProvider)componentInstance;
+ managementContext.kernelContext.addProvider(provider);
+ }
+ }
+ return adapter;
+ }
+}
Copied: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManagementContextImpl.java (from rev 1226, kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManagementContextImpl.java)
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManagementContextImpl.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManagementContextImpl.java 2009-12-29 09:58:06 UTC (rev 1227)
@@ -0,0 +1,328 @@
+/*
+ * Copyright (C) 2009 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.container.management;
+
+import org.exoplatform.container.ExoContainer;
+import org.exoplatform.container.component.RequestLifeCycle;
+import org.exoplatform.management.ManagementAware;
+import org.exoplatform.management.spi.ManagedResource;
+import org.exoplatform.management.spi.ManagedTypeMetaData;
+import org.exoplatform.container.management.MetaDataBuilder;
+import org.exoplatform.management.spi.ManagementProvider;
+import org.exoplatform.management.ManagementContext;
+import org.exoplatform.management.annotations.ManagedBy;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public class ManagementContextImpl implements ManagementContext, ManagedResource
+{
+
+ /** . */
+ private final Map<Class<?>, Object> scopingDataList;
+
+ /** The registrations done by this mbean. */
+ private final Map<Object, ManagementContextImpl> registrations;
+
+ /** . */
+ final Map<ManagementProvider, Object> bilto;
+
+ /** . */
+ private final ManagementContextImpl parent;
+
+ /** . */
+ final KernelManagementContext kernelContext;
+
+ /** . */
+ private final Object resource;
+
+ /** . */
+ private final ManagedTypeMetaData typeMD;
+
+ /** An optional container setup when the management context is attached to a container. */
+ private final ManageableContainer container;
+
+ public ManagementContextImpl(KernelManagementContext kernelContext, ManageableContainer container)
+ {
+ if (kernelContext == null)
+ {
+ throw new NullPointerException();
+ }
+ if (container == null)
+ {
+ throw new NullPointerException();
+ }
+
+ //
+ Object resource = null;
+ ManagedTypeMetaData typeMD = null;
+ MetaDataBuilder builder = new MetaDataBuilder(container.getClass());
+ if (builder.isBuildable())
+ {
+ resource = container;
+ typeMD = builder.build();
+ }
+
+ //
+ this.bilto = new HashMap<ManagementProvider, Object>();
+ this.registrations = new HashMap<Object, ManagementContextImpl>();
+ this.parent = null;
+ this.scopingDataList = new HashMap<Class<?>, Object>();
+ this.kernelContext = kernelContext;
+ this.resource = resource;
+ this.typeMD = typeMD;
+ this.container = container;
+ }
+
+ public ManagementContextImpl(ManagementContextImpl parent, ManageableContainer container)
+ {
+ if (parent == null)
+ {
+ throw new NullPointerException();
+ }
+ if (container == null)
+ {
+ throw new NullPointerException();
+ }
+
+ //
+ Object resource = null;
+ ManagedTypeMetaData typeMD = null;
+ MetaDataBuilder builder = new MetaDataBuilder(container.getClass());
+ if (builder.isBuildable())
+ {
+ resource = container;
+ typeMD = builder.build();
+ }
+
+ //
+ this.bilto = new HashMap<ManagementProvider, Object>();
+ this.registrations = new HashMap<Object, ManagementContextImpl>();
+ this.parent = parent;
+ this.scopingDataList = new HashMap<Class<?>, Object>();
+ this.kernelContext = parent.kernelContext;
+ this.resource = resource;
+ this.typeMD = typeMD;
+ this.container = container;
+ }
+
+ public ManagementContextImpl(ManagementContextImpl parent, Object resource, ManagedTypeMetaData typeMD)
+ {
+ if (parent == null)
+ {
+ throw new NullPointerException();
+ }
+ if ((resource != null && typeMD == null) && (resource == null && typeMD != null))
+ {
+ throw new IllegalArgumentException("Can't have resource null and meta data not null or the converse");
+ }
+
+ //
+ this.bilto = new HashMap<ManagementProvider, Object>();
+ this.registrations = new HashMap<Object, ManagementContextImpl>();
+ this.parent = parent;
+ this.scopingDataList = new HashMap<Class<?>, Object>();
+ this.kernelContext = parent.kernelContext;
+ this.resource = resource;
+ this.typeMD = typeMD;
+ this.container = null;
+ }
+
+ public ManagementContext getParent()
+ {
+ return parent;
+ }
+
+ public <S> void setScopingData(Class<S> scopeType, S scopingData)
+ {
+ this.scopingDataList.put(scopeType, scopingData);
+ }
+
+ public void register(Object o)
+ {
+ Object resource = null;
+
+ // Apply managed by annotation
+ ManagedBy managedBy = o.getClass().getAnnotation(ManagedBy.class);
+ if (managedBy != null)
+ {
+ try
+ {
+ Class managedByClass = managedBy.value();
+ Constructor<?> blah = managedByClass.getConstructor(o.getClass());
+ resource = blah.newInstance(o);
+ }
+ catch (NoSuchMethodException e)
+ {
+ e.printStackTrace();
+ }
+ catch (InstantiationException e)
+ {
+ e.printStackTrace();
+ }
+ catch (IllegalAccessException e)
+ {
+ e.printStackTrace();
+ }
+ catch (InvocationTargetException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ else
+ {
+ resource = o;
+ }
+
+ //
+ if (resource != null) {
+
+ MetaDataBuilder builder = new MetaDataBuilder(resource.getClass());
+ if (builder.isBuildable()) {
+ ManagedTypeMetaData metaData = builder.build();
+
+ //
+ ManagementContextImpl managementContext;
+ if (resource instanceof ManageableContainer)
+ {
+ managementContext = ((ManageableContainer)resource).managementContext;
+ }
+ else
+ {
+ managementContext = new ManagementContextImpl(this, resource, metaData);
+ }
+
+ //
+ registrations.put(resource, managementContext);
+
+ //
+ for (ManagementProvider provider : kernelContext.getProviders())
+ {
+ Object name = provider.manage(managementContext);
+ if (name != null)
+ {
+ managementContext.bilto.put(provider, name);
+ }
+ }
+
+ // Allow for more resource management
+ if (resource instanceof ManagementAware)
+ {
+ ((ManagementAware)resource).setContext(managementContext);
+ }
+ }
+ }
+ }
+
+ public void unregister(Object o)
+ {
+ ManagementContextImpl context = registrations.remove(o);
+ if (context != null)
+ {
+ for (Map.Entry<ManagementProvider, Object> entry : context.bilto.entrySet()) {
+ entry.getKey().unmanage(entry.getValue());
+ }
+ }
+ }
+
+ public <S> List<S> getScopingData(Class<S> scopeType)
+ {
+ ArrayList<S> list = new ArrayList<S>();
+ for (ManagementContextImpl current = this; current != null; current = current.parent)
+ {
+ Object scopedData = current.scopingDataList.get(scopeType);
+ if (scopedData != null)
+ {
+ // It must be that type since we put it
+ list.add((S)scopedData);
+ }
+ }
+ return list;
+ }
+
+ public ExoContainer findContainer()
+ {
+ for (ManagementContextImpl current = this;true;current = current.parent)
+ {
+ if (current.container instanceof ExoContainer)
+ {
+ return (ExoContainer)current.container;
+ }
+ else if (current.parent == null)
+ {
+ return null;
+ }
+ }
+ }
+
+ public void beforeInvoke(Object managedResource)
+ {
+ ExoContainer container = findContainer();
+ if (container != null)
+ {
+ RequestLifeCycle.begin(container);
+ }
+ }
+
+ public void afterInvoke(Object managedResource)
+ {
+ RequestLifeCycle.end();
+ }
+
+ @Override
+ public String toString()
+ {
+ return "ManagementContextImpl[container=" + container + "]";
+ }
+
+ public Object getResource()
+ {
+ return resource;
+ }
+
+ public ManagedTypeMetaData getMetaData()
+ {
+ return typeMD;
+ }
+
+ void install(ManagementProvider provider) {
+ if (resource != null&& typeMD != null)
+ {
+ Object name = provider.manage(this);
+ if (name != null)
+ {
+ bilto.put(provider, name);
+ }
+ }
+
+ // Install for all
+ for (ManagementContextImpl registration : registrations.values())
+ {
+ registration.install(provider);
+ }
+ }
+}
Modified: kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestPortalContainerManagedIntegration.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestPortalContainerManagedIntegration.java 2009-12-29 09:52:07 UTC (rev 1226)
+++ kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestPortalContainerManagedIntegration.java 2009-12-29 09:58:06 UTC (rev 1227)
@@ -21,6 +21,7 @@
import org.exoplatform.container.PortalContainer;
import org.exoplatform.container.RootContainer;
import org.exoplatform.container.jmx.support.SimpleManagementAware;
+import org.exoplatform.container.management.ManagementContextImpl;
import org.exoplatform.container.support.ContainerBuilder;
import java.net.URL;
16 years, 4 months
exo-jcr SVN: r1226 - in kernel/trunk/exo.kernel.container/src: main/java/org/exoplatform/management/spi and 2 other directories.
by do-not-reply@jboss.org
Author: julien_viet
Date: 2009-12-29 04:52:07 -0500 (Tue, 29 Dec 2009)
New Revision: 1226
Added:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedResource.java
Removed:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagementProviderContext.java
Modified:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/KernelManagementContext.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableContainer.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManagementContextImpl.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedMetaData.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedMethodMetaData.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedMethodParameterMetaData.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedParameterMetaData.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedPropertyMetaData.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedTypeMetaData.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagementProvider.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/jmx/ExoModelMBean.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/jmx/JMXManagementProvider.java
kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/management/ManagedResource.java
kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/management/ManagementProviderImpl.java
kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/management/TestManagementProvider.java
Log:
EXOJCR-350 : Enable plugability of management layer : cleanup
Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/KernelManagementContext.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/KernelManagementContext.java 2009-12-29 09:21:36 UTC (rev 1225)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/KernelManagementContext.java 2009-12-29 09:52:07 UTC (rev 1226)
@@ -37,10 +37,16 @@
/** . */
private final Set<ManagementProvider> providers;
- public KernelManagementContext()
+ /** . */
+ private final ManageableContainer container;
+
+ public KernelManagementContext(ManageableContainer container)
{
- this.root = new ManagementContextImpl(this);
this.providers = new HashSet<ManagementProvider>();
+ this.container = container;
+
+ // Done last as we pass 'this' as argument
+ this.root = new ManagementContextImpl(this, container);
}
public synchronized Collection<ManagementProvider> getProviders() {
Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableContainer.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableContainer.java 2009-12-29 09:21:36 UTC (rev 1225)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableContainer.java 2009-12-29 09:52:07 UTC (rev 1226)
@@ -97,13 +97,13 @@
ManagementContextImpl parentManagementContext = manageableParent.managementContext;
if (parentManagementContext != null)
{
- managementContext = new ManagementContextImpl(parentManagementContext);
+ managementContext = new ManagementContextImpl(parentManagementContext, this);
}
// Get server from parent
server = manageableParent.server;
} else {
- KernelManagementContext kernelCtx = new KernelManagementContext();
+ KernelManagementContext kernelCtx = new KernelManagementContext(this);
//
server = findMBeanServer();
@@ -112,9 +112,6 @@
//
kernelCtx.addProvider(new JMXManagementProvider(server));
}
-
- //
- this.managementContext.container = this;
}
public ManageableContainer(ComponentAdapterFactory componentAdapterFactory)
Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManagementContextImpl.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManagementContextImpl.java 2009-12-29 09:21:36 UTC (rev 1225)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManagementContextImpl.java 2009-12-29 09:52:07 UTC (rev 1226)
@@ -21,10 +21,10 @@
import org.exoplatform.container.ExoContainer;
import org.exoplatform.container.component.RequestLifeCycle;
import org.exoplatform.management.ManagementAware;
+import org.exoplatform.management.spi.ManagedResource;
import org.exoplatform.management.spi.ManagedTypeMetaData;
import org.exoplatform.container.management.MetaDataBuilder;
import org.exoplatform.management.spi.ManagementProvider;
-import org.exoplatform.management.spi.ManagementProviderContext;
import org.exoplatform.management.ManagementContext;
import org.exoplatform.management.annotations.ManagedBy;
@@ -39,11 +39,11 @@
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
-public class ManagementContextImpl implements ManagementContext, ManagementProviderContext
+public class ManagementContextImpl implements ManagementContext, ManagedResource
{
/** . */
- private final Map<Class<?>, Object> scopingProperties;
+ private final Map<Class<?>, Object> scopingDataList;
/** The registrations done by this mbean. */
private final Map<Object, ManagementContextImpl> registrations;
@@ -64,31 +64,70 @@
private final ManagedTypeMetaData typeMD;
/** An optional container setup when the management context is attached to a container. */
- ManageableContainer container;
+ private final ManageableContainer container;
- public ManagementContextImpl(KernelManagementContext kernelContext)
+ public ManagementContextImpl(KernelManagementContext kernelContext, ManageableContainer container)
{
if (kernelContext == null)
{
throw new NullPointerException();
}
+ if (container == null)
+ {
+ throw new NullPointerException();
+ }
+
+ //
+ Object resource = null;
+ ManagedTypeMetaData typeMD = null;
+ MetaDataBuilder builder = new MetaDataBuilder(container.getClass());
+ if (builder.isBuildable())
+ {
+ resource = container;
+ typeMD = builder.build();
+ }
+
+ //
this.bilto = new HashMap<ManagementProvider, Object>();
this.registrations = new HashMap<Object, ManagementContextImpl>();
this.parent = null;
-
- // This is the root container that never have scoping properties
- // Also without that we would have an NPE when the portal container are registered
- // as the scoping properties would not exist since the root container would not be yet
-
- this.scopingProperties = new HashMap<Class<?>, Object>();
+ this.scopingDataList = new HashMap<Class<?>, Object>();
this.kernelContext = kernelContext;
- this.resource = null;
- this.typeMD = null;
+ this.resource = resource;
+ this.typeMD = typeMD;
+ this.container = container;
}
- public ManagementContextImpl(ManagementContextImpl parent)
+ public ManagementContextImpl(ManagementContextImpl parent, ManageableContainer container)
{
- this(parent, null, null);
+ if (parent == null)
+ {
+ throw new NullPointerException();
+ }
+ if (container == null)
+ {
+ throw new NullPointerException();
+ }
+
+ //
+ Object resource = null;
+ ManagedTypeMetaData typeMD = null;
+ MetaDataBuilder builder = new MetaDataBuilder(container.getClass());
+ if (builder.isBuildable())
+ {
+ resource = container;
+ typeMD = builder.build();
+ }
+
+ //
+ this.bilto = new HashMap<ManagementProvider, Object>();
+ this.registrations = new HashMap<Object, ManagementContextImpl>();
+ this.parent = parent;
+ this.scopingDataList = new HashMap<Class<?>, Object>();
+ this.kernelContext = parent.kernelContext;
+ this.resource = resource;
+ this.typeMD = typeMD;
+ this.container = container;
}
public ManagementContextImpl(ManagementContextImpl parent, Object resource, ManagedTypeMetaData typeMD)
@@ -97,13 +136,20 @@
{
throw new NullPointerException();
}
+ if ((resource != null && typeMD == null) && (resource == null && typeMD != null))
+ {
+ throw new IllegalArgumentException("Can't have resource null and meta data not null or the converse");
+ }
+
+ //
this.bilto = new HashMap<ManagementProvider, Object>();
this.registrations = new HashMap<Object, ManagementContextImpl>();
this.parent = parent;
- this.scopingProperties = new HashMap<Class<?>, Object>();
+ this.scopingDataList = new HashMap<Class<?>, Object>();
this.kernelContext = parent.kernelContext;
this.resource = resource;
this.typeMD = typeMD;
+ this.container = null;
}
public ManagementContext getParent()
@@ -111,14 +157,14 @@
return parent;
}
- public <S> void setScopingData(Class<S> scopeType, S scopingProperties)
+ public <S> void setScopingData(Class<S> scopeType, S scopingData)
{
- this.scopingProperties.put(scopeType, scopingProperties);
+ this.scopingDataList.put(scopeType, scopingData);
}
public void register(Object o)
{
- Object view = null;
+ Object resource = null;
// Apply managed by annotation
ManagedBy managedBy = o.getClass().getAnnotation(ManagedBy.class);
@@ -128,7 +174,7 @@
{
Class managedByClass = managedBy.value();
Constructor<?> blah = managedByClass.getConstructor(o.getClass());
- view = blah.newInstance(o);
+ resource = blah.newInstance(o);
}
catch (NoSuchMethodException e)
{
@@ -149,44 +195,44 @@
}
else
{
- view = o;
+ resource = o;
}
//
- if (view != null) {
+ if (resource != null) {
- MetaDataBuilder builder = new MetaDataBuilder(view.getClass());
+ MetaDataBuilder builder = new MetaDataBuilder(resource.getClass());
if (builder.isBuildable()) {
ManagedTypeMetaData metaData = builder.build();
//
- ManagementContextImpl viewContext;
- if (view instanceof ManageableContainer)
+ ManagementContextImpl managementContext;
+ if (resource instanceof ManageableContainer)
{
- viewContext = ((ManageableContainer)view).managementContext;
+ managementContext = ((ManageableContainer)resource).managementContext;
}
else
{
- viewContext = new ManagementContextImpl(this, view, metaData);
+ managementContext = new ManagementContextImpl(this, resource, metaData);
}
//
- registrations.put(view, viewContext);
+ registrations.put(resource, managementContext);
//
for (ManagementProvider provider : kernelContext.getProviders())
{
- Object name = provider.manage(this, view, metaData);
+ Object name = provider.manage(managementContext);
if (name != null)
{
- viewContext.bilto.put(provider, name);
+ managementContext.bilto.put(provider, name);
}
}
// Allow for more resource management
- if (view instanceof ManagementAware)
+ if (resource instanceof ManagementAware)
{
- ((ManagementAware)view).setContext(viewContext);
+ ((ManagementAware)resource).setContext(managementContext);
}
}
}
@@ -203,12 +249,12 @@
}
}
- public <S> List<S> getScopingProperties(Class<S> scopeType)
+ public <S> List<S> getScopingData(Class<S> scopeType)
{
ArrayList<S> list = new ArrayList<S>();
for (ManagementContextImpl current = this; current != null; current = current.parent)
{
- Object scopedData = current.scopingProperties.get(scopeType);
+ Object scopedData = current.scopingDataList.get(scopeType);
if (scopedData != null)
{
// It must be that type since we put it
@@ -253,10 +299,20 @@
return "ManagementContextImpl[container=" + container + "]";
}
+ public Object getResource()
+ {
+ return resource;
+ }
+
+ public ManagedTypeMetaData getMetaData()
+ {
+ return typeMD;
+ }
+
void install(ManagementProvider provider) {
if (resource != null&& typeMD != null)
{
- Object name = provider.manage(this, resource, typeMD);
+ Object name = provider.manage(this);
if (name != null)
{
bilto.put(provider, name);
Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedMetaData.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedMetaData.java 2009-12-29 09:21:36 UTC (rev 1225)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedMetaData.java 2009-12-29 09:52:07 UTC (rev 1226)
@@ -19,6 +19,8 @@
package org.exoplatform.management.spi;
/**
+ * Generic base meta data class.
+ *
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedMethodMetaData.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedMethodMetaData.java 2009-12-29 09:21:36 UTC (rev 1225)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedMethodMetaData.java 2009-12-29 09:52:07 UTC (rev 1226)
@@ -25,6 +25,8 @@
import java.util.Map;
/**
+ * Meta data that describes a managed method.
+ *
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedMethodParameterMetaData.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedMethodParameterMetaData.java 2009-12-29 09:21:36 UTC (rev 1225)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedMethodParameterMetaData.java 2009-12-29 09:52:07 UTC (rev 1226)
@@ -19,6 +19,8 @@
package org.exoplatform.management.spi;
/**
+ * Meta data that describes the parameter of a managed method.
+ *
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedParameterMetaData.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedParameterMetaData.java 2009-12-29 09:21:36 UTC (rev 1225)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedParameterMetaData.java 2009-12-29 09:52:07 UTC (rev 1226)
@@ -19,6 +19,8 @@
package org.exoplatform.management.spi;
/**
+ * Meta data that describes a managed parameter.
+ *
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedPropertyMetaData.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedPropertyMetaData.java 2009-12-29 09:21:36 UTC (rev 1225)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedPropertyMetaData.java 2009-12-29 09:52:07 UTC (rev 1226)
@@ -21,6 +21,8 @@
import java.lang.reflect.Method;
/**
+ * Meta data that describes a managed property.
+ *
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
Copied: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedResource.java (from rev 1223, kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagementProviderContext.java)
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedResource.java (rev 0)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedResource.java 2009-12-29 09:52:07 UTC (rev 1226)
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2009 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.management.spi;
+
+import org.exoplatform.management.ManagementContext;
+
+import java.util.List;
+
+/**
+ * The contract between a management provider and the kernel.
+ *
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
+ * @version $Revision$
+ */
+public interface ManagedResource extends ManagementContext
+{
+
+ /**
+ * The resource implementation.
+ *
+ * @return the resource
+ */
+ Object getResource();
+
+ /**
+ * Returns the resource meta data.
+ *
+ * @return the meta data
+ */
+ ManagedTypeMetaData getMetaData();
+
+ /**
+ * Returns the scoping data of the context. The list contains the scoping properties
+ * registered by the provider if a call has been made to the {@link #setScopingData(Class, Object)}
+ * method plus the scoping properties of the parent context.
+ *
+ * @param scopeType the scope type
+ * @param <S> the generic type of the scope type
+ * @return the scoping properties
+ */
+ <S> List<S> getScopingData(Class<S> scopeType);
+
+ /**
+ * Callback made by the provie to the resource to signal that scopgin data is used for the managed resource.
+ *
+ * @param scopeType the scope type
+ * @param <S> the generic type of the scope type
+ * @param scopingData the scoping data
+ */
+ <S> void setScopingData(Class<S> scopeType, S scopingData);
+
+ /**
+ * Before a managed resource is invoked by the management layer.
+ *
+ * @param managedResource the managed resource
+ */
+ void beforeInvoke(Object managedResource);
+
+ /**
+ * After a managed resource is invoked by the management layer.
+ *
+ * @param managedResource the managed resource
+ */
+ void afterInvoke(Object managedResource);
+
+}
Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedTypeMetaData.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedTypeMetaData.java 2009-12-29 09:21:36 UTC (rev 1225)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagedTypeMetaData.java 2009-12-29 09:52:07 UTC (rev 1226)
@@ -26,6 +26,8 @@
import java.util.Map;
/**
+ * Meta data that describes a managed type.
+ *
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagementProvider.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagementProvider.java 2009-12-29 09:21:36 UTC (rev 1225)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagementProvider.java 2009-12-29 09:52:07 UTC (rev 1226)
@@ -23,20 +23,19 @@
*
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
- * @param <S> the scope type
*/
-public interface ManagementProvider<S>
+public interface ManagementProvider
{
/**
- * Instruct the management provider to manage the provided resource with the specified meta data.
+ * Instruct the management provider to manage the provided managed resource. If any registration is done
+ * the provider should return an unique key that will be used later for unregistration purpose in the
+ * {@link #unmanage(Object)} method. If no registration is performed then null should be returned.
*
- * @param context the context
- * @param source the resource to manage
- * @param metaData the meta data describing the management interface
+ * @param managedResource the managed resource
* @return the key under which the resource is registered
*/
- Object manage(ManagementProviderContext context, Object source, ManagedTypeMetaData metaData);
+ Object manage(ManagedResource managedResource);
/**
* Instruct the management provider to remove the specifed resource from management.
Deleted: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagementProviderContext.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagementProviderContext.java 2009-12-29 09:21:36 UTC (rev 1225)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/ManagementProviderContext.java 2009-12-29 09:52:07 UTC (rev 1226)
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2009 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.management.spi;
-
-import org.exoplatform.management.ManagementContext;
-
-import java.util.List;
-
-/**
- * The contract between a management provider and the kernel.
- *
- * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
- * @version $Revision$
- */
-public interface ManagementProviderContext extends ManagementContext
-{
-
- /**
- * Returns the scoping properties of the context;
- *
- * @param scopeType the scope type
- * @param <S> the generic type of the scope type
- * @return the scoping properties
- */
- <S> List<S> getScopingProperties(Class<S> scopeType);
-
- /**
- * Callback to obtain a management provider context for the specified managed resource scoped with
- * the provided properties.
- *
- * @param scopeType the scope type
- * @param <S> the generic type of the scope type
- * @param scopingProperties the scoping properties
- */
- <S> void setScopingData(Class<S> scopeType, S scopingProperties);
-
- /**
- * Before a managed resource is invoked by the management layer.
- *
- * @param managedResource the managed resource
- */
- void beforeInvoke(Object managedResource);
-
- /**
- * After a managed resource is invoked by the management layer.
- *
- * @param managedResource the managed resource
- */
- void afterInvoke(Object managedResource);
-
-}
Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/jmx/ExoModelMBean.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/jmx/ExoModelMBean.java 2009-12-29 09:21:36 UTC (rev 1225)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/jmx/ExoModelMBean.java 2009-12-29 09:52:07 UTC (rev 1226)
@@ -18,9 +18,8 @@
*/
package org.exoplatform.management.spi.jmx;
-import org.exoplatform.management.spi.ManagementProviderContext;
+import org.exoplatform.management.spi.ManagedResource;
import org.exoplatform.management.ManagementAware;
-import org.exoplatform.management.ManagementContext;
import org.exoplatform.management.jmx.annotations.NamingContext;
import javax.management.InstanceNotFoundException;
@@ -48,9 +47,9 @@
private Object mr;
/** . */
- private final ManagementProviderContext context;
+ private final ManagedResource context;
- public ExoModelMBean(ManagementProviderContext context, Object mr, ModelMBeanInfo mbi) throws MBeanException,
+ public ExoModelMBean(ManagedResource context, Object mr, ModelMBeanInfo mbi) throws MBeanException,
RuntimeOperationsException, InstanceNotFoundException, InvalidTargetObjectTypeException
{
super(mbi);
@@ -101,10 +100,10 @@
PropertiesInfo info = PropertiesInfo.resolve(mr.getClass(), NamingContext.class);
//
- MBeanScopingData scopingProperties = info != null ? info.resolve(mr) : new MBeanScopingData();
+ MBeanScopingData scopingData = info != null ? info.resolve(mr) : new MBeanScopingData();
//
- context.setScopingData(MBeanScopingData.class, scopingProperties);
+ context.setScopingData(MBeanScopingData.class, scopingData);
//
if (mr instanceof MBeanRegistration)
Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/jmx/JMXManagementProvider.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/jmx/JMXManagementProvider.java 2009-12-29 09:21:36 UTC (rev 1225)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/management/spi/jmx/JMXManagementProvider.java 2009-12-29 09:52:07 UTC (rev 1226)
@@ -18,9 +18,8 @@
*/
package org.exoplatform.management.spi.jmx;
-import org.exoplatform.management.spi.ManagedTypeMetaData;
+import org.exoplatform.management.spi.ManagedResource;
import org.exoplatform.management.spi.ManagementProvider;
-import org.exoplatform.management.spi.ManagementProviderContext;
import org.exoplatform.management.jmx.annotations.NameTemplate;
import javax.management.InstanceAlreadyExistsException;
@@ -55,14 +54,14 @@
this.server = server;
}
- public Object manage(ManagementProviderContext context, Object managedResource, ManagedTypeMetaData metaData)
+ public Object manage(ManagedResource context)
{
ExoModelMBean mbean = null;
try
{
- ExoMBeanInfoBuilder infoBuilder = new ExoMBeanInfoBuilder(metaData);
+ ExoMBeanInfoBuilder infoBuilder = new ExoMBeanInfoBuilder(context.getMetaData());
ModelMBeanInfo info = infoBuilder.build();
- mbean = new ExoModelMBean(context, managedResource, info);
+ mbean = new ExoModelMBean(context, context.getResource(), info);
}
catch (Exception e)
{
@@ -73,12 +72,12 @@
if (mbean != null)
{
ObjectName on = null;
- PropertiesInfo oni = PropertiesInfo.resolve(managedResource.getClass(), NameTemplate.class);
+ PropertiesInfo oni = PropertiesInfo.resolve(context.getResource().getClass(), NameTemplate.class);
if (oni != null)
{
try
{
- Map<String, String> foo = oni.resolve(managedResource);
+ Map<String, String> foo = oni.resolve(context.getResource());
on = JMX.createObjectName("exo", foo);
}
catch (MalformedObjectNameException e)
@@ -95,10 +94,10 @@
Map<String, String> props = new Hashtable<String, String>();
// Merge scoping properties
- List<MBeanScopingData> list = context.getScopingProperties(MBeanScopingData.class);
- for (MBeanScopingData scopingProperties : list)
+ List<MBeanScopingData> list = context.getScopingData(MBeanScopingData.class);
+ for (MBeanScopingData scopingData : list)
{
- props.putAll(scopingProperties);
+ props.putAll(scopingData);
}
// Julien : I know it's does not look great but it's necessary
Modified: kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/management/ManagedResource.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/management/ManagedResource.java 2009-12-29 09:21:36 UTC (rev 1225)
+++ kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/management/ManagedResource.java 2009-12-29 09:52:07 UTC (rev 1226)
@@ -20,7 +20,6 @@
package org.exoplatform.container.management;
import org.exoplatform.management.spi.ManagedTypeMetaData;
-import org.exoplatform.management.spi.ManagementProviderContext;
/**
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
@@ -35,7 +34,7 @@
final Object resource;
/** . */
- final ManagementProviderContext context;
+ final org.exoplatform.management.spi.ManagedResource context;
/** . */
final ManagedTypeMetaData metaData;
@@ -43,7 +42,7 @@
/** . */
final ScopedData data;
- public ManagedResource(Object resource, ManagementProviderContext context, ManagedTypeMetaData metaData)
+ public ManagedResource(Object resource, org.exoplatform.management.spi.ManagedResource context, ManagedTypeMetaData metaData)
{
this.key = new ResourceKey();
this.resource = resource;
Modified: kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/management/ManagementProviderImpl.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/management/ManagementProviderImpl.java 2009-12-29 09:21:36 UTC (rev 1225)
+++ kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/management/ManagementProviderImpl.java 2009-12-29 09:52:07 UTC (rev 1226)
@@ -19,9 +19,8 @@
package org.exoplatform.container.management;
-import org.exoplatform.management.spi.ManagedTypeMetaData;
-import org.exoplatform.management.spi.ManagementProvider;
-import org.exoplatform.management.spi.ManagementProviderContext;
+import org.exoplatform.management.spi.*;
+import org.exoplatform.management.spi.ManagedResource;
import java.util.ArrayList;
import java.util.Iterator;
@@ -35,20 +34,20 @@
{
/** . */
- final List<ManagedResource> resources = new ArrayList<ManagedResource>();
+ final List<org.exoplatform.container.management.ManagedResource> resources = new ArrayList<org.exoplatform.container.management.ManagedResource>();
- public Object manage(ManagementProviderContext context, Object resource, ManagedTypeMetaData metaData)
+ public Object manage(ManagedResource context)
{
- ManagedResource mr = new ManagedResource(resource, context, metaData);
+ org.exoplatform.container.management.ManagedResource mr = new org.exoplatform.container.management.ManagedResource(context.getResource(), context, context.getMetaData());
resources.add(mr);
return mr.key;
}
public void unmanage(Object key)
{
- for (Iterator<ManagedResource> i = resources.iterator();i.hasNext();)
+ for (Iterator<org.exoplatform.container.management.ManagedResource> i = resources.iterator();i.hasNext();)
{
- ManagedResource mr = i.next();
+ org.exoplatform.container.management.ManagedResource mr = i.next();
if (mr.key == key)
{
i.remove();
Modified: kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/management/TestManagementProvider.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/management/TestManagementProvider.java 2009-12-29 09:21:36 UTC (rev 1225)
+++ kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/management/TestManagementProvider.java 2009-12-29 09:52:07 UTC (rev 1226)
@@ -26,7 +26,6 @@
import java.net.URL;
import java.util.Arrays;
import java.util.Collections;
-import java.util.Map;
/**
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
@@ -48,15 +47,15 @@
URL url = getClass().getResource("configuration1.xml");
RootContainer container = new ContainerBuilder().withRoot(url).build();
ManagementProviderImpl provider = (ManagementProviderImpl)container.getComponentInstanceOfType(ManagementProviderImpl.class);
- assertEquals(0, provider.resources.size());
+ assertEquals(1, provider.resources.size());
Object foo = container.getComponentInstance("Foo");
assertNotNull(foo);
- assertEquals(1, provider.resources.size());
- ManagedResource fooMR = provider.resources.get(0);
+ assertEquals(2, provider.resources.size());
+ ManagedResource fooMR = provider.resources.get(1);
assertSame(foo, fooMR.resource);
- assertEquals(Collections.<ScopedData>emptyList(), fooMR.context.getScopingProperties(ScopedData.class));
+ assertEquals(Collections.<ScopedData>emptyList(), fooMR.context.getScopingData(ScopedData.class));
fooMR.register();
- assertEquals(Collections.singletonList(fooMR.data), fooMR.context.getScopingProperties(ScopedData.class));
+ assertEquals(Collections.singletonList(fooMR.data), fooMR.context.getScopingData(ScopedData.class));
}
public void testManagedRegistrationBeforeProviderRegistration()
@@ -69,12 +68,12 @@
assertNotNull(foo);
provider = new ManagementProviderImpl();
container.registerComponentInstance(provider);
- assertEquals(1, provider.resources.size());
- ManagedResource fooMR = provider.resources.get(0);
+ assertEquals(2, provider.resources.size());
+ ManagedResource fooMR = provider.resources.get(1);
assertSame(foo, fooMR.resource);
- assertEquals(Collections.<ScopedData>emptyList(), fooMR.context.getScopingProperties(ScopedData.class));
+ assertEquals(Collections.<ScopedData>emptyList(), fooMR.context.getScopingData(ScopedData.class));
fooMR.register();
- assertEquals(Collections.singletonList(fooMR.data), fooMR.context.getScopingProperties(ScopedData.class));
+ assertEquals(Collections.singletonList(fooMR.data), fooMR.context.getScopingData(ScopedData.class));
}
public void testManagementAware()
@@ -83,21 +82,22 @@
RootContainer container = new ContainerBuilder().withRoot(url).build();
ManagementProviderImpl provider = (ManagementProviderImpl)container.getComponentInstanceOfType(ManagementProviderImpl.class);
Foo foo = (Foo)container.getComponentInstance("Foo");
- assertEquals(1, provider.resources.size());
- ManagedResource fooMR = provider.resources.get(0);
+ assertEquals(2, provider.resources.size());
+ ManagedResource fooMR = provider.resources.get(1);
fooMR.register();
assertTrue(foo.isAware());
//
foo.deploy();
- assertEquals(2, provider.resources.size());
- ManagedResource barMR = provider.resources.get(1);
+ assertEquals(3, provider.resources.size());
+ ManagedResource barMR = provider.resources.get(2);
assertSame(foo.bar, barMR.resource);
barMR.register();
- assertEquals(Arrays.asList(barMR.data, fooMR.data), barMR.context.getScopingProperties(ScopedData.class));
+ assertEquals(Arrays.asList(barMR.data, fooMR.data), barMR.context.getScopingData(ScopedData.class));
//
foo.undeploy();
- assertEquals(Arrays.asList(fooMR), provider.resources);
+ assertEquals(2, provider.resources.size());
+ assertEquals(fooMR, provider.resources.get(1));
}
}
16 years, 4 months
exo-jcr SVN: r1225 - jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation.
by do-not-reply@jboss.org
Author: sergiykarpenko
Date: 2009-12-29 04:21:36 -0500 (Tue, 29 Dec 2009)
New Revision: 1225
Modified:
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCWorkspaceDataContainer.java
Log:
EXOJCR-302: CQJDBCStorageConnection defaultConnectionFactory added
Modified: jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCWorkspaceDataContainer.java
===================================================================
--- jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCWorkspaceDataContainer.java 2009-12-29 09:20:10 UTC (rev 1224)
+++ jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCWorkspaceDataContainer.java 2009-12-29 09:21:36 UTC (rev 1225)
@@ -23,11 +23,13 @@
import org.exoplatform.services.jcr.config.WorkspaceEntry;
import org.exoplatform.services.jcr.impl.storage.jdbc.DBConstants;
import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer;
+import org.exoplatform.services.jcr.impl.storage.jdbc.db.GenericConnectionFactory;
import org.exoplatform.services.jcr.impl.storage.jdbc.init.DBInitializer;
import org.exoplatform.services.jcr.impl.storage.jdbc.init.DBInitializerException;
import org.exoplatform.services.jcr.impl.storage.jdbc.init.IngresSQLDBInitializer;
import org.exoplatform.services.jcr.impl.storage.jdbc.init.OracleDBInitializer;
import org.exoplatform.services.jcr.impl.storage.jdbc.init.PgSQLDBInitializer;
+import org.exoplatform.services.jcr.impl.storage.jdbc.optimisation.db.GenericCQConnectionFactory;
import org.exoplatform.services.jcr.impl.storage.jdbc.optimisation.db.HSQLDBConnectionFactory;
import org.exoplatform.services.jcr.impl.storage.jdbc.optimisation.db.MySQLConnectionFactory;
import org.exoplatform.services.jcr.impl.storage.jdbc.optimisation.db.OracleConnectionFactory;
@@ -233,4 +235,30 @@
}
}
+ /**
+ * Prepare sefault connection factory.
+ *
+ * @return GenericConnectionFactory
+ * @throws NamingException
+ * on JNDI error
+ * @throws RepositoryException
+ * on Storage error
+ */
+ protected GenericConnectionFactory defaultConnectionFactory() throws NamingException, RepositoryException
+ {
+ // by default
+ if (dbSourceName != null)
+ {
+ DataSource ds = (DataSource)new InitialContext().lookup(dbSourceName);
+ if (ds != null)
+ return new GenericCQConnectionFactory(ds, containerName, multiDb, valueStorageProvider, maxBufferSize,
+ swapDirectory, swapCleaner);
+
+ throw new RepositoryException("Datasource '" + dbSourceName + "' is not bound in this context.");
+ }
+
+ return new GenericCQConnectionFactory(dbDriver, dbUrl, dbUserName, dbPassword, containerName, multiDb,
+ valueStorageProvider, maxBufferSize, swapDirectory, swapCleaner);
+ }
+
}
16 years, 4 months
exo-jcr SVN: r1224 - in jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src: test/java/org/exoplatform/services/jcr/lab/cluster/prepare and 1 other directory.
by do-not-reply@jboss.org
Author: skabashnyuk
Date: 2009-12-29 04:20:10 -0500 (Tue, 29 Dec 2009)
New Revision: 1224
Modified:
jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexUpdateMonitor.java
jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/lab/cluster/prepare/TestIndexUpdateMonitor.java
Log:
EXOJCR-331 : Added locks
Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexUpdateMonitor.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexUpdateMonitor.java 2009-12-29 01:00:21 UTC (rev 1223)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexUpdateMonitor.java 2009-12-29 09:20:10 UTC (rev 1224)
@@ -25,6 +25,8 @@
import org.jboss.cache.Cache;
import org.jboss.cache.CacheSPI;
import org.jboss.cache.Fqn;
+import org.jboss.cache.lock.LockManager;
+import org.jboss.cache.lock.LockType;
import java.io.IOException;
import java.io.Serializable;
@@ -67,6 +69,25 @@
}
+ public boolean lock(String name, LockType lockType) throws InterruptedException
+ {
+ LockManager lm = ((CacheSPI<Serializable, Object>)cache).getComponentRegistry().getComponent(LockManager.class);
+ return lm.lock(Fqn.fromRelativeFqn(PARAMETER_ROOT, Fqn.fromString(name)), lockType, Integer.MAX_VALUE);
+ }
+
+ public void unlock(String name)
+ {
+ LockManager lm = ((CacheSPI<Serializable, Object>)cache).getComponentRegistry().getComponent(LockManager.class);
+ lm.unlock(Fqn.fromRelativeFqn(PARAMETER_ROOT, Fqn.fromString(name)), cache.getInvocationContext()
+ .getGlobalTransaction());
+ }
+
+ public boolean isLocked(String name)
+ {
+ LockManager lm = ((CacheSPI<Serializable, Object>)cache).getComponentRegistry().getComponent(LockManager.class);
+ return lm.isLocked(Fqn.fromRelativeFqn(PARAMETER_ROOT, Fqn.fromString(name)));
+ }
+
/**
* @see org.exoplatform.services.jcr.impl.core.query.lucene.IndexUpdateMonitor#getUpdateInProgress()
*/
Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/lab/cluster/prepare/TestIndexUpdateMonitor.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/lab/cluster/prepare/TestIndexUpdateMonitor.java 2009-12-29 01:00:21 UTC (rev 1223)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/lab/cluster/prepare/TestIndexUpdateMonitor.java 2009-12-29 09:20:10 UTC (rev 1224)
@@ -22,16 +22,19 @@
import org.exoplatform.services.jcr.impl.core.query.IndexerIoMode;
import org.exoplatform.services.jcr.impl.core.query.jbosscache.JbossCacheIndexUpdateMonitor;
-import org.exoplatform.services.jcr.impl.core.query.lucene.IndexUpdateMonitor;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.jboss.cache.Cache;
import org.jboss.cache.CacheFactory;
+import org.jboss.cache.CacheSPI;
import org.jboss.cache.DefaultCacheFactory;
+import org.jboss.cache.lock.LockType;
import java.io.Serializable;
import java.util.concurrent.atomic.AtomicBoolean;
+import javax.transaction.TransactionManager;
+
/**
* @author <a href="mailto:Sergey.Kabashnyuk@exoplatform.org">Sergey Kabashnyuk</a>
* @version $Id: exo-jboss-codetemplates.xml 34360 2009-07-22 23:58:59Z ksm $
@@ -44,8 +47,10 @@
*/
private final Log log = ExoLogger.getLogger(TestIndexUpdateMonitor.class);
- private IndexUpdateMonitor indexUpdateMonitor;
+ private JbossCacheIndexUpdateMonitor indexUpdateMonitor;
+ private Cache<Serializable, Object> cache;
+
/**
* @see org.exoplatform.services.jcr.BaseStandaloneTest#setUp()
*/
@@ -54,9 +59,22 @@
{
// TODO Auto-generated method stub
super.setUp();
- indexUpdateMonitor = new JbossCacheIndexUpdateMonitor(createCache(), IndexerIoMode.READ_WRITE);
+ cache = createCache();
+ TransactionManager tm = ((CacheSPI<Serializable, Object>)cache).getTransactionManager();
+ indexUpdateMonitor = new JbossCacheIndexUpdateMonitor(cache, IndexerIoMode.READ_WRITE);
}
+ /**
+ * @see junit.framework.TestCase#tearDown()
+ */
+ @Override
+ protected void tearDown() throws Exception
+ {
+ // TODO Auto-generated method stub
+ super.tearDown();
+ cache.destroy();
+ }
+
public void testSimpleBoolean() throws Exception
{
//test default
@@ -76,8 +94,24 @@
}
- public void testMultiThread() throws Exception
+ public void testLock() throws Exception
{
+ String lockName = "testLock";
+ assertFalse(indexUpdateMonitor.isLocked(lockName));
+ assertTrue(indexUpdateMonitor.lock(lockName, LockType.WRITE));
+ assertTrue(indexUpdateMonitor.isLocked(lockName));
+ LockChecker checker = new LockChecker(indexUpdateMonitor, lockName);
+ Thread lockThread = new Thread(checker);
+ assertFalse(checker.isWaiting());
+ lockThread.start();
+ assertTrue(checker.isWaiting());
+ indexUpdateMonitor.unlock(lockName);
+ assertFalse(checker.isWaiting());
+
+ }
+
+ public void _testMultiThread() throws Exception
+ {
AtomicBoolean atomicBoolean = new AtomicBoolean();
ThreadGroup chengers = new ThreadGroup("Changers");
ThreadGroup checkers = new ThreadGroup("Checkers");
@@ -106,6 +140,52 @@
checkers.destroy();
}
+ private class LockChecker implements Runnable
+ {
+ private final String lockName;
+
+ private boolean waiting = false;
+
+ /**
+ * @return the waiting
+ */
+ protected boolean isWaiting()
+ {
+ return waiting;
+ }
+
+ /**
+ * @param indexUpdateMonitor
+ */
+ public LockChecker(JbossCacheIndexUpdateMonitor indexUpdateMonitor, String lockName)
+ {
+ super();
+ this.indexUpdateMonitor = indexUpdateMonitor;
+ this.lockName = lockName;
+ }
+
+ private final JbossCacheIndexUpdateMonitor indexUpdateMonitor;
+
+ /**
+ * @see java.lang.Runnable#run()
+ */
+ public void run()
+ {
+ // TODO Auto-generated method stub
+ try
+ {
+ waiting = true;
+ assertTrue(indexUpdateMonitor.lock(lockName, LockType.WRITE));
+ waiting = false;
+ }
+ catch (InterruptedException e)
+ {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+
private class UpdateMonitorChanger implements Runnable
{
private AtomicBoolean atomicBoolean;
@@ -196,13 +276,15 @@
private Cache<Serializable, Object> createCache()
{
- String jbcConfig = "conf/standalone/test-jbosscache-config.xml";
+ String jbcConfig = "conf/cluster/test-jbosscache-indexer-config-exoloader_db1_ws.xml";
+
CacheFactory<Serializable, Object> factory = new DefaultCacheFactory<Serializable, Object>();
log.info("JBoss Cache configuration used: " + jbcConfig);
Cache<Serializable, Object> cache = factory.createCache(jbcConfig, false);
cache.create();
cache.start();
+
return cache;
}
16 years, 4 months