Search in sources :

Example 1 with ContentVariation

use of com.adobe.cq.dam.cfm.ContentVariation in project aem-core-wcm-components by Adobe-Marketing-Cloud.

the class ContentFragmentMockAdapter method apply.

@Nullable
@Override
public ContentFragment apply(@Nullable Resource resource) {
    // check if the resource is valid and an asset
    if (resource == null || !resource.isResourceType(NT_DAM_ASSET)) {
        return null;
    }
    // check if the resource is a content fragment
    Resource content = resource.getChild(JCR_CONTENT);
    ValueMap contentProperties = content.getValueMap();
    if (!contentProperties.get(PN_CONTENT_FRAGMENT, Boolean.FALSE)) {
        return null;
    }
    // check if the content fragment is text-only or structured
    Resource data = resource.getChild(PATH_DATA);
    boolean isStructured = data != null;
    /* get content fragment properties, model and elements */
    String title = contentProperties.get(JCR_TITLE, String.class);
    String description = contentProperties.get(JCR_DESCRIPTION, String.class);
    String cfName = resource.getName();
    Resource model;
    Resource modelAdaptee;
    List<ContentElement> elements = new LinkedList<>();
    if (isStructured) {
        // get the model (referenced in the property)
        model = resource.getResourceResolver().getResource(data.getValueMap().get(PN_MODEL, String.class));
        // for the 'adaptTo' mock below we use the jcr:content child to mimick the real behavior
        modelAdaptee = model.getChild(JCR_CONTENT);
        // create an element mock for each property on the master node
        Resource master = resource.getChild(PATH_MASTER);
        for (String name : master.getValueMap().keySet()) {
            // skip the primary type and content type properties
            if (JcrConstants.JCR_PRIMARYTYPE.equals(name) || name.endsWith("@ContentType")) {
                continue;
            }
            elements.add(getMockElement(resource, name, model));
        }
    } else {
        // get the model (stored in the fragment itself)
        model = resource.getChild(PATH_MODEL);
        modelAdaptee = model;
        // add the "main" element to the list
        elements.add(getMockElement(resource, null, null));
        // create an element mock for each subasset
        Resource subassets = resource.getChild("subassets");
        if (subassets != null) {
            for (Resource subasset : subassets.getChildren()) {
                elements.add(getMockElement(resource, subasset.getName(), null));
            }
        }
    }
    /* create mock objects */
    ContentFragment fragment = mock(ContentFragment.class, withSettings().lenient());
    when(fragment.getTitle()).thenReturn(title);
    when(fragment.getDescription()).thenReturn(description);
    when(fragment.getName()).thenReturn(cfName);
    when(fragment.adaptTo(Resource.class)).thenReturn(resource);
    when(fragment.getElement(isNull())).thenAnswer(invocation -> {
        String name = invocation.getArgument(0);
        return getMockElement(resource, name, isStructured ? model : null);
    });
    when(fragment.getElement(any(String.class))).thenAnswer(invocation -> {
        String name = invocation.getArgument(0);
        return getMockElement(resource, name, isStructured ? model : null);
    });
    when(fragment.hasElement(any(String.class))).thenAnswer(invocation -> {
        String name = invocation.getArgument(0);
        return fragment.getElement(name) != null;
    });
    when(fragment.getElements()).thenReturn(elements.iterator());
    List<VariationDef> variations = new LinkedList<>();
    ContentElement main = fragment.getElement(null);
    Iterator<ContentVariation> iterator = main.getVariations();
    while (iterator.hasNext()) {
        ContentVariation variation = iterator.next();
        variations.add(new VariationDef() {

            @Override
            public String getName() {
                return variation.getName();
            }

            @Override
            public String getTitle() {
                return variation.getTitle();
            }

            @Override
            public String getDescription() {
                return variation.getDescription();
            }
        });
    }
    when(fragment.listAllVariations()).thenReturn(variations.iterator());
    FragmentTemplate template = mock(FragmentTemplate.class, withSettings().lenient());
    when(template.adaptTo(Resource.class)).thenReturn(modelAdaptee);
    when(fragment.getTemplate()).thenReturn(template);
    Iterator<Resource> associatedContent = getAssociatedContent(resource);
    when(fragment.getAssociatedContent()).thenReturn(associatedContent);
    return fragment;
}
Also used : ContentFragment(com.adobe.cq.dam.cfm.ContentFragment) ValueMap(org.apache.sling.api.resource.ValueMap) Resource(org.apache.sling.api.resource.Resource) LinkedList(java.util.LinkedList) VariationDef(com.adobe.cq.dam.cfm.VariationDef) ContentElement(com.adobe.cq.dam.cfm.ContentElement) ContentVariation(com.adobe.cq.dam.cfm.ContentVariation) FragmentTemplate(com.adobe.cq.dam.cfm.FragmentTemplate) Nullable(javax.annotation.Nullable)

