Author: areshetnyak
Date: 2009-08-31 11:06:37 -0400 (Mon, 31 Aug 2009)
New Revision: 116
Modified:
jcr/trunk/component/ext/src/main/java/org/exoplatform/services/jcr/ext/repository/RestRepositoryService.java
jcr/trunk/component/ext/src/test/java/conf/standalone/test-configuration.xml
jcr/trunk/component/ext/src/test/java/org/exoplatform/services/jcr/ext/repository/RestRepositoryServiceTest.java
Log:
EXOJCR-13 : Has been updated the service RestRepositoryService.
Modified:
jcr/trunk/component/ext/src/main/java/org/exoplatform/services/jcr/ext/repository/RestRepositoryService.java
===================================================================
---
jcr/trunk/component/ext/src/main/java/org/exoplatform/services/jcr/ext/repository/RestRepositoryService.java 2009-08-31
08:56:32 UTC (rev 115)
+++
jcr/trunk/component/ext/src/main/java/org/exoplatform/services/jcr/ext/repository/RestRepositoryService.java 2009-08-31
15:06:37 UTC (rev 116)
@@ -45,7 +45,9 @@
import org.exoplatform.services.jcr.config.RepositoryServiceConfiguration;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
import org.exoplatform.services.jcr.core.ManageableRepository;
+import org.exoplatform.services.jcr.core.WorkspaceContainerFacade;
import org.exoplatform.services.jcr.impl.core.RepositoryImpl;
+import org.exoplatform.services.jcr.impl.core.SessionRegistry;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.rest.resource.ResourceContainer;
@@ -94,12 +96,12 @@
/**
* Create new repository operations.
*/
- public static final String NEW_REPOSITORY = "/new-repository";
+ public static final String CREATE_REPOSITORY = "/create-repository";
/**
* Create new workspace.
*/
- public static final String NEW_WORKSPACE = "/new-workspace";
+ public static final String CREATE_WORKSPACE = "/create-workspace";
/**
* Remove repository operation.
@@ -239,9 +241,8 @@
*/
@POST
@Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
@RolesAllowed("administrators")
- @Path("/new-repository")
+ @Path("/create-repository")
public Response createRepository(@Context UriInfo uriInfo, RepositoryEntry
newRepository) throws URISyntaxException
{
String errorMessage = new String();
@@ -250,7 +251,7 @@
{
repositoryService.createRepository(newRepository);
URI location = new URI(uriInfo.getBaseUri().toString() + uriInfo.getPath() +
"/" + newRepository.getName());
- return Response.created(location).cacheControl(NO_CACHE).build();
+ return Response.ok().cacheControl(NO_CACHE).build();
}
catch (RepositoryException e)
{
@@ -288,7 +289,7 @@
@POST
@Consumes(MediaType.APPLICATION_JSON)
@RolesAllowed("administrators")
- @Path("/new-workspace/{repositoryName}")
+ @Path("/create-workspace/{repositoryName}")
public Response createWorkspace(@Context UriInfo uriInfo,
@PathParam("repositoryName") String repositoryName,
WorkspaceEntry newWorkspace) throws URISyntaxException
{
@@ -300,7 +301,7 @@
repository.configWorkspace(newWorkspace);
repository.createWorkspace(newWorkspace.getName());
URI location = new URI(uriInfo.getBaseUri().toString() + uriInfo.getPath() +
"/" + newWorkspace.getName());
- return Response.created(location).build();
+ return Response.ok().build();
}
catch (RepositoryException e)
{
@@ -335,14 +336,19 @@
*/
@POST
@RolesAllowed("administrators")
- @Path("/remove-repository/{repositoryName}")
- public Response removeRepository(@Context UriInfo uriInfo,
@PathParam("repositoryName") String repositoryName)
+ @Path("/remove-repository/{repositoryName}/{forseSessionClose}")
+ public Response removeRepository(@Context UriInfo uriInfo,
@PathParam("repositoryName") String repositoryName,
+ @PathParam("forseSessionClose") Boolean forseSessionClose)
{
String errorMessage = new String();
Status status;
try
{
+ if (forseSessionClose)
+ for (WorkspaceEntry wsEntry :
repositoryService.getConfig().getRepositoryConfiguration(repositoryName).getWorkspaceEntries())
+ forceCloseSession(repositoryName, wsEntry.getName());
+
if (repositoryService.canRemoveRepository(repositoryName))
{
repositoryService.removeRepository(repositoryName);
@@ -378,9 +384,9 @@
*/
@POST
@RolesAllowed("administrators")
- @Path("/remove-workspace/{repositoryName}/{workspaceName}")
+
@Path("/remove-workspace/{repositoryName}/{workspaceName}/{forseSessionClose}/")
public Response removeWorkspace(@Context UriInfo uriInfo,
@PathParam("repositoryName") String repositoryName,
- @PathParam("workspaceName") String workspaceName)
+ @PathParam("workspaceName") String workspaceName,
@PathParam("forseSessionClose") Boolean forseSessionClose)
{
String errorMessage = new String();
Status status;
@@ -388,8 +394,12 @@
try
{
ManageableRepository repository =
repositoryService.getRepository(repositoryName);
+
+ if (forseSessionClose)
+ forceCloseSession(repositoryName, workspaceName);
+
if (repository.canRemoveWorkspace(workspaceName))
- {
+ {
repository.removeWorkspace(workspaceName);
return Response.noContent().build();
}
@@ -497,5 +507,28 @@
return Response.status(Status.OK).entity("The method /update-workspace-config
not implemented.").type(
MediaType.TEXT_PLAIN_TYPE).cacheControl(NO_CACHE).build();
}
+
+ /**
+ * forceCloseSession. Close sessions on specific workspace.
+ *
+ * @param repositoryName
+ * repository name
+ * @param workspaceName
+ * workspace name
+ * @return int return the how many sessions was closed
+ * @throws RepositoryConfigurationException
+ * will be generate RepositoryConfigurationException
+ * @throws RepositoryException
+ * will be generate RepositoryException
+ */
+ private int forceCloseSession(String repositoryName, String workspaceName) throws
RepositoryException,
+ RepositoryConfigurationException
+ {
+ ManageableRepository mr = repositoryService.getRepository(repositoryName);
+ WorkspaceContainerFacade wc = mr.getWorkspaceContainer(workspaceName);
+ SessionRegistry sessionRegistry = (SessionRegistry)
wc.getComponent(SessionRegistry.class);
+
+ return sessionRegistry.closeSessions(workspaceName);
+ }
}
Modified: jcr/trunk/component/ext/src/test/java/conf/standalone/test-configuration.xml
===================================================================
---
jcr/trunk/component/ext/src/test/java/conf/standalone/test-configuration.xml 2009-08-31
08:56:32 UTC (rev 115)
+++
jcr/trunk/component/ext/src/test/java/conf/standalone/test-configuration.xml 2009-08-31
15:06:37 UTC (rev 116)
@@ -53,6 +53,7 @@
<!-- property name="log4j.category.ext.BackupScheduler"
value="DEBUG"/>
<property name="log4j.category.ext.BackupManagerImpl"
value="DEBUG"/ -->
+ <property name="log4j.category.jcr.ext.RestRepositoryService"
value="DEBUG"/>
</properties-param>
</init-params>
@@ -1830,6 +1831,60 @@
</properties-param>
</init-params>
</component-plugin>
+ <component-plugin>
+ <name>bind.datasource</name>
+ <set-method>addPlugin</set-method>
+ <type>org.exoplatform.services.naming.BindReferencePlugin</type>
+ <init-params>
+ <value-param>
+ <name>bind-name</name>
+ <value>jdbcjcr_to_rest_repo_1</value>
+ </value-param>
+ <value-param>
+ <name>class-name</name>
+ <value>javax.sql.DataSource</value>
+ </value-param>
+ <value-param>
+ <name>factory</name>
+ <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
+ </value-param>
+ <properties-param>
+ <name>ref-addresses</name>
+ <description>ref-addresses</description>
+ <property name="driverClassName"
value="org.hsqldb.jdbcDriver" />
+ <property name="url"
value="jdbc:hsqldb:file:target/temp/data/jdbcjcr_to_rest_repo_1" />
+ <property name="username" value="sa" />
+ <property name="password" value="" />
+ </properties-param>
+ </init-params>
+ </component-plugin>
+ <component-plugin>
+ <name>bind.datasource</name>
+ <set-method>addPlugin</set-method>
+ <type>org.exoplatform.services.naming.BindReferencePlugin</type>
+ <init-params>
+ <value-param>
+ <name>bind-name</name>
+ <value>jdbcjcr_to_rest_repo_2</value>
+ </value-param>
+ <value-param>
+ <name>class-name</name>
+ <value>javax.sql.DataSource</value>
+ </value-param>
+ <value-param>
+ <name>factory</name>
+ <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
+ </value-param>
+ <properties-param>
+ <name>ref-addresses</name>
+ <description>ref-addresses</description>
+ <property name="driverClassName"
value="org.hsqldb.jdbcDriver" />
+ <property name="url"
value="jdbc:hsqldb:file:target/temp/data/jdbcjcr_to_rest_repo_2" />
+ <property name="username" value="sa" />
+ <property name="password" value="" />
+ </properties-param>
+ </init-params>
+ </component-plugin>
</external-component-plugins>
</configuration>
Modified:
jcr/trunk/component/ext/src/test/java/org/exoplatform/services/jcr/ext/repository/RestRepositoryServiceTest.java
===================================================================
---
jcr/trunk/component/ext/src/test/java/org/exoplatform/services/jcr/ext/repository/RestRepositoryServiceTest.java 2009-08-31
08:56:32 UTC (rev 115)
+++
jcr/trunk/component/ext/src/test/java/org/exoplatform/services/jcr/ext/repository/RestRepositoryServiceTest.java 2009-08-31
15:06:37 UTC (rev 116)
@@ -25,6 +25,9 @@
import java.util.ArrayList;
import java.util.Iterator;
+import javax.jcr.NoSuchWorkspaceException;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
import javax.ws.rs.core.MultivaluedMap;
import org.exoplatform.services.jcr.config.ContainerEntry;
@@ -32,6 +35,7 @@
import org.exoplatform.services.jcr.config.RepositoryEntry;
import org.exoplatform.services.jcr.config.SimpleParameterEntry;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
+import org.exoplatform.services.jcr.core.CredentialsImpl;
import org.exoplatform.services.jcr.ext.BaseStandaloneTest;
import org.exoplatform.services.jcr.ext.app.SessionProviderService;
import org.exoplatform.services.jcr.ext.app.ThreadLocalSessionProviderService;
@@ -188,7 +192,7 @@
rEntry.setSystemWorkspaceName(wsName);
WorkspaceEntry wEntry =
- makeWorkspaceEntry(rDefault.getWorkspaceEntries().get(0), rName, wsName,
"jdbcjcr_to_rest_repo");
+ makeWorkspaceEntry(rDefault.getWorkspaceEntries().get(0), rName, wsName,
"jdbcjcr_to_rest_repo", false);
rEntry.addWorkspace(wEntry);
JsonGeneratorImpl generatorImpl = new JsonGeneratorImpl();
@@ -199,22 +203,140 @@
ContainerRequestUserRole creq =
new ContainerRequestUserRole("POST", new
URI(REST_REPOSITORY_SERVICE_PATH
- + RestRepositoryService.Constants.OperationType.NEW_REPOSITORY),
new URI(""),
+ +
RestRepositoryService.Constants.OperationType.CREATE_REPOSITORY), new URI(""),
new
ByteArrayInputStream(json.toString().getBytes("UTF-8")), new
InputHeadersMap(headers));
ByteArrayContainerResponseWriter responseWriter = new
ByteArrayContainerResponseWriter();
ContainerResponse cres = new ContainerResponse(responseWriter);
handler.handleRequest(creq, cres);
- assertEquals(201, cres.getStatus());
+ assertEquals(200, cres.getStatus());
- URI location = (URI) getObject(URI.class, responseWriter.getBody());
-
- assertNotNull(location);
+ //TODO
// assertEquals(repositoryService.getConfig().getDefaultRepositoryName(),
repositoryConf.getDefaultRepositoryName());
//
assertEquals(repositoryService.getConfig().getRepositoryConfigurations().size(),
repositoryConf.getRepositories().size());
}
+ public void testCreateWorkspace() throws Exception
+ {
+ String wsName = "ws_over_rest";
+
+ WorkspaceEntry wEntry =
+
makeWorkspaceEntry(repositoryService.getDefaultRepository().getConfiguration().getWorkspaceEntries()
+ .get(0), "db1", wsName,
"jdbcjcr_to_rest_repo_2", true);
+
+ JsonGeneratorImpl generatorImpl = new JsonGeneratorImpl();
+ JsonValue json = generatorImpl.createJsonObject(wEntry);
+
+ MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
+ headers.putSingle("Content-Type", "application/json;
charset=UTF-8");
+
+ ContainerRequestUserRole creq =
+ new ContainerRequestUserRole("POST", new
URI(REST_REPOSITORY_SERVICE_PATH
+ + RestRepositoryService.Constants.OperationType.CREATE_WORKSPACE
+ "/"
+ +
repositoryService.getDefaultRepository().getConfiguration().getName()), new
URI(""),
+ new
ByteArrayInputStream(json.toString().getBytes("UTF-8")), new
InputHeadersMap(headers));
+
+ ByteArrayContainerResponseWriter responseWriter = new
ByteArrayContainerResponseWriter();
+ ContainerResponse cres = new ContainerResponse(responseWriter);
+ handler.handleRequest(creq, cres);
+
+ assertEquals(200, cres.getStatus());
+
+ Session session =
+ repositoryService.getDefaultRepository().login(new
CredentialsImpl("root", "exo".toCharArray()),
+ "ws_over_rest");
+ assertNotNull(session);
+ assertNotNull(session.getRootNode());
+
+ session.logout();
+ }
+
+ public void testRemoveWorkspace() throws Exception
+ {
+ Session session = repositoryService.getDefaultRepository().login(new
CredentialsImpl("root", "exo".toCharArray()),
+ "ws_over_rest");
+ assertNotNull(session);
+ assertNotNull(session.getRootNode());
+
+ String wsName = "ws_over_rest";
+ String repoName =
repositoryService.getDefaultRepository().getConfiguration().getName();
+
+ MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
+
+ ContainerRequestUserRole creq =
+ new ContainerRequestUserRole("POST", new
URI(REST_REPOSITORY_SERVICE_PATH
+ + RestRepositoryService.Constants.OperationType.REMOVE_WORKSPACE
+ "/"
+ + repoName + "/" + wsName + "/false/"), new
URI(""), null, new InputHeadersMap(headers));
+
+ ByteArrayContainerResponseWriter responseWriter = new
ByteArrayContainerResponseWriter();
+ ContainerResponse cres = new ContainerResponse(responseWriter);
+ handler.handleRequest(creq, cres);
+
+ assertEquals(409, cres.getStatus());
+
+ //remove with prepare close sessions
+ creq =
+ new ContainerRequestUserRole("POST", new
URI(REST_REPOSITORY_SERVICE_PATH
+ + RestRepositoryService.Constants.OperationType.REMOVE_WORKSPACE +
"/"
+ + repoName + "/" + wsName + "/true/"), new
URI(""), null, new InputHeadersMap(headers));
+
+ responseWriter = new ByteArrayContainerResponseWriter();
+ cres = new ContainerResponse(responseWriter);
+ handler.handleRequest(creq, cres);
+
+ assertEquals(204, cres.getStatus());
+
+ try {
+ repositoryService.getDefaultRepository().login(new
CredentialsImpl("root", "exo".toCharArray()),
"ws_over_rest");
+ fail("The workspace /" + repoName + "/" + wsName +
"should be removed. ");
+ } catch (NoSuchWorkspaceException e) {
+ //ok.
+ }
+ }
+
+ public void testRemoveRepository() throws Exception
+ {
+ String wsName = "ws";
+ String repoName = "db2";
+
+ Session session = repositoryService.getRepository(repoName).login(new
CredentialsImpl("root", "exo".toCharArray()), wsName);
+ assertNotNull(session);
+ assertNotNull(session.getRootNode());
+
+ MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
+
+ ContainerRequestUserRole creq =
+ new ContainerRequestUserRole("POST", new
URI(REST_REPOSITORY_SERVICE_PATH
+ + RestRepositoryService.Constants.OperationType.REMOVE_REPOSITORY
+ "/"
+ + repoName + "/false/"), new URI(""), null,
new InputHeadersMap(headers));
+
+ ByteArrayContainerResponseWriter responseWriter = new
ByteArrayContainerResponseWriter();
+ ContainerResponse cres = new ContainerResponse(responseWriter);
+ handler.handleRequest(creq, cres);
+
+ assertEquals(409, cres.getStatus());
+
+ //remove with prepare close sessions
+ creq =
+ new ContainerRequestUserRole("POST", new
URI(REST_REPOSITORY_SERVICE_PATH
+ + RestRepositoryService.Constants.OperationType.REMOVE_REPOSITORY +
"/"
+ + repoName + "/true/"), new URI(""), null, new
InputHeadersMap(headers));
+
+ responseWriter = new ByteArrayContainerResponseWriter();
+ cres = new ContainerResponse(responseWriter);
+ handler.handleRequest(creq, cres);
+
+ assertEquals(204, cres.getStatus());
+
+ try {
+ repositoryService.getRepository(repoName);
+ fail("The repository /" + repoName + "should be removed. ");
+ } catch (RepositoryException e) {
+ //ok.
+ }
+ }
+
/**
* Will be created the Object from JSON binary data.
*
@@ -238,7 +360,7 @@
}
protected WorkspaceEntry makeWorkspaceEntry(WorkspaceEntry defWEntry, String repoNmae,
String wsName,
- String sourceName)
+ String sourceName, boolean multiDb)
{
WorkspaceEntry ws1back = new WorkspaceEntry();
ws1back.setName(wsName);
@@ -268,7 +390,7 @@
else if (newp.getName().equals("swap-directory"))
newp.setValue("target/temp/swap/" + wsName);
else if (newp.getName().equals("multi-db"))
- newp.setValue("false");
+ newp.setValue(Boolean.toString(multiDb));
params.add(newp);
}