Skip to content

Commit

Permalink
fixed issue #80. It is now possible to use intefaces or abstract clas…
Browse files Browse the repository at this point in the history
…ses for both component link fields and embedded schema fields
  • Loading branch information
RaimondKempees committed Dec 28, 2016
1 parent 38259fb commit f6a44cc
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 30 deletions.
6 changes: 3 additions & 3 deletions dd4t-core/src/test/java/org/dd4t/test/models/EmbeddedOne.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public class EmbeddedOne extends TridionViewModelBase implements GenericModelInt
@ViewModelProperty
private String testfieldOne;
@ViewModelProperty
private EmbeddedTwo embeddableTwo;
private GenericModelInterface embeddableTwo;

public String getTestfieldOne () {
return testfieldOne;
Expand All @@ -24,11 +24,11 @@ public void setTestfieldOne (final String testfieldOne) {
this.testfieldOne = testfieldOne;
}

public EmbeddedTwo getEmbeddableTwo () {
public GenericModelInterface getEmbeddableTwo () {
return embeddableTwo;
}

public void setEmbeddableTwo (final EmbeddedTwo embeddableTwo) {
public void setEmbeddableTwo (final GenericModelInterface embeddableTwo) {
this.embeddableTwo = embeddableTwo;
}
}
14 changes: 13 additions & 1 deletion dd4t-core/src/test/resources/fulltest.json
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,19 @@
"Id": "tcm:7-109-8",
"Title": "Generic"
},
"Fields": {},
"Fields": {
"heading": {
"Name": "heading",
"Values": ["Component Link Heading"],
"NumericValues": [],
"DateTimeValues": [],
"LinkedComponentValues": [],
"FieldType": 0,
"XPath": "tcm:Content/custom:Generic/custom:heading",
"KeywordValues": []
}

},
"MetadataFields": {},
"ComponentType": 1,
"Folder": {
Expand Down
2 changes: 1 addition & 1 deletion dd4t-core/src/test/resources/fulltestencoded.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
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
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,8 @@
import org.dd4t.contentmodel.Field;
import org.dd4t.core.databind.BaseViewModel;
import org.dd4t.core.databind.ModelConverter;
import org.dd4t.core.databind.TridionViewModel;
import org.dd4t.databind.annotations.ViewModel;
import org.dd4t.databind.util.DataBindConstants;
import org.dd4t.databind.viewmodel.base.TridionViewModelBase;
import org.dd4t.databind.viewmodel.base.ViewModelBase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -54,11 +51,6 @@
*/
public abstract class BaseDataBinder {
private static final Logger LOG = LoggerFactory.getLogger(BaseDataBinder.class);
private static final String VIEW_MODEL_ANNOTATION_NAME = ViewModel.class.getCanonicalName();
private static final String TRIDION_VIEW_MODEL_BASE_CLASS_NAME = TridionViewModelBase.class.getCanonicalName();
private static final String VIEW_MODEL_BASE_CLASS_NAME = ViewModelBase.class.getCanonicalName();
private static final String TRIDION_VIEW_MODEL_INTERFACE = TridionViewModel.class.getCanonicalName();
private static final String BASE_VIEW_MODEL_INTERFACE = BaseViewModel.class.getCanonicalName();


protected static final ConcurrentMap<String, List<Class<? extends BaseViewModel>>> VIEW_MODELS = new ConcurrentHashMap<>();
Expand Down Expand Up @@ -238,7 +230,7 @@ private void processClass (final ClassInfo classInfo) {

try {

if (classInfo.hasAnnotation(VIEW_MODEL_ANNOTATION_NAME)) {
if (classInfo.hasAnnotation(DataBindConstants.VIEW_MODEL_ANNOTATION_NAME)) {
processViewModelClass(classInfo);
} else if (classInfo.isImplementedInterface()) {
processInterfaceForModels(classInfo);
Expand Down Expand Up @@ -307,13 +299,13 @@ private void processViewModelClass (final ClassInfo classInfo) throws ClassNotFo
}

private boolean isDatabindStandardClass (ClassInfo classInfo) {
return classInfo.getClassName().equals(VIEW_MODEL_BASE_CLASS_NAME) || classInfo.getClassName().equals(TRIDION_VIEW_MODEL_BASE_CLASS_NAME) || classInfo.getClassName().equals(TRIDION_VIEW_MODEL_INTERFACE) || classInfo.getClassName().equals(BASE_VIEW_MODEL_INTERFACE);
return classInfo.getClassName().equals(DataBindConstants.VIEW_MODEL_BASE_CLASS_NAME) || classInfo.getClassName().equals(DataBindConstants.TRIDION_VIEW_MODEL_BASE_CLASS_NAME) || classInfo.getClassName().equals(DataBindConstants.TRIDION_VIEW_MODEL_INTERFACE) || classInfo.getClassName().equals(DataBindConstants.BASE_VIEW_MODEL_INTERFACE);
}

private boolean hasNonStandardParent (ClassInfo classInfo) {
final ClassInfo superClass = classInfo.getDirectSuperclass();

return superClass != null && (!superClass.getClassName().equals(VIEW_MODEL_BASE_CLASS_NAME) && !superClass.getClassName().equals(TRIDION_VIEW_MODEL_BASE_CLASS_NAME));
return superClass != null && (!superClass.getClassName().equals(DataBindConstants.VIEW_MODEL_BASE_CLASS_NAME) && !superClass.getClassName().equals(DataBindConstants.TRIDION_VIEW_MODEL_BASE_CLASS_NAME));

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package org.dd4t.databind.builder.json;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.commons.lang3.StringUtils;
import org.dd4t.contentmodel.Component;
import org.dd4t.contentmodel.Embedded;
Expand Down Expand Up @@ -268,16 +269,26 @@ private <T extends BaseViewModel> void deserializeAndBuildModels (final T model,

if (TypeUtils.classIsViewModel((Class<?>) parametrizedType) || DataBindFactory.classHasViewModelDerivatives(((Class<?>) parametrizedType).getCanonicalName())) {
for (JsonNode node : nodeList) {
checkTypeAndBuildModel(model, fieldName, node, modelField, (Class<T>) parametrizedType);


if (!node.has(DataBindConstants.ROOT_ELEMENT_NAME)) {
checkTypeAndBuildModel(model, fieldName, node, modelField, (Class<T>) parametrizedType);
} else {
LOG.debug("not handling a schemaNode.");
}
}

} else {
for (JsonNode node : nodeList) {
deserializeGeneric(model, node, modelField, tridionDataFieldType);
if (!node.has(DataBindConstants.ROOT_ELEMENT_NAME)) {
deserializeGeneric(model, node, modelField, tridionDataFieldType);
} else {
LOG.debug("not handling a schemaNode.");
}
}
}

} else if (TypeUtils.classIsViewModel(modelField.getType()) || DataBindFactory.classHasViewModelDerivatives(modelField.getType().getCanonicalName()) ) {
} else if (TypeUtils.classIsViewModel(modelField.getType()) || DataBindFactory.classHasViewModelDerivatives(modelField.getType().getCanonicalName())) {
final Class<T> modelClassToUse = (Class<T>) modelField.getType();
checkTypeAndBuildModel(model, fieldName, nodeList.get(0), modelField, modelClassToUse);
} else {
Expand All @@ -291,20 +302,30 @@ private static void handleEmbeddedContent (final JsonNode currentField, final Li
// keeps sibling nodes in this child, which has FieldType embedded, while we're actually already in
// that node's Values

final JsonNode schemaNode = currentField.get(DataBindConstants.EMBEDDED_SCHEMA_FIELD_NAME);
if (embeddedNode != null) {
final Iterator<JsonNode> embeddedIterator = embeddedNode.elements();
while (embeddedIterator.hasNext()) {
JsonNode embeddedValue = embeddedIterator.next();
nodeList.add(embeddedValue);
addEmbeddedNodeAndSchemaInfo(nodeList, schemaNode, embeddedIterator);
}
} else {
final Iterator<JsonNode> currentFieldElements = currentField.elements();
while (currentFieldElements.hasNext()) {
nodeList.add(currentFieldElements.next());

addEmbeddedNodeAndSchemaInfo(nodeList, schemaNode, currentFieldElements);
}
}
}

private static void addEmbeddedNodeAndSchemaInfo (final List<JsonNode> nodeList, final JsonNode schemaNode, final Iterator<JsonNode> embeddedIterator) {
ObjectNode embeddedValue = (ObjectNode) embeddedIterator.next();

if (schemaNode != null && !embeddedValue.has(DataBindConstants.EMBEDDED_SCHEMA_FIELD_NAME)) {
embeddedValue.set(DataBindConstants.EMBEDDED_SCHEMA_FIELD_NAME, schemaNode);
}
nodeList.add(embeddedValue);
}

private static void fillLinkedComponentValues (final JsonNode currentField, final List<JsonNode> nodeList) {
// Get the actual values from the values
// if the Model's field is List, grab all embedded values
Expand Down Expand Up @@ -346,19 +367,15 @@ private static <T extends BaseViewModel> void checkTypeAndBuildModel (final T mo
private static <T extends BaseViewModel> BaseViewModel buildModelForField (final JsonNode currentField, final Class<T> modelClassToUse) throws SerializationException {

if (Modifier.isAbstract(modelClassToUse.getModifiers()) || Modifier.isInterface(modelClassToUse.getModifiers())) {
// Get root element name
final String rootElementName = DataBindFactory.getRootElementName(currentField);


// TODO: handle embedded fields as well!


// Get root element name
final String rootElementName = getRootElementNameFromComponentOrEmbeddedField(currentField);
if (StringUtils.isNotEmpty(rootElementName)) {
// attempt get a concrete class for this interface

final Class<? extends BaseViewModel> concreteClass = DataBindFactory.getModelClassesForInterfaceOrAbstractField(modelClassToUse.getCanonicalName(), rootElementName);
if (concreteClass ==null) {
LOG.error("Attempt to find a concrete model class for interface or abstract class: {} failed miserably as there was no registered class for root element name: '{}' Will return null.",modelClassToUse.getCanonicalName(),rootElementName);
if (concreteClass == null) {
LOG.error("Attempt to find a concrete model class for interface or abstract class: {} failed miserably as there was no registered class for root element name: '{}' Will return null.", modelClassToUse.getCanonicalName(), rootElementName);
return null;
}
LOG.debug("Building: {}", concreteClass.getCanonicalName());
Expand All @@ -374,6 +391,25 @@ private static <T extends BaseViewModel> BaseViewModel buildModelForField (final
}
}

private static String getRootElementNameFromComponentOrEmbeddedField (final JsonNode currentField) {
String rootElementName = DataBindFactory.getRootElementName(currentField);

if (StringUtils.isNotEmpty(rootElementName)) {
return rootElementName;
}

if (currentField.has(DataBindConstants.EMBEDDED_SCHEMA_FIELD_NAME)) {
final JsonNode schemaNode = currentField.get(DataBindConstants.EMBEDDED_SCHEMA_FIELD_NAME);

if (schemaNode.hasNonNull(DataBindConstants.ROOT_ELEMENT_NAME)) {
String nodeTypeName = schemaNode.get(DataBindConstants.ROOT_ELEMENT_NAME).textValue();
LOG.debug("RootElementName is: {}", nodeTypeName);
return nodeTypeName;
}
}
return null;
}

private static <T extends BaseViewModel> BaseViewModel getBaseViewModel (final JsonNode currentField, final Class<T> modelClassToUse) throws SerializationException {
final BaseViewModel strongModel = DataBindFactory.buildModel(currentField, modelClassToUse, "");
final ViewModel viewModelParameters = modelClassToUse.getAnnotation(ViewModel.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@

package org.dd4t.databind.util;

import org.dd4t.core.databind.BaseViewModel;
import org.dd4t.core.databind.TridionViewModel;
import org.dd4t.databind.annotations.ViewModel;
import org.dd4t.databind.viewmodel.base.TridionViewModelBase;
import org.dd4t.databind.viewmodel.base.ViewModelBase;

/**
* test
*
Expand Down Expand Up @@ -47,6 +53,12 @@ public class DataBindConstants {
public static final String COMPONENT_TYPE = "ComponentType";
public static final String MULTIMEDIA = "Multimedia";
public static final String XPATH = "XPath";
public static final String VIEW_MODEL_ANNOTATION_NAME = ViewModel.class.getCanonicalName();
public static final String TRIDION_VIEW_MODEL_BASE_CLASS_NAME = TridionViewModelBase.class.getCanonicalName();
public static final String VIEW_MODEL_BASE_CLASS_NAME = ViewModelBase.class.getCanonicalName();
public static final String TRIDION_VIEW_MODEL_INTERFACE = TridionViewModel.class.getCanonicalName();
public static final String BASE_VIEW_MODEL_INTERFACE = BaseViewModel.class.getCanonicalName();
public static final String EMBEDDED_SCHEMA_FIELD_NAME = "EmbeddedSchema";

private DataBindConstants () {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,12 @@ public boolean isMultiValued (final String fieldName) {
return getFieldMap().get(fieldName).isMultiValued();
}

@Override
public boolean isDynamicCP () {
return isDynamicCP;
}

@Override
public void setIsDynamicCP (final boolean dynamicCP) {
isDynamicCP = dynamicCP;
}
Expand Down

0 comments on commit f6a44cc

Please sign in to comment.