Example 2 with ContentVariation

use of com.adobe.cq.dam.cfm.ContentVariation in project aem-core-wcm-components by Adobe-Marketing-Cloud.

the class ContentFragmentMockAdapter method getMockElement.

/**
 * Creates a mock of a content element for a text-only (if {@code model} is {@code null}) or structured
 * (if {@code model} is not {@code null}) content fragment.
 */
private ContentElement getMockElement(Resource resource, String name, Resource model) {
    // get the respective element
    MockElement element;
    if (model == null) {
        element = getTextOnlyElement(resource, name);
    } else {
        element = getStructuredElement(resource, model, name);
    }
    if (element == null) {
        return null;
    }
    /* create mock objects */
    // mock data type
    DataType dataType = mock(DataType.class, withSettings().lenient());
    when(dataType.isMultiValue()).thenReturn(element.isMultiValued);
    when(dataType.getTypeString()).thenReturn(element.typeString);
    // mock fragment data
    FragmentData data = mock(FragmentData.class, withSettings().lenient());
    when(data.getValue()).thenReturn(element.isMultiValued ? element.values : element.values[0]);
    when(data.getValue(String.class)).thenReturn(element.values[0]);
    when(data.getValue(String[].class)).thenReturn(element.values);
    when(data.getContentType()).thenReturn(element.contentType);
    when(data.getDataType()).thenReturn(dataType);
    // mock content element
    ContentElement contentElement = mock(ContentElement.class, withSettings().lenient());
    when(contentElement.getName()).thenReturn(element.name);
    when(contentElement.getTitle()).thenReturn(element.title);
    when(contentElement.getContent()).thenReturn(element.values[0]);
    when(contentElement.getContentType()).thenReturn(element.contentType);
    when(contentElement.getValue()).thenReturn(data);
    // mock variations
    Map<String, ContentVariation> variations = new LinkedHashMap<>();
    for (MockVariation variation : element.variations.values()) {
        FragmentData variationData = mock(FragmentData.class, withSettings().lenient());
        when(variationData.getValue()).thenReturn(element.isMultiValued ? variation.values : variation.values[0]);
        when(variationData.getValue(String.class)).thenReturn(variation.values[0]);
        when(variationData.getValue(String[].class)).thenReturn(variation.values);
        when(variationData.getContentType()).thenReturn(variation.contentType);
        when(variationData.getDataType()).thenReturn(dataType);
        ContentVariation contentVariation = mock(ContentVariation.class, withSettings().lenient());
        when(contentVariation.getName()).thenReturn(variation.name);
        when(contentVariation.getTitle()).thenReturn(variation.title);
        when(contentVariation.getContent()).thenReturn(variation.values[0]);
        when(contentVariation.getContentType()).thenReturn(variation.contentType);
        when(contentVariation.getValue()).thenReturn(variationData);
        variations.put(variation.name, contentVariation);
    }
    when(contentElement.getVariations()).thenReturn(variations.values().iterator());
    when(contentElement.getVariation(any(String.class))).thenAnswer(invocation -> {
        String variationName = invocation.getArgument(0);
        return variations.get(variationName);
    });
    return contentElement;
}
Also used : ContentElement(com.adobe.cq.dam.cfm.ContentElement) ContentVariation(com.adobe.cq.dam.cfm.ContentVariation) DataType(com.adobe.cq.dam.cfm.DataType) FragmentData(com.adobe.cq.dam.cfm.FragmentData) LinkedHashMap(java.util.LinkedHashMap)

Aggregations

ContentElement (com.adobe.cq.dam.cfm.ContentElement)2 ContentVariation (com.adobe.cq.dam.cfm.ContentVariation)2 ContentFragment (com.adobe.cq.dam.cfm.ContentFragment)1 DataType (com.adobe.cq.dam.cfm.DataType)1 FragmentData (com.adobe.cq.dam.cfm.FragmentData)1 FragmentTemplate (com.adobe.cq.dam.cfm.FragmentTemplate)1 VariationDef (com.adobe.cq.dam.cfm.VariationDef)1 LinkedHashMap (java.util.LinkedHashMap)1 LinkedList (java.util.LinkedList)1 Nullable (javax.annotation.Nullable)1 Resource (org.apache.sling.api.resource.Resource)1 ValueMap (org.apache.sling.api.resource.ValueMap)1