You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ace.apache.org by ma...@apache.org on 2011/07/25 17:06:37 UTC
svn commit: r1150740 - in
/incubator/ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest:
RESTClientServlet.java Workspace.java
Author: marrs
Date: Mon Jul 25 15:06:36 2011
New Revision: 1150740
URL: http://svn.apache.org/viewvc?rev=1150740&view=rev
Log:
ACE-151 some fixes and refactoring
Modified:
incubator/ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/RESTClientServlet.java
incubator/ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/Workspace.java
Modified: incubator/ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/RESTClientServlet.java
URL: http://svn.apache.org/viewvc/incubator/ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/RESTClientServlet.java?rev=1150740&r1=1150739&r2=1150740&view=diff
==============================================================================
--- incubator/ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/RESTClientServlet.java (original)
+++ incubator/ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/RESTClientServlet.java Mon Jul 25 15:06:36 2011
@@ -22,9 +22,11 @@ import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
+import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
@@ -45,6 +47,7 @@ import com.google.gson.JsonPrimitive;
* Servlet that offers a REST client API.
*/
public class RESTClientServlet extends HttpServlet {
+ private static final long serialVersionUID = 5210711248294238039L;
/** Alias that redirects to the latest version automatically. */
private static final String LATEST_FOLDER = "latest";
/** Name of the folder where working copies are kept. */
@@ -61,8 +64,8 @@ public class RESTClientServlet extends H
public RESTClientServlet() {
m_gson = (new GsonBuilder())
- .registerTypeHierarchyAdapter(RepositoryObject.class, new RepositoryObjectSerializer())
- .create();
+ .registerTypeHierarchyAdapter(RepositoryObject.class, new RepositoryObjectSerializer())
+ .create();
}
@Override
@@ -71,6 +74,7 @@ public class RESTClientServlet extends H
if (pathElements == null || pathElements.length == 0) {
// TODO return a list of versions
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, "Not implemented: list of versions");
+ return;
}
else {
if (pathElements.length == 1) {
@@ -78,6 +82,7 @@ public class RESTClientServlet extends H
// TODO redirect to latest version
// resp.sendRedirect("notImplemented" /* to latest version */);
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, "Not implemented: redirect to latest version");
+ return;
}
}
else if (pathElements.length == 3) {
@@ -94,6 +99,7 @@ public class RESTClientServlet extends H
return;
}
resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Could not find workspace: " + pathElements[1]);
+ return;
}
}
else if (pathElements.length == 4) {
@@ -104,16 +110,19 @@ public class RESTClientServlet extends H
String entityId = pathElements[3];
RepositoryObject repositoryObject = workspace.getRepositoryObject(entityType, entityId);
if (repositoryObject == null) {
- // TODO not found
resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Repository object of type " + entityType + " and identity " + entityId + " not found.");
+ return;
}
resp.getWriter().println(m_gson.toJson(repositoryObject));
return;
}
resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Could not find workspace: " + pathElements[1]);
+ return;
}
}
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND);
+ return;
}
}
@@ -138,7 +147,7 @@ public class RESTClientServlet extends H
}
m_sessionFactory.createSession(sessionID);
m_dm.add(component);
- resp.sendRedirect(WORK_FOLDER + "/" + sessionID);
+ resp.sendRedirect(buildPathFromElements(WORK_FOLDER, sessionID));
return;
}
}
@@ -169,7 +178,7 @@ public class RESTClientServlet extends H
try {
RepositoryValueObject data = m_gson.fromJson(req.getReader(), RepositoryValueObject.class);
RepositoryObject object = workspace.addRepositoryObject(pathElements[2], data.attributes, data.tags);
- resp.sendRedirect(WORK_FOLDER + "/" + pathElements[1] + "/" + pathElements[2] + "/" + URLEncoder.encode(object.getAssociationFilter(null), "UTF-8"));
+ resp.sendRedirect(buildPathFromElements(WORK_FOLDER, pathElements[1], pathElements[2], object.getAssociationFilter(null)));
return;
}
catch (IllegalArgumentException e) {
@@ -177,9 +186,12 @@ public class RESTClientServlet extends H
}
}
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Could not add entity of type " + pathElements[2]);
+ return;
}
}
}
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND);
+ return;
}
@Override
@@ -188,15 +200,28 @@ public class RESTClientServlet extends H
if (pathElements != null) {
if (pathElements.length == 4) {
if (pathElements[0].equals(WORK_FOLDER)) {
- long id = Long.parseLong(pathElements[1]);
- // TODO check if pE[2] is one of the entities we know
- long entityId = Long.parseLong(pathElements[3]);
- // TODO check if pE[3] is a valid entity id, update it if it is
+ Workspace workspace = getWorkspace(pathElements[1]);
+ if (workspace != null) {
+ try {
+ RepositoryValueObject data = m_gson.fromJson(req.getReader(), RepositoryValueObject.class);
+ RepositoryObject object = workspace.getRepositoryObject(pathElements[2], pathElements[3]);
+ updateObjectWithData(object, data);
+ resp.sendRedirect(buildPathFromElements(WORK_FOLDER, pathElements[1], pathElements[2], pathElements[3]));
+ return;
+ }
+ catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ }
+ }
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Could not add entity of type " + pathElements[2]);
+ return;
}
}
}
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND);
+ return;
}
-
+
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String[] pathElements = getPathElements(req);
@@ -214,21 +239,39 @@ public class RESTClientServlet extends H
// TODO delete the work area
m_dm.remove(component);
m_sessionFactory.destroySession(id);
+ return;
}
else {
- // return error
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Could not delete work area.");
+ return;
}
}
}
else if (pathElements.length == 4) {
if (WORK_FOLDER.equals(pathElements[0])) {
- long id = Long.parseLong(pathElements[1]);
- // TODO check if pE[2] is one of the entities we know
- long entityId = Long.parseLong(pathElements[3]);
- // TODO check if pE[3] is a valid entity id and delete it if it is
+ String id = pathElements[1];
+ String entityType = pathElements[2];
+ String entityId = pathElements[3];
+
+ Workspace workspace;
+ Component component;
+ synchronized (m_workspaces) {
+ workspace = m_workspaces.get(id);
+ }
+ if (workspace != null) {
+ workspace.deleteRepositoryObject(entityType, entityId);
+ return;
+ }
+ else {
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Could not find work area.");
+ return;
+ }
+
}
}
}
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND);
+ return;
}
private Workspace getWorkspace(String id) {
@@ -238,9 +281,38 @@ public class RESTClientServlet extends H
}
return workspace;
}
+
+ /**
+ * Builds a URL path from the supplied elements. Each individual element is URL encoded.
+ *
+ * @param elements the elements
+ * @return the URL path
+ */
+ private String buildPathFromElements(String... elements) {
+ StringBuilder result = new StringBuilder();
+ for (String element : elements) {
+ if (result.length() > 0) {
+ result.append('/');
+ }
+ try {
+ result.append(URLEncoder.encode(element, "UTF-8"));
+ }
+ catch (UnsupportedEncodingException e) {} // ignored on purpose, any JVM must support UTF-8
+ }
+ return result.toString();
+ }
+ /**
+ * Returns the separate path parts from the request, and URL decodes them.
+ *
+ * @param req the request
+ * @return the separate path parts
+ */
private String[] getPathElements(HttpServletRequest req) {
String path = req.getPathInfo();
+ if (path == null) {
+ return new String[0];
+ }
if (path.startsWith("/") && path.length() > 1) {
path = path.substring(1);
}
@@ -256,4 +328,41 @@ public class RESTClientServlet extends H
catch (UnsupportedEncodingException e) {}
return pathElements;
}
+
+ private void updateObjectWithData(RepositoryObject repositoryObject, RepositoryValueObject valueObject) {
+ // first handle the attributes
+ for (Entry<String, String> attribute : valueObject.attributes.entrySet()) {
+ String key = attribute.getKey();
+ String value = attribute.getValue();
+ // only add/update the attribute if it actually changed
+ if (!value.equals(repositoryObject.getAttribute(key))) {
+ repositoryObject.addAttribute(key, value);
+ }
+ }
+ Enumeration<String> keys = repositoryObject.getAttributeKeys();
+ while (keys.hasMoreElements()) {
+ String key = keys.nextElement();
+ if (!valueObject.attributes.containsKey(key)) {
+ // TODO since we cannot remove keys right now, we null them
+ repositoryObject.addAttribute(key, null);
+ }
+ }
+ // now handle the tags in a similar way
+ for (Entry<String, String> attribute : valueObject.tags.entrySet()) {
+ String key = attribute.getKey();
+ String value = attribute.getValue();
+ // only add/update the tag if it actually changed
+ if (!value.equals(repositoryObject.getTag(key))) {
+ repositoryObject.addTag(key, value);
+ }
+ }
+ keys = repositoryObject.getTagKeys();
+ while (keys.hasMoreElements()) {
+ String key = keys.nextElement();
+ if (!valueObject.tags.containsKey(key)) {
+ // TODO since we cannot remove keys right now, we null them
+ repositoryObject.addTag(key, null);
+ }
+ }
+ }
}
Modified: incubator/ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/Workspace.java
URL: http://svn.apache.org/viewvc/incubator/ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/Workspace.java?rev=1150740&r1=1150739&r2=1150740&view=diff
==============================================================================
--- incubator/ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/Workspace.java (original)
+++ incubator/ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/Workspace.java Mon Jul 25 15:06:36 2011
@@ -24,9 +24,11 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
+import org.apache.ace.client.repository.ObjectRepository;
import org.apache.ace.client.repository.RepositoryAdmin;
import org.apache.ace.client.repository.RepositoryObject;
import org.apache.ace.client.repository.SessionFactory;
+import org.apache.ace.client.repository.object.ArtifactObject;
import org.apache.ace.client.repository.repository.Artifact2GroupAssociationRepository;
import org.apache.ace.client.repository.repository.ArtifactRepository;
import org.apache.ace.client.repository.repository.GatewayRepository;
@@ -144,27 +146,7 @@ public class Workspace {
try {
List list = null;
Filter filter = FrameworkUtil.createFilter(entityId);
- if (ARTIFACT.equals(entityType)) {
- list = m_artifactRepository.get(filter);
- }
- if (ARTIFACT2FEATURE.equals(entityType)) {
- list = m_artifact2FeatureAssociationRepository.get(filter);
- }
- if (FEATURE.equals(entityType)) {
- list = m_featureRepository.get(filter);
- }
- if (FEATURE2DISTRIBUTION.equals(entityType)) {
- list = m_feature2DistributionAssociationRepository.get(filter);
- }
- if (DISTRIBUTION.equals(entityType)) {
- list = m_distributionRepository.get(filter);
- }
- if (DISTRIBUTION2TARGET.equals(entityType)) {
- list = m_distribution2TargetAssociationRepository.get(filter);
- }
- if (TARGET.equals(entityType)) {
- list = m_statefulTargetRepository.get(filter);
- }
+ list = getObjectRepository(entityType).get(filter);
if (list != null && list.size() == 1) {
return (RepositoryObject) list.get(0);
}
@@ -176,28 +158,7 @@ public class Workspace {
}
public List<RepositoryObject> getRepositoryObjects(String entityType) {
- List list = null;
- if (ARTIFACT.equals(entityType)) {
- list = m_artifactRepository.get();
- }
- if (ARTIFACT2FEATURE.equals(entityType)) {
- list = m_artifact2FeatureAssociationRepository.get();
- }
- if (FEATURE.equals(entityType)) {
- list = m_featureRepository.get();
- }
- if (FEATURE2DISTRIBUTION.equals(entityType)) {
- list = m_feature2DistributionAssociationRepository.get();
- }
- if (DISTRIBUTION.equals(entityType)) {
- list = m_distributionRepository.get();
- }
- if (DISTRIBUTION2TARGET.equals(entityType)) {
- list = m_distribution2TargetAssociationRepository.get();
- }
- if (TARGET.equals(entityType)) {
- list = m_statefulTargetRepository.get();
- }
+ List list = getObjectRepository(entityType).get();
if (list != null) {
return list;
}
@@ -207,29 +168,46 @@ public class Workspace {
}
public RepositoryObject addRepositoryObject(String entityType, Map<String, String> attributes, Map<String, String> tags) throws IllegalArgumentException{
+ return getObjectRepository(entityType).create(attributes, tags);
+ }
+
+ public void deleteRepositoryObject(String entityType, String entityId) {
+ RepositoryObject result = null;
+ try {
+ List list = null;
+ Filter filter = FrameworkUtil.createFilter(entityId);
+ ObjectRepository objectRepository = getObjectRepository(entityType);
+ list = objectRepository.get(filter);
+ if (list != null && list.size() == 1) {
+ objectRepository.remove((RepositoryObject) list.get(0));
+ }
+ }
+ catch (InvalidSyntaxException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private ObjectRepository getObjectRepository(String entityType) {
if (ARTIFACT.equals(entityType)) {
- return m_artifactRepository.create(attributes, tags);
+ return m_artifactRepository;
}
if (ARTIFACT2FEATURE.equals(entityType)) {
- // TODO this is a fairly low level way to create associations
- return m_artifact2FeatureAssociationRepository.create(attributes, tags);
+ return m_artifact2FeatureAssociationRepository;
}
if (FEATURE.equals(entityType)) {
- return m_featureRepository.create(attributes, tags);
+ return m_featureRepository;
}
if (FEATURE2DISTRIBUTION.equals(entityType)) {
- // TODO this is a fairly low level way to create associations
- return m_feature2DistributionAssociationRepository.create(attributes, tags);
+ return m_feature2DistributionAssociationRepository;
}
if (DISTRIBUTION.equals(entityType)) {
- return m_distributionRepository.create(attributes, tags);
+ return m_distributionRepository;
}
if (DISTRIBUTION2TARGET.equals(entityType)) {
- // TODO this is a fairly low level way to create associations
- return m_distribution2TargetAssociationRepository.create(attributes, tags);
+ return m_distribution2TargetAssociationRepository;
}
if (TARGET.equals(entityType)) {
- return m_targetRepository.create(attributes, tags);
+ return m_targetRepository;
}
throw new IllegalArgumentException("Unknown entity type: " + entityType);
}