/*
* 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.jcr.ext.registry;
import org.exoplatform.services.jcr.ext.BaseStandaloneTest;
import org.exoplatform.services.jcr.ext.app.SessionProviderService;
import org.exoplatform.services.jcr.ext.common.SessionProvider;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.rest.ContainerResponseWriter;
import org.exoplatform.services.rest.GenericContainerResponse;
import org.exoplatform.services.rest.RequestHandler;
import org.exoplatform.services.rest.impl.ContainerRequest;
import org.exoplatform.services.rest.impl.ContainerResponse;
import org.exoplatform.services.rest.impl.InputHeadersMap;
import org.exoplatform.services.rest.impl.MultivaluedMapImpl;
import org.exoplatform.services.rest.impl.ResourceBinder;
import org.exoplatform.services.security.ConversationState;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
public class RESTRegistryTest extends BaseStandaloneTest
{
private static final Log log = ExoLogger.getLogger("exo.jcr.component.ext.RESTRegistryTest");
private SessionProviderService sessionProviderService;
private static final String SERVICE_XML =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<exo_service xmlns:jcr=\"http://www.jcp.org/jcr/1.0\" jcr:primaryType=\"exo:registryEntry\"/>";
private RESTRegistryService restRegService;
private ResourceBinder binder;
private RequestHandler handler;
private URI baseUri;
@Override
public void setUp() throws Exception
{
super.setUp();
this.sessionProviderService =
(SessionProviderService)container
.getComponentInstanceOfType(SessionProviderService.class);
sessionProviderService.setSessionProvider(null, new SessionProvider(ConversationState.getCurrent()));
restRegService = (RESTRegistryService)container.getComponentInstanceOfType(RESTRegistryService.class);
binder = (ResourceBinder)container.getComponentInstanceOfType(ResourceBinder.class);
handler = (RequestHandler)container.getComponentInstanceOfType(RequestHandler.class);
baseUri = new URI("http://localhost:8080/rest");
}
public void testRESTRegservice() throws Exception
{
assertNotNull(restRegService);
assertNotNull(binder);
assertNotNull(handler);
// List<ResourceClass> list = binder.getRootResources();
// assertEquals(1, list.size());
// assertEquals(3, list.get(0).getResourceMethods().size());
repositoryService.setCurrentRepositoryName("db1");
DummyContainerResponseWriter wr = new DummyContainerResponseWriter();
URI reqUri = new URI(baseUri.toString() + "/registry/");
ContainerResponse cres =
request(handler, wr, "GET", reqUri, baseUri, null, new InputHeadersMap(new MultivaluedMapImpl()));
assertEquals(200, cres.getStatus());
// request to exo:services/exo_service
// response status should be 404 (NOT_FOUND)
wr.reset();
reqUri = new URI(baseUri.toString() + "/registry/" + RegistryService.EXO_SERVICES + "/exo_service");
cres = request(handler, wr, "GET", reqUri, baseUri, null, new InputHeadersMap(new MultivaluedMapImpl()));
assertEquals(404, cres.getStatus());
assertNull(wr.getBody());
// create exo:services/exo_service
wr.reset();
reqUri = new URI(baseUri.toString() + "/registry/" + RegistryService.EXO_SERVICES);
cres =
request(handler, wr, "POST", reqUri, baseUri, SERVICE_XML.getBytes(), new InputHeadersMap(
new MultivaluedMapImpl()));
assertEquals(201, cres.getStatus());
assertEquals(new URI(reqUri + "/exo_service"), wr.getHeaders().getFirst(HttpHeaders.LOCATION));
// request to exo:services/exo_service
wr.reset();
reqUri = new URI(baseUri.toString() + "/registry/" + RegistryService.EXO_SERVICES + "/exo_service");
cres = request(handler, wr, "GET", reqUri, baseUri, null, new InputHeadersMap(new MultivaluedMapImpl()));
assertEquals(200, cres.getStatus());
// recreate exo:services/exo_service
wr.reset();
reqUri = new URI(baseUri.toString() + "/registry/" + RegistryService.EXO_SERVICES);
cres =
request(handler, wr, "PUT", reqUri, baseUri, SERVICE_XML.getBytes(), new InputHeadersMap(
new MultivaluedMapImpl()));
assertEquals(201, cres.getStatus());
assertEquals(new URI(reqUri + "/exo_service"), wr.getHeaders().getFirst(HttpHeaders.LOCATION));
// delete exo:services/exo_service
wr.reset();
reqUri = new URI(baseUri.toString() + "/registry/" + RegistryService.EXO_SERVICES + "/exo_service");
cres = request(handler, wr, "DELETE", reqUri, baseUri, null, new InputHeadersMap(new MultivaluedMapImpl()));
assertEquals(204, cres.getStatus());
// request to exo:services/exo_service
// request status should be 404 (NOT_FOUND)
wr.reset();
reqUri = new URI(baseUri.toString() + "/registry/" + RegistryService.EXO_SERVICES + "/exo_service");
cres = request(handler, wr, "GET", reqUri, baseUri, null, new InputHeadersMap(new MultivaluedMapImpl()));
assertEquals(404, cres.getStatus());
assertNull(wr.getBody());
}
public void testCreateGetEntry() throws Exception
{
DummyContainerResponseWriter wr = new DummyContainerResponseWriter();
InputStream in = new RegistryEntry("test").getAsInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream();
int rd = -1;
while ((rd = in.read()) != -1)
{
out.write(rd);
}
byte[] data = out.toByteArray();
repositoryService.setCurrentRepositoryName("db1");
// check for exo:services/group/test
// response status should be 404 (NOT_FOUND)
URI reqUri = new URI(baseUri.toString() + "/registry/" + RegistryService.EXO_SERVICES + "/group/test");
ContainerResponse cres =
request(handler, wr, "GET", reqUri, baseUri, null, new InputHeadersMap(new MultivaluedMapImpl()));
assertEquals(404, cres.getStatus());
assertNull(wr.getBody());
// create exo:services/group/test
wr.reset();
reqUri = new URI(baseUri.toString() + "/registry/" + RegistryService.EXO_SERVICES + "/group/");
cres = request(handler, wr, "POST", reqUri, baseUri, data, new InputHeadersMap(new MultivaluedMapImpl()));
assertEquals(201, cres.getStatus());
assertEquals(new URI(reqUri + "test"), wr.getHeaders().getFirst(HttpHeaders.LOCATION));
// check again for exo:services/group/test
wr.reset();
reqUri = new URI(baseUri.toString() + "/registry/" + RegistryService.EXO_SERVICES + "/group/test");
cres = request(handler, wr, "GET", reqUri, baseUri, null, new InputHeadersMap(new MultivaluedMapImpl()));
assertEquals(200, cres.getStatus());
// remove
wr.reset();
reqUri = new URI(baseUri.toString() + "/registry/" + RegistryService.EXO_SERVICES + "/group/");
cres = request(handler, wr, "DELETE", reqUri, baseUri, null, new InputHeadersMap(new MultivaluedMapImpl()));
assertEquals(204, cres.getStatus());
// check for exo:services/group/test
// response status should be 404 (NOT_FOUND)
wr.reset();
reqUri = new URI(baseUri.toString() + "/registry/" + RegistryService.EXO_SERVICES + "/group/test");
cres = request(handler, wr, "GET", reqUri, baseUri, null, new InputHeadersMap(new MultivaluedMapImpl()));
assertEquals(404, cres.getStatus());
assertNull(wr.getBody());
}
private static ContainerResponse request(RequestHandler handler, ContainerResponseWriter wr, String method,
URI reqUri, URI baseUri, byte[] data, InputHeadersMap headers) throws Exception
{
InputStream in = data != null ? new ByteArrayInputStream(data) : null;
ContainerRequest creq = new ContainerRequest(method, reqUri, baseUri, in, headers);
ContainerResponse cres = new ContainerResponse(wr);
handler.handleRequest(creq, cres);
return cres;
}
public static class DummyContainerResponseWriter implements ContainerResponseWriter
{
private byte[] body;
private MultivaluedMap<String, Object> headers;
@SuppressWarnings("unchecked")
public void writeBody(GenericContainerResponse response, MessageBodyWriter entityWriter) throws IOException
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
Object entity = response.getEntity();
if (entity != null)
{
entityWriter.writeTo(entity, entity.getClass(), response.getEntityType(), null, response.getContentType(),
response.getHttpHeaders(), out);
body = out.toByteArray();
}
}
public void writeHeaders(GenericContainerResponse response) throws IOException
{
headers = response.getHttpHeaders();
}
public byte[] getBody()
{
return body;
}
public MultivaluedMap<String, Object> getHeaders()
{
return headers;
}
public void reset()
{
body = null;
headers = null;
}
}
}