From 2d86a497f148ac9cfda6777d753535fd016007ab Mon Sep 17 00:00:00 2001 From: Koen Kicken Date: Mon, 20 Nov 2023 16:58:55 +0100 Subject: [PATCH 1/6] implement MockContentFragment_ContentElement_Structured getValue() method --- ...entFragment_ContentElement_Structured.java | 10 +-- .../io/wcm/testing/mock/aem/MockDataType.java | 37 +++++++++++ .../testing/mock/aem/MockFragmentData.java | 65 +++++++++++++++++++ 3 files changed, 107 insertions(+), 5 deletions(-) create mode 100644 core/src/main/java/io/wcm/testing/mock/aem/MockDataType.java create mode 100644 core/src/main/java/io/wcm/testing/mock/aem/MockFragmentData.java diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_ContentElement_Structured.java b/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_ContentElement_Structured.java index b15b9768..4a8da538 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_ContentElement_Structured.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_ContentElement_Structured.java @@ -160,6 +160,11 @@ public void removeVariation(ContentVariation variation) throws ContentFragmentEx props.remove(structuredDataKey); } + @Override + public FragmentData getValue() { + Object value = structuredDataProps.get(structuredDataKey); + return new MockFragmentData(value, value.getClass().isArray()); + } // --- unsupported operations --- @@ -168,11 +173,6 @@ public ContentVariation getResolvedVariation(String variationName) { throw new UnsupportedOperationException(); } - @Override - public FragmentData getValue() { - throw new UnsupportedOperationException(); - } - @Override public void setValue(FragmentData fragmentData) throws ContentFragmentException { throw new UnsupportedOperationException(); diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockDataType.java b/core/src/main/java/io/wcm/testing/mock/aem/MockDataType.java new file mode 100644 index 000000000..5710732c --- /dev/null +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockDataType.java @@ -0,0 +1,37 @@ +package io.wcm.testing.mock.aem; + +import com.adobe.cq.dam.cfm.DataType; +import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class MockDataType implements DataType { + + boolean isArray; + + public MockDataType(boolean isArray) { + this.isArray = isArray; + } + + @Override + public @Nullable String getSemanticType() { + return StringUtils.EMPTY; + } + + @Override + public boolean isMultiValue() { + return isArray; + } + + // --- unsupported operations --- + + @Override + public @NotNull String getTypeString() { + throw new UnsupportedOperationException(); + } + + @Override + public @NotNull String getValueType() { + throw new UnsupportedOperationException(); + } +} diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockFragmentData.java b/core/src/main/java/io/wcm/testing/mock/aem/MockFragmentData.java new file mode 100644 index 000000000..025a2fde --- /dev/null +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockFragmentData.java @@ -0,0 +1,65 @@ +package io.wcm.testing.mock.aem; + +import com.adobe.cq.dam.cfm.ContentFragmentException; +import com.adobe.cq.dam.cfm.DataType; +import com.adobe.cq.dam.cfm.FragmentData; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Calendar; + +public class MockFragmentData implements FragmentData { + + private Object value; + private String contentType; + private final MockDataType mockDataType; + + public MockFragmentData(Object value, boolean isArray) { + this.value = value; + this.mockDataType = new MockDataType(isArray); + } + + @Override + public @NotNull DataType getDataType() { + return mockDataType; + } + + @Override + public @Nullable T getValue(Class type) { + if (type.isInstance(value)) { + return (T) value; + } else { + return null; + } + } + + @Override + public boolean isTypeSupported(Class type) { + return type.isInstance(value); + } + + @Override + public @Nullable Object getValue() { + return value; + } + + @Override + public void setValue(@Nullable Object value) throws ContentFragmentException { + this.value = value; + } + + @Override + public @Nullable String getContentType() { + return contentType; + } + + @Override + public void setContentType(@Nullable String contentType) { + this.contentType = contentType; + } + + @Override + public @Nullable Calendar getLastModified() { + return null; + } +} From 50d55fd72da571dff25c24bb58abf5ecfd3b771e Mon Sep 17 00:00:00 2001 From: Koen Kicken Date: Wed, 29 Nov 2023 10:50:42 +0100 Subject: [PATCH 2/6] add unit tests MockDataType and MockFragmentData --- .../io/wcm/testing/mock/aem/MockDataType.java | 2 -- .../testing/mock/aem/MockFragmentData.java | 1 - .../mock/aem/MockContentFragmentTest.java | 33 ++++++++++++++++--- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockDataType.java b/core/src/main/java/io/wcm/testing/mock/aem/MockDataType.java index 5710732c..08d1b311 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockDataType.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockDataType.java @@ -13,7 +13,6 @@ public MockDataType(boolean isArray) { this.isArray = isArray; } - @Override public @Nullable String getSemanticType() { return StringUtils.EMPTY; } @@ -30,7 +29,6 @@ public boolean isMultiValue() { throw new UnsupportedOperationException(); } - @Override public @NotNull String getValueType() { throw new UnsupportedOperationException(); } diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockFragmentData.java b/core/src/main/java/io/wcm/testing/mock/aem/MockFragmentData.java index 025a2fde..a4a46cdd 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockFragmentData.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockFragmentData.java @@ -58,7 +58,6 @@ public void setContentType(@Nullable String contentType) { this.contentType = contentType; } - @Override public @Nullable Calendar getLastModified() { return null; } diff --git a/core/src/test/java/io/wcm/testing/mock/aem/MockContentFragmentTest.java b/core/src/test/java/io/wcm/testing/mock/aem/MockContentFragmentTest.java index 31460bf5..90cfcb9c 100644 --- a/core/src/test/java/io/wcm/testing/mock/aem/MockContentFragmentTest.java +++ b/core/src/test/java/io/wcm/testing/mock/aem/MockContentFragmentTest.java @@ -21,16 +21,20 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; - -import org.apache.commons.collections4.IteratorUtils; -import org.junit.Rule; -import org.junit.Test; +import static org.junit.Assert.assertFalse; import com.adobe.cq.dam.cfm.ContentElement; import com.adobe.cq.dam.cfm.ContentFragment; import com.adobe.cq.dam.cfm.ContentVariation; +import com.adobe.cq.dam.cfm.DataType; +import com.adobe.cq.dam.cfm.FragmentData; import com.adobe.cq.dam.cfm.VariationTemplate; +import org.apache.commons.collections4.IteratorUtils; +import org.junit.Rule; +import org.junit.Test; + import com.day.cq.dam.api.DamConstants; import io.wcm.testing.mock.aem.context.TestAemContext; @@ -66,6 +70,27 @@ public void testContentFragmentStructure() throws Exception { assertEquals("true", cf.getElement("param3").getContent()); assertEquals("v1\nv2", cf.getElement("param4").getContent()); + // get fragmentData and dataType + FragmentData fragmentData = cf.getElement("param1").getValue(); + assertNotNull(fragmentData); + assertEquals("value1", fragmentData.getValue()); + assertTrue(fragmentData.isTypeSupported(String.class)); + assertEquals("value1", fragmentData.getValue(String.class)); + assertFalse(fragmentData.isTypeSupported(Boolean.class)); + assertNull(fragmentData.getValue(Boolean.class)); + + DataType dataType = fragmentData.getDataType(); + assertNotNull(dataType); + + assertFalse(dataType.isMultiValue()); + assertTrue(cf.getElement("param4").getValue().getDataType().isMultiValue()); + + //update fragmentData value and contentType + fragmentData.setValue("newvalue"); + fragmentData.setContentType("contentType"); + assertEquals("newvalue", fragmentData.getValue()); + assertEquals("contentType", fragmentData.getContentType()); + // update data ContentElement param1 = cf.getElement("param1"); param1.setContent("new_value", null); From d628beeeae379417010ae18fabb1ebf1c5211112 Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Tue, 5 Dec 2023 10:13:13 +0100 Subject: [PATCH 3/6] update package version --- core/src/main/java/io/wcm/testing/mock/aem/package-info.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/io/wcm/testing/mock/aem/package-info.java b/core/src/main/java/io/wcm/testing/mock/aem/package-info.java index d60d5968..7dcf19d7 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/package-info.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/package-info.java @@ -20,5 +20,5 @@ /** * Mock implementation of selected AEM APIs. */ -@org.osgi.annotation.versioning.Version("2.3.0") +@org.osgi.annotation.versioning.Version("2.4.0") package io.wcm.testing.mock.aem; From 02fa944838aff3d92a70ed9f1ef3eb95fc0daa73 Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Tue, 5 Dec 2023 10:24:40 +0100 Subject: [PATCH 4/6] reformat code to comply with our coding standards --- .../io/wcm/testing/mock/aem/MockDataType.java | 42 +++++---- .../testing/mock/aem/MockFragmentData.java | 93 ++++++++++--------- 2 files changed, 70 insertions(+), 65 deletions(-) diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockDataType.java b/core/src/main/java/io/wcm/testing/mock/aem/MockDataType.java index 08d1b311..e03317ed 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockDataType.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockDataType.java @@ -1,35 +1,37 @@ package io.wcm.testing.mock.aem; -import com.adobe.cq.dam.cfm.DataType; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import com.adobe.cq.dam.cfm.DataType; + public class MockDataType implements DataType { - boolean isArray; + boolean isArray; + + public MockDataType(boolean isArray) { + this.isArray = isArray; + } - public MockDataType(boolean isArray) { - this.isArray = isArray; - } + public @Nullable String getSemanticType() { + return StringUtils.EMPTY; + } - public @Nullable String getSemanticType() { - return StringUtils.EMPTY; - } + @Override + public boolean isMultiValue() { + return isArray; + } - @Override - public boolean isMultiValue() { - return isArray; - } + // --- unsupported operations --- - // --- unsupported operations --- + @Override + public @NotNull String getTypeString() { + throw new UnsupportedOperationException(); + } - @Override - public @NotNull String getTypeString() { - throw new UnsupportedOperationException(); - } + public @NotNull String getValueType() { + throw new UnsupportedOperationException(); + } - public @NotNull String getValueType() { - throw new UnsupportedOperationException(); - } } diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockFragmentData.java b/core/src/main/java/io/wcm/testing/mock/aem/MockFragmentData.java index a4a46cdd..b67d269c 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockFragmentData.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockFragmentData.java @@ -1,64 +1,67 @@ package io.wcm.testing.mock.aem; -import com.adobe.cq.dam.cfm.ContentFragmentException; -import com.adobe.cq.dam.cfm.DataType; -import com.adobe.cq.dam.cfm.FragmentData; +import java.util.Calendar; + import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Calendar; +import com.adobe.cq.dam.cfm.ContentFragmentException; +import com.adobe.cq.dam.cfm.DataType; +import com.adobe.cq.dam.cfm.FragmentData; public class MockFragmentData implements FragmentData { - private Object value; - private String contentType; - private final MockDataType mockDataType; + private Object value; + private String contentType; + private final MockDataType mockDataType; - public MockFragmentData(Object value, boolean isArray) { - this.value = value; - this.mockDataType = new MockDataType(isArray); - } + public MockFragmentData(Object value, boolean isArray) { + this.value = value; + this.mockDataType = new MockDataType(isArray); + } - @Override - public @NotNull DataType getDataType() { - return mockDataType; - } + @Override + public @NotNull DataType getDataType() { + return mockDataType; + } - @Override - public @Nullable T getValue(Class type) { - if (type.isInstance(value)) { - return (T) value; - } else { - return null; - } + @Override + public @Nullable T getValue(Class type) { + if (type.isInstance(value)) { + return (T)value; } - - @Override - public boolean isTypeSupported(Class type) { - return type.isInstance(value); + else { + return null; } + } - @Override - public @Nullable Object getValue() { - return value; - } + @Override + public boolean isTypeSupported(Class type) { + return type.isInstance(value); + } - @Override - public void setValue(@Nullable Object value) throws ContentFragmentException { - this.value = value; - } + @Override + public @Nullable Object getValue() { + return value; + } - @Override - public @Nullable String getContentType() { - return contentType; - } + @Override + public void setValue(@Nullable Object value) throws ContentFragmentException { + this.value = value; + } - @Override - public void setContentType(@Nullable String contentType) { - this.contentType = contentType; - } + @Override + public @Nullable String getContentType() { + return contentType; + } + + @Override + public void setContentType(@Nullable String contentType) { + this.contentType = contentType; + } + + public @Nullable Calendar getLastModified() { + return null; + } - public @Nullable Calendar getLastModified() { - return null; - } } From bc81a66cf0dfad7c67bf13305cf9760ec91e5a62 Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Tue, 5 Dec 2023 10:34:58 +0100 Subject: [PATCH 5/6] make new mock classes not public, add "MockContentFragment_" prefix for consistency --- .../MockContentFragment_ContentElement_Structured.java | 2 +- ...ataType.java => MockContentFragment_MockDataType.java} | 6 +++--- ...ata.java => MockContentFragment_MockFragmentData.java} | 8 ++++---- .../main/java/io/wcm/testing/mock/aem/package-info.java | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) rename core/src/main/java/io/wcm/testing/mock/aem/{MockDataType.java => MockContentFragment_MockDataType.java} (81%) rename core/src/main/java/io/wcm/testing/mock/aem/{MockFragmentData.java => MockContentFragment_MockFragmentData.java} (81%) diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_ContentElement_Structured.java b/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_ContentElement_Structured.java index 4a8da538..b7b908a3 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_ContentElement_Structured.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_ContentElement_Structured.java @@ -163,7 +163,7 @@ public void removeVariation(ContentVariation variation) throws ContentFragmentEx @Override public FragmentData getValue() { Object value = structuredDataProps.get(structuredDataKey); - return new MockFragmentData(value, value.getClass().isArray()); + return new MockContentFragment_MockFragmentData(value, value.getClass().isArray()); } // --- unsupported operations --- diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockDataType.java b/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_MockDataType.java similarity index 81% rename from core/src/main/java/io/wcm/testing/mock/aem/MockDataType.java rename to core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_MockDataType.java index e03317ed..2ac2c50e 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockDataType.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_MockDataType.java @@ -6,11 +6,11 @@ import com.adobe.cq.dam.cfm.DataType; -public class MockDataType implements DataType { +class MockContentFragment_MockDataType implements DataType { - boolean isArray; + private final boolean isArray; - public MockDataType(boolean isArray) { + MockContentFragment_MockDataType(boolean isArray) { this.isArray = isArray; } diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockFragmentData.java b/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_MockFragmentData.java similarity index 81% rename from core/src/main/java/io/wcm/testing/mock/aem/MockFragmentData.java rename to core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_MockFragmentData.java index b67d269c..5810095b 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockFragmentData.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_MockFragmentData.java @@ -9,15 +9,15 @@ import com.adobe.cq.dam.cfm.DataType; import com.adobe.cq.dam.cfm.FragmentData; -public class MockFragmentData implements FragmentData { +class MockContentFragment_MockFragmentData implements FragmentData { private Object value; private String contentType; - private final MockDataType mockDataType; + private final MockContentFragment_MockDataType mockDataType; - public MockFragmentData(Object value, boolean isArray) { + MockContentFragment_MockFragmentData(Object value, boolean isArray) { this.value = value; - this.mockDataType = new MockDataType(isArray); + this.mockDataType = new MockContentFragment_MockDataType(isArray); } @Override diff --git a/core/src/main/java/io/wcm/testing/mock/aem/package-info.java b/core/src/main/java/io/wcm/testing/mock/aem/package-info.java index 7dcf19d7..d60d5968 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/package-info.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/package-info.java @@ -20,5 +20,5 @@ /** * Mock implementation of selected AEM APIs. */ -@org.osgi.annotation.versioning.Version("2.4.0") +@org.osgi.annotation.versioning.Version("2.3.0") package io.wcm.testing.mock.aem; From 7d746f1a8d0eca8625f61410c617afb860171b20 Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Tue, 5 Dec 2023 11:02:48 +0100 Subject: [PATCH 6/6] add license headers --- .../aem/MockContentFragment_MockDataType.java | 19 +++++++++++++++++++ .../MockContentFragment_MockFragmentData.java | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_MockDataType.java b/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_MockDataType.java index 2ac2c50e..cab55916 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_MockDataType.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_MockDataType.java @@ -1,3 +1,22 @@ +/* + * #%L + * wcm.io + * %% + * Copyright (C) 2023 wcm.io + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ package io.wcm.testing.mock.aem; import org.apache.commons.lang3.StringUtils; diff --git a/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_MockFragmentData.java b/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_MockFragmentData.java index 5810095b..ead63bcf 100644 --- a/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_MockFragmentData.java +++ b/core/src/main/java/io/wcm/testing/mock/aem/MockContentFragment_MockFragmentData.java @@ -1,3 +1,22 @@ +/* + * #%L + * wcm.io + * %% + * Copyright (C) 2023 wcm.io + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ package io.wcm.testing.mock.aem; import java.util.Calendar;