From f5489e3e424e549b61ccc1a584c5374047edf9cb Mon Sep 17 00:00:00 2001 From: "Brian M. Long" Date: Tue, 31 Aug 2021 22:02:19 -0400 Subject: [PATCH] added v0 support --- .../alfresco/acs/AcsPublicRestApi.java | 5 + .../com/inteligr8/alfresco/acs/api/V0Api.java | 92 ++++++++++++ .../acs/model/v0/AssociationInfo.java | 106 ++++++++++++++ .../alfresco/acs/model/v0/ClassInfo.java | 135 ++++++++++++++++++ .../alfresco/acs/model/v0/ConstraintInfo.java | 34 +++++ .../alfresco/acs/model/v0/MimeTypeInfo.java | 66 +++++++++ .../alfresco/acs/model/v0/MimeTypesData.java | 22 +++ .../alfresco/acs/model/v0/MimeTypesMap.java | 21 +++ .../alfresco/acs/model/v0/NamedObject.java | 44 ++++++ .../alfresco/acs/model/v0/PropertyInfo.java | 104 ++++++++++++++ .../alfresco/acs/model/v0/ServerData.java | 22 +++ .../alfresco/acs/model/v0/ServerInfo.java | 44 ++++++ .../alfresco/acs/ConnectionClientIT.java | 54 +++++++ 13 files changed, 749 insertions(+) create mode 100755 src/main/java/com/inteligr8/alfresco/acs/api/V0Api.java create mode 100755 src/main/java/com/inteligr8/alfresco/acs/model/v0/AssociationInfo.java create mode 100755 src/main/java/com/inteligr8/alfresco/acs/model/v0/ClassInfo.java create mode 100755 src/main/java/com/inteligr8/alfresco/acs/model/v0/ConstraintInfo.java create mode 100755 src/main/java/com/inteligr8/alfresco/acs/model/v0/MimeTypeInfo.java create mode 100755 src/main/java/com/inteligr8/alfresco/acs/model/v0/MimeTypesData.java create mode 100755 src/main/java/com/inteligr8/alfresco/acs/model/v0/MimeTypesMap.java create mode 100755 src/main/java/com/inteligr8/alfresco/acs/model/v0/NamedObject.java create mode 100755 src/main/java/com/inteligr8/alfresco/acs/model/v0/PropertyInfo.java create mode 100755 src/main/java/com/inteligr8/alfresco/acs/model/v0/ServerData.java create mode 100755 src/main/java/com/inteligr8/alfresco/acs/model/v0/ServerInfo.java mode change 100644 => 100755 src/test/java/com/inteligr8/alfresco/acs/ConnectionClientIT.java diff --git a/src/main/java/com/inteligr8/alfresco/acs/AcsPublicRestApi.java b/src/main/java/com/inteligr8/alfresco/acs/AcsPublicRestApi.java index 27d6be3..8b0d48a 100644 --- a/src/main/java/com/inteligr8/alfresco/acs/AcsPublicRestApi.java +++ b/src/main/java/com/inteligr8/alfresco/acs/AcsPublicRestApi.java @@ -24,6 +24,7 @@ import com.inteligr8.alfresco.acs.api.SitesApi; import com.inteligr8.alfresco.acs.api.TagsApi; import com.inteligr8.alfresco.acs.api.TrashcanApi; import com.inteligr8.alfresco.acs.api.TypesApi; +import com.inteligr8.alfresco.acs.api.V0Api; import com.inteligr8.alfresco.acs.api.VersionsApi; import com.inteligr8.rs.ClientConfiguration; @@ -135,5 +136,9 @@ public abstract class AcsPublicRestApi { public VersionsApi getVersionsApi() { return this.getApi(VersionsApi.class); } + + public V0Api getV0Api() { + return this.getApi(V0Api.class); + } } diff --git a/src/main/java/com/inteligr8/alfresco/acs/api/V0Api.java b/src/main/java/com/inteligr8/alfresco/acs/api/V0Api.java new file mode 100755 index 0000000..97c734c --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/acs/api/V0Api.java @@ -0,0 +1,92 @@ +package com.inteligr8.alfresco.acs.api; + +import java.util.List; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; + +import com.inteligr8.alfresco.acs.model.v0.AssociationInfo; +import com.inteligr8.alfresco.acs.model.v0.ClassInfo; +import com.inteligr8.alfresco.acs.model.v0.MimeTypesData; +import com.inteligr8.alfresco.acs.model.v0.PropertyInfo; +import com.inteligr8.alfresco.acs.model.v0.ServerData; + +@Path("/service/api") +public interface V0Api { + + @GET + @Path("/server") + @Produces({ "application/json" }) + public ServerData getServer(); + + @GET + @Path("/mimetypes/descriptions") + @Produces({ "application/json" }) + public MimeTypesData getMimeTypes(); + + @GET + @Path("/defclasses") + @Produces({ "application/json" }) + public List getClasses( + @QueryParam("cf") String classFilter, + @QueryParam("nsp") String namespacePrefix, + @QueryParam("n") String name); + + @GET + @Path("/defclasses/{classPrefix}/{classLocalName}") + @Produces({ "application/json" }) + public ClassInfo getClass( + @PathParam("classPrefix") String classPrefix, + @PathParam("classLocalName") String classLocalName); + + @GET + @Path("/defclasses/{classPrefix}/{classLocalName}/subclasses") + @Produces({ "application/json" }) + public List getClassSubclasses( + @PathParam("classPrefix") String classPrefix, + @PathParam("classLocalName") String classLocalName); + + @GET + @Path("/defclasses/{classPrefix}/{classLocalName}/associations") + @Produces({ "application/json" }) + public List getClassAssociations( + @PathParam("classPrefix") String classPrefix, + @PathParam("classLocalName") String classLocalName); + + @GET + @Path("/defclasses/{classPrefix}/{classLocalName}/association/{assocPrefix}/{assocLocalName}") + @Produces({ "application/json" }) + public AssociationInfo getClassAssociation( + @PathParam("classPrefix") String classPrefix, + @PathParam("classLocalName") String classLocalName, + @PathParam("assocPrefix") String assocPrefix, + @PathParam("assocLocalName") String assocLocalName); + + @GET + @Path("/defclasses/{classPrefix}/{classLocalName}/properties") + @Produces({ "application/json" }) + public List getClassProperties( + @PathParam("classPrefix") String classPrefix, + @PathParam("classLocalName") String classLocalName); + + @GET + @Path("/defclasses/{classPrefix}/{classLocalName}/property/{propPrefix}/{propLocalName}") + @Produces({ "application/json" }) + public PropertyInfo getClassProperty( + @PathParam("classPrefix") String classPrefix, + @PathParam("classLocalName") String classLocalName, + @PathParam("propPrefix") String propPrefix, + @PathParam("propLocalName") String propLocalName); + + @GET + @Path("/properties") + @Produces({ "application/json" }) + public List getProperties( + @QueryParam("nsp") String namespacePrefix, + @QueryParam("name") String name, + @QueryParam("type") String dataType); + +} diff --git a/src/main/java/com/inteligr8/alfresco/acs/model/v0/AssociationInfo.java b/src/main/java/com/inteligr8/alfresco/acs/model/v0/AssociationInfo.java new file mode 100755 index 0000000..1cd3c99 --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/acs/model/v0/AssociationInfo.java @@ -0,0 +1,106 @@ +package com.inteligr8.alfresco.acs.model.v0; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class AssociationInfo extends NamedObject { + + @JsonProperty("isChildAssociation") + private boolean childAssociation; + + @JsonProperty("protected") + private boolean protected_; + + @JsonProperty + private boolean duplicateChildNameAllowed; + + @JsonProperty + private EndpointInfo source; + + @JsonProperty + private EndpointInfo target; + + + + public boolean isChildAssociation() { + return childAssociation; + } + + public void setChildAssociation(boolean childAssociation) { + this.childAssociation = childAssociation; + } + + public boolean isProtected() { + return protected_; + } + + public void setProtected(boolean protected_) { + this.protected_ = protected_; + } + + public boolean isDuplicateChildNameAllowed() { + return duplicateChildNameAllowed; + } + + public void setDuplicateChildNameAllowed(boolean duplicateChildNameAllowed) { + this.duplicateChildNameAllowed = duplicateChildNameAllowed; + } + + public EndpointInfo getSource() { + return source; + } + + public void setSource(EndpointInfo source) { + this.source = source; + } + + public EndpointInfo getTarget() { + return target; + } + + public void setTarget(EndpointInfo target) { + this.target = target; + } + + + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class EndpointInfo { + + @JsonProperty("class") + private String className; + + @JsonProperty + private boolean mandatory; + + @JsonProperty + private boolean many; + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public boolean isMandatory() { + return mandatory; + } + + public void setMandatory(boolean mandatory) { + this.mandatory = mandatory; + } + + public boolean isMany() { + return many; + } + + public void setMany(boolean many) { + this.many = many; + } + + } + +} diff --git a/src/main/java/com/inteligr8/alfresco/acs/model/v0/ClassInfo.java b/src/main/java/com/inteligr8/alfresco/acs/model/v0/ClassInfo.java new file mode 100755 index 0000000..d6fcddb --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/acs/model/v0/ClassInfo.java @@ -0,0 +1,135 @@ +package com.inteligr8.alfresco.acs.model.v0; + +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class ClassInfo extends NamedObject { + + @JsonProperty + private boolean isAspect; + + @JsonProperty + private boolean isContainer; + + @JsonProperty + private String description; + + @JsonProperty + private ParentInfo parent; + + @JsonProperty + private Map defaultAspects; + + @JsonProperty + private Map properties; + + @JsonProperty + private Map associations; + + @JsonProperty("childassociations") + private Map childAssociations; + + + private Object syncAssocs = new Object(); + private boolean correctedAssocs = false; + + private Object syncChildAssocs = new Object(); + private boolean correctedChildAssocs = false; + + + public boolean isAspect() { + return isAspect; + } + + public void setAspect(boolean isAspect) { + this.isAspect = isAspect; + } + + public boolean isContainer() { + return isContainer; + } + + public void setContainer(boolean isContainer) { + this.isContainer = isContainer; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public ParentInfo getParent() { + return parent; + } + + public void setParent(ParentInfo parent) { + this.parent = parent; + } + + public Map getDefaultAspects() { + return defaultAspects; + } + + public void setDefaultAspects(Map defaultAspects) { + this.defaultAspects = defaultAspects; + } + + public Map getProperties() { + return properties; + } + + public void setProperties(Map properties) { + this.properties = properties; + } + + public Map getAssociations() { + synchronized (this.syncAssocs) { + if (!this.correctedAssocs) + for (AssociationInfo assoc : this.associations.values()) + assoc.setChildAssociation(false); + this.correctedAssocs = true; + } + + return associations; + } + + public void setAssociations(Map associations) { + synchronized (this.syncAssocs) { + this.associations = associations; + this.correctedAssocs = false; + } + } + + public Map getChildAssociations() { + synchronized (this.syncChildAssocs) { + if (!this.correctedChildAssocs) + for (AssociationInfo assoc : this.childAssociations.values()) + assoc.setChildAssociation(false); + this.correctedChildAssocs = true; + } + + return childAssociations; + } + + public void setChildAssociations(Map childAssociations) { + synchronized (this.syncChildAssocs) { + this.childAssociations = childAssociations; + this.correctedChildAssocs = false; + } + } + + + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class ParentInfo extends NamedObject {} + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class AspectInfo extends NamedObject {} + +} diff --git a/src/main/java/com/inteligr8/alfresco/acs/model/v0/ConstraintInfo.java b/src/main/java/com/inteligr8/alfresco/acs/model/v0/ConstraintInfo.java new file mode 100755 index 0000000..67e1519 --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/acs/model/v0/ConstraintInfo.java @@ -0,0 +1,34 @@ +package com.inteligr8.alfresco.acs.model.v0; + +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class ConstraintInfo { + + @JsonProperty + private String type; + + @JsonProperty + private List> parameters; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List> getParameters() { + return parameters; + } + + public void setParameters(List> parameters) { + this.parameters = parameters; + } + +} diff --git a/src/main/java/com/inteligr8/alfresco/acs/model/v0/MimeTypeInfo.java b/src/main/java/com/inteligr8/alfresco/acs/model/v0/MimeTypeInfo.java new file mode 100755 index 0000000..05f29d9 --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/acs/model/v0/MimeTypeInfo.java @@ -0,0 +1,66 @@ +package com.inteligr8.alfresco.acs.model.v0; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class MimeTypeInfo { + + @JsonProperty + private String description; + + @JsonProperty + private ExtensionsInfo extensions; + + + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public ExtensionsInfo getExtensions() { + return extensions; + } + + public void setExtensions(ExtensionsInfo extensions) { + this.extensions = extensions; + } + + + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class ExtensionsInfo { + + @JsonProperty("default") + private String defaultValue; + + @JsonProperty + private List additional; + + + + public String getDefault() { + return defaultValue; + } + + public void setDefault(String defaultValue) { + this.defaultValue = defaultValue; + } + + public List getAdditional() { + return additional; + } + + public void setAdditional(List additional) { + this.additional = additional; + } + + } + +} diff --git a/src/main/java/com/inteligr8/alfresco/acs/model/v0/MimeTypesData.java b/src/main/java/com/inteligr8/alfresco/acs/model/v0/MimeTypesData.java new file mode 100755 index 0000000..1245d53 --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/acs/model/v0/MimeTypesData.java @@ -0,0 +1,22 @@ +package com.inteligr8.alfresco.acs.model.v0; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class MimeTypesData { + + @JsonProperty + private MimeTypesMap data; + + + + public MimeTypesMap getData() { + return data; + } + + public void setData(MimeTypesMap data) { + this.data = data; + } + +} diff --git a/src/main/java/com/inteligr8/alfresco/acs/model/v0/MimeTypesMap.java b/src/main/java/com/inteligr8/alfresco/acs/model/v0/MimeTypesMap.java new file mode 100755 index 0000000..6b39ff6 --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/acs/model/v0/MimeTypesMap.java @@ -0,0 +1,21 @@ +package com.inteligr8.alfresco.acs.model.v0; + +import java.util.Collection; +import java.util.HashMap; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class MimeTypesMap extends HashMap { + + private static final long serialVersionUID = -4776034773614276742L; + + public Collection getMimeTypes() { + return this.keySet(); + } + + public MimeTypeInfo getMimeTypeInfo(String mimeType) { + return this.get(mimeType); + } + +} diff --git a/src/main/java/com/inteligr8/alfresco/acs/model/v0/NamedObject.java b/src/main/java/com/inteligr8/alfresco/acs/model/v0/NamedObject.java new file mode 100755 index 0000000..d9207dc --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/acs/model/v0/NamedObject.java @@ -0,0 +1,44 @@ +package com.inteligr8.alfresco.acs.model.v0; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class NamedObject { + + @JsonProperty(required = true) + private String name; + + @JsonProperty + private String title; + + @JsonProperty + private String url; + + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + +} diff --git a/src/main/java/com/inteligr8/alfresco/acs/model/v0/PropertyInfo.java b/src/main/java/com/inteligr8/alfresco/acs/model/v0/PropertyInfo.java new file mode 100755 index 0000000..0a6a6dd --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/acs/model/v0/PropertyInfo.java @@ -0,0 +1,104 @@ +package com.inteligr8.alfresco.acs.model.v0; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class PropertyInfo extends NamedObject { + + @JsonProperty + private String description; + + @JsonProperty + private String dataType; + + @JsonProperty + private String defaultValue; + + @JsonProperty + private boolean multiValued; + + @JsonProperty + private boolean mandatory; + + @JsonProperty + private boolean enforced; + + @JsonProperty("protected") + private boolean protected_; + + @JsonProperty + private boolean indexed; + + @JsonProperty + private List contraints; + + + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getDataType() { + return dataType; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } + + public String getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } + + public boolean isMultiValued() { + return multiValued; + } + + public void setMultiValued(boolean multiValued) { + this.multiValued = multiValued; + } + + public boolean isMandatory() { + return mandatory; + } + + public void setMandatory(boolean mandatory) { + this.mandatory = mandatory; + } + + public boolean isEnforced() { + return enforced; + } + + public void setEnforced(boolean enforced) { + this.enforced = enforced; + } + + public boolean isProtected_() { + return protected_; + } + + public void setProtected_(boolean protected_) { + this.protected_ = protected_; + } + + public boolean isIndexed() { + return indexed; + } + + public void setIndexed(boolean indexed) { + this.indexed = indexed; + } + +} diff --git a/src/main/java/com/inteligr8/alfresco/acs/model/v0/ServerData.java b/src/main/java/com/inteligr8/alfresco/acs/model/v0/ServerData.java new file mode 100755 index 0000000..76f6a82 --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/acs/model/v0/ServerData.java @@ -0,0 +1,22 @@ +package com.inteligr8.alfresco.acs.model.v0; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class ServerData { + + @JsonProperty + private ServerInfo data; + + + + public ServerInfo getData() { + return data; + } + + public void setData(ServerInfo data) { + this.data = data; + } + +} diff --git a/src/main/java/com/inteligr8/alfresco/acs/model/v0/ServerInfo.java b/src/main/java/com/inteligr8/alfresco/acs/model/v0/ServerInfo.java new file mode 100755 index 0000000..debb556 --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/acs/model/v0/ServerInfo.java @@ -0,0 +1,44 @@ +package com.inteligr8.alfresco.acs.model.v0; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class ServerInfo { + + @JsonProperty + private String edition; + + @JsonProperty + private String version; + + @JsonProperty + private String schema; + + + + public String getEdition() { + return edition; + } + + public void setEdition(String edition) { + this.edition = edition; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getSchema() { + return schema; + } + + public void setSchema(String schema) { + this.schema = schema; + } + +} diff --git a/src/test/java/com/inteligr8/alfresco/acs/ConnectionClientIT.java b/src/test/java/com/inteligr8/alfresco/acs/ConnectionClientIT.java old mode 100644 new mode 100755 index 8f5fdac..e869393 --- a/src/test/java/com/inteligr8/alfresco/acs/ConnectionClientIT.java +++ b/src/test/java/com/inteligr8/alfresco/acs/ConnectionClientIT.java @@ -1,5 +1,6 @@ package com.inteligr8.alfresco.acs; +import java.util.List; import java.util.UUID; import javax.ws.rs.NotFoundException; @@ -10,7 +11,12 @@ import org.junit.jupiter.api.condition.EnabledIf; import com.inteligr8.alfresco.acs.api.DiscoveryApi; import com.inteligr8.alfresco.acs.api.NodesApi; +import com.inteligr8.alfresco.acs.api.V0Api; import com.inteligr8.alfresco.acs.model.RepositoryInfo; +import com.inteligr8.alfresco.acs.model.v0.ClassInfo; +import com.inteligr8.alfresco.acs.model.v0.MimeTypesData; +import com.inteligr8.alfresco.acs.model.v0.PropertyInfo; +import com.inteligr8.alfresco.acs.model.v0.ServerData; public abstract class ConnectionClientIT extends ConditionalIT { @@ -37,4 +43,52 @@ public abstract class ConnectionClientIT extends ConditionalIT { }); } + @Test + @EnabledIf("hostExists") + public void testV0ServerInfo() { + V0Api api = this.getClient().getV0Api(); + ServerData server = api.getServer(); + + Assertions.assertNotNull(server); + Assertions.assertNotNull(server.getData()); + Assertions.assertNotNull(server.getData().getEdition()); + Assertions.assertTrue(server.getData().getEdition().length() > 5); + Assertions.assertTrue(server.getData().getVersion().length() > 5); + Assertions.assertTrue(server.getData().getSchema().length() > 3); + } + + @Test + @EnabledIf("hostExists") + public void testV0MimeTypes() { + V0Api api = this.getClient().getV0Api(); + MimeTypesData mimeTypes = api.getMimeTypes(); + + Assertions.assertNotNull(mimeTypes); + Assertions.assertNotNull(mimeTypes.getData()); + Assertions.assertTrue(mimeTypes.getData().getMimeTypes().size() > 50); + Assertions.assertNotNull(mimeTypes.getData().getMimeTypeInfo("application/pdf")); + Assertions.assertEquals("pdf", mimeTypes.getData().getMimeTypeInfo("application/pdf").getExtensions().getDefault()); + } + + @Test + @EnabledIf("hostExists") + public void testV0Classes() { + V0Api api = this.getClient().getV0Api(); + List classes = api.getClasses(null, null, null); + + Assertions.assertNotNull(classes); + Assertions.assertTrue(classes.size() > 50); + } + + @Test + @EnabledIf("hostExists") + public void testV0Property() { + V0Api api = this.getClient().getV0Api(); + List props = api.getProperties(null, "cm:content", null); + + Assertions.assertNotNull(props); + Assertions.assertEquals(1, props.size()); + Assertions.assertEquals("d:content", props.iterator().next().getDataType()); + } + }