You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ace.apache.org by ja...@apache.org on 2012/03/28 18:19:46 UTC
svn commit: r1306451 -
/ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/RepositoryObjectSerializer.java
Author: jawi
Date: Wed Mar 28 16:19:45 2012
New Revision: 1306451
URL: http://svn.apache.org/viewvc?rev=1306451&view=rev
Log:
ACE-164: ensure that unregistered targets can be retrieved through the REST interface.
Modified:
ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/RepositoryObjectSerializer.java
Modified: ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/RepositoryObjectSerializer.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/RepositoryObjectSerializer.java?rev=1306451&r1=1306450&r2=1306451&view=diff
==============================================================================
--- ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/RepositoryObjectSerializer.java (original)
+++ ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/RepositoryObjectSerializer.java Wed Mar 28 16:19:45 2012
@@ -19,19 +19,12 @@
package org.apache.ace.client.rest;
import java.lang.reflect.Type;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Dictionary;
import java.util.Enumeration;
-import java.util.List;
import org.apache.ace.client.repository.RepositoryObject;
import org.apache.ace.client.repository.object.ArtifactObject;
import org.apache.ace.client.repository.object.DeploymentArtifact;
import org.apache.ace.client.repository.stateful.StatefulTargetObject;
-import org.apache.ace.log.AuditEvent;
-import org.apache.ace.log.LogEvent;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
@@ -41,103 +34,143 @@ import com.google.gson.JsonSerialization
import com.google.gson.JsonSerializer;
/**
- *
+ * Provides an object serializer for the entire type hierarchy of {@link RepositoryObject}s.
*/
public class RepositoryObjectSerializer implements JsonSerializer<RepositoryObject> {
+
+ /** used in all repository objects. */
+ private static final String TAGS = "tags";
+ /** used in all repository objects. */
+ private static final String ATTRIBUTES = "attributes";
+ /** used in stateful target objects only. */
+ private static final String STATE = "state";
+
+ private static final String REGISTRATION_STATE = "registrationState";
+ private static final String CURRENT_VERSION = "currentVersion";
+ private static final String STORE_STATE = "storeState";
+ private static final String PROVISIONING_STATE = "provisioningState";
+ private static final String IS_REGISTERED = "isRegistered";
+ private static final String NEEDS_APPROVAL = "needsApproval";
+ private static final String AUTO_APPROVE = "autoApprove";
+ private static final String ARTIFACTS_FROM_SHOP = "artifactsFromShop";
+ private static final String ARTIFACTS_FROM_DEPLOYMENT = "artifactsFromDeployment";
+ private static final String LAST_INSTALL_VERSION = "lastInstallVersion";
+ private static final String LAST_INSTALL_SUCCESS = "lastInstallSuccess";
+
+ /**
+ * @see com.google.gson.JsonSerializer#serialize(java.lang.Object, java.lang.reflect.Type, com.google.gson.JsonSerializationContext)
+ */
public JsonElement serialize(RepositoryObject repositoryObject, Type featureType, JsonSerializationContext context) {
+ // ACE-164: for stateful target objects we need some special measures to serialize it...
+ if (repositoryObject instanceof StatefulTargetObject) {
+ return serializeStatefulTargetObject((StatefulTargetObject) repositoryObject);
+ }
+
+ // All other repository objects can be simply serialized...
+ return serializeRepositoryObject(repositoryObject);
+ }
+
+ /**
+ * Custom serializer method for {@link StatefulTargetObject}s, as they have state and cannot be accessed
+ * always in the same way as other repository objects. For example, when dealing with unregistered targets,
+ * we cannot ask for the attributes and/or tags of a target.
+ *
+ * @param targetObject the target object to serialize, cannot be <code>null</code>.
+ * @return a JSON representation of the given target object, never <code>null</code>.
+ */
+ private JsonElement serializeStatefulTargetObject(StatefulTargetObject targetObject) {
JsonObject result = new JsonObject();
// first add all attributes
- Enumeration<String> keys = repositoryObject.getAttributeKeys();
JsonObject attr = new JsonObject();
- while (keys.hasMoreElements()) {
- String key = keys.nextElement();
- attr.addProperty(key, repositoryObject.getAttribute(key));
+
+ if (targetObject.isRegistered()) {
+ Enumeration<String> keys = targetObject.getAttributeKeys();
+ while (keys.hasMoreElements()) {
+ String key = keys.nextElement();
+ attr.addProperty(key, targetObject.getAttribute(key));
+ }
}
- result.add("attributes", attr);
+ else {
+ // Ensure that the ID of the target is always present as attribute...
+ attr.addProperty(StatefulTargetObject.KEY_ID, targetObject.getID());
+ }
+
+ result.add(ATTRIBUTES, attr);
+
// then add all tags
- keys = repositoryObject.getTagKeys();
JsonObject tags = new JsonObject();
- while (keys.hasMoreElements()) {
- String key = keys.nextElement();
- tags.addProperty(key, repositoryObject.getTag(key));
+
+ if (targetObject.isRegistered()) {
+ Enumeration<String> keys = targetObject.getTagKeys();
+ while (keys.hasMoreElements()) {
+ String key = keys.nextElement();
+ tags.addProperty(key, targetObject.getTag(key));
+ }
}
- result.add("tags", tags);
+
+ result.add(TAGS, tags);
+
// finally, if it's a target with state, add that as well
- if (repositoryObject instanceof StatefulTargetObject) {
- StatefulTargetObject stateful = (StatefulTargetObject) repositoryObject;
- JsonObject state = new JsonObject();
- state.addProperty("registrationState", stateful.getRegistrationState().name());
- state.addProperty("provisioningState", stateful.getProvisioningState().name());
- state.addProperty("storeState", stateful.getStoreState().name());
- state.addProperty("currentVersion", stateful.getCurrentVersion());
- state.addProperty("isRegistered", Boolean.toString(stateful.isRegistered()));
- state.addProperty("needsApproval", Boolean.toString(stateful.needsApprove()));
- state.addProperty("autoApprove", Boolean.toString(stateful.getAutoApprove()));
- JsonArray artifactsFromShop = new JsonArray();
- for (ArtifactObject a : stateful.getArtifactsFromShop()) {
- artifactsFromShop.add(new JsonPrimitive(a.getDefinition()));
- }
- state.add("artifactsFromShop", artifactsFromShop);
- JsonArray artifactsFromDeployment = new JsonArray();
- for (DeploymentArtifact a : stateful.getArtifactsFromDeployment()) {
- artifactsFromDeployment.add(new JsonPrimitive(a.getUrl()));
- }
- state.add("artifactsFromDeployment", artifactsFromDeployment);
- state.addProperty("lastInstallVersion", stateful.getLastInstallVersion());
- state.addProperty("lastInstallSuccess", stateful.getLastInstallSuccess());
- /* TODO getLicenses/AssocationsWith might not be that helpful since the data is also available in a different way */
- /* TODO some of this tends to show up as attributes as well, so we will need to do some filtering there */
- /* TODO some aspects of the state can be manipulated as well, we need to supply methods for that */
- result.add("state", state);
+ JsonObject state = new JsonObject();
+ state.addProperty(REGISTRATION_STATE, targetObject.getRegistrationState().name());
+ state.addProperty(PROVISIONING_STATE, targetObject.getProvisioningState().name());
+ state.addProperty(STORE_STATE, targetObject.getStoreState().name());
+ state.addProperty(CURRENT_VERSION, targetObject.getCurrentVersion());
+ state.addProperty(IS_REGISTERED, Boolean.toString(targetObject.isRegistered()));
+ state.addProperty(NEEDS_APPROVAL, Boolean.toString(targetObject.needsApprove()));
+ state.addProperty(AUTO_APPROVE, Boolean.toString(targetObject.getAutoApprove()));
+
+ JsonArray artifactsFromShop = new JsonArray();
+ for (ArtifactObject a : targetObject.getArtifactsFromShop()) {
+ artifactsFromShop.add(new JsonPrimitive(a.getDefinition()));
+ }
+ state.add(ARTIFACTS_FROM_SHOP, artifactsFromShop);
+
+ JsonArray artifactsFromDeployment = new JsonArray();
+ for (DeploymentArtifact a : targetObject.getArtifactsFromDeployment()) {
+ artifactsFromDeployment.add(new JsonPrimitive(a.getUrl()));
}
+ state.add(ARTIFACTS_FROM_DEPLOYMENT, artifactsFromDeployment);
+
+ state.addProperty(LAST_INSTALL_VERSION, targetObject.getLastInstallVersion());
+ state.addProperty(LAST_INSTALL_SUCCESS, targetObject.getLastInstallSuccess());
+
+ /* TODO getLicenses/AssocationsWith might not be that helpful since the data is also available in a different way */
+ /* TODO some of this tends to show up as attributes as well, so we will need to do some filtering there */
+ /* TODO some aspects of the state can be manipulated as well, we need to supply methods for that */
+ result.add(STATE, state);
+
return result;
}
- private JsonArray getAuditEvents(StatefulTargetObject stateful) {
- DateFormat format = SimpleDateFormat.getDateTimeInstance();
- List<LogEvent> auditEvents = stateful.getAuditEvents();
- JsonArray events = new JsonArray();
- for (LogEvent e : auditEvents) {
- JsonObject event = new JsonObject();
- event.addProperty("logId", e.getLogID());
- event.addProperty("id", e.getID());
- event.addProperty("time", format.format(new Date(e.getTime())));
- event.addProperty("type", toAuditEventType(e.getType()));
- JsonObject eventProperties = new JsonObject();
- Dictionary p = e.getProperties();
- Enumeration keyEnumeration = p.keys();
- while (keyEnumeration.hasMoreElements()) {
- Object key = keyEnumeration.nextElement();
- eventProperties.addProperty(key.toString(), p.get(key).toString());
- }
- event.add("properties", eventProperties);
- events.add(event);
+ /**
+ * Serializes a (non stateful target object) repository object to a JSON representation.
+ *
+ * @param repositoryObject the repository object to serialize, cannot be <code>null</code>.
+ * @return a JSON representation of the given repository object, never <code>null</code>.
+ */
+ private JsonElement serializeRepositoryObject(RepositoryObject repositoryObject) {
+ JsonObject result = new JsonObject();
+ // first add all attributes
+ JsonObject attr = new JsonObject();
+
+ Enumeration<String> keys = repositoryObject.getAttributeKeys();
+ while (keys.hasMoreElements()) {
+ String key = keys.nextElement();
+ attr.addProperty(key, repositoryObject.getAttribute(key));
}
- return events;
- }
+ result.add(ATTRIBUTES, attr);
+
+ // then add all tags
+ JsonObject tags = new JsonObject();
- private String toAuditEventType(int type) {
- switch (type) {
- case AuditEvent.BUNDLE_INSTALLED: return "bundle installed";
- case AuditEvent.BUNDLE_RESOLVED: return "bundle resolved";
- case AuditEvent.BUNDLE_STARTED: return "bundle started";
- case AuditEvent.BUNDLE_STOPPED: return "bundle stopped";
- case AuditEvent.BUNDLE_UNRESOLVED: return "bundle unresolved";
- case AuditEvent.BUNDLE_UPDATED: return "bundle updated";
- case AuditEvent.BUNDLE_UNINSTALLED: return "bundle uninstalled";
- case AuditEvent.BUNDLE_STARTING: return "bundle starting";
- case AuditEvent.BUNDLE_STOPPING: return "bundle stopping";
- case AuditEvent.FRAMEWORK_INFO: return "framework info";
- case AuditEvent.FRAMEWORK_WARNING: return "framework warning";
- case AuditEvent.FRAMEWORK_ERROR: return "framework error";
- case AuditEvent.FRAMEWORK_REFRESH: return "framework refresh";
- case AuditEvent.FRAMEWORK_STARTED: return "framework started";
- case AuditEvent.FRAMEWORK_STARTLEVEL: return "framework startlevel";
- case AuditEvent.DEPLOYMENTADMIN_INSTALL: return "deployment admin install";
- case AuditEvent.DEPLOYMENTADMIN_UNINSTALL: return "deployment admin uninstall";
- case AuditEvent.DEPLOYMENTADMIN_COMPLETE: return "deployment admin complete";
- case AuditEvent.DEPLOYMENTCONTROL_INSTALL: return "deployment control install";
- default: return Integer.toString(type);
+ keys = repositoryObject.getTagKeys();
+ while (keys.hasMoreElements()) {
+ String key = keys.nextElement();
+ tags.addProperty(key, repositoryObject.getTag(key));
}
+ result.add(TAGS, tags);
+
+ return result;
}
}
\ No newline at end of file