GenericComponentImpl.java
/*
* #%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.siteapi.genericedit.builder.impl;
import java.util.List;
import java.util.stream.Collectors;
import org.jetbrains.annotations.NotNull;
import com.adobe.cq.wcm.core.components.models.Container;
import com.adobe.cq.wcm.core.components.models.ExperienceFragment;
import io.wcm.siteapi.genericedit.component.GenericComponent;
import io.wcm.siteapi.genericedit.component.GenericProperty;
import io.wcm.siteapi.genericedit.component.value.ComponentValue;
import io.wcm.siteapi.genericedit.component.value.GenericValue;
import io.wcm.siteapi.genericedit.component.value.LinkValue;
import io.wcm.siteapi.genericedit.component.value.MediaValue;
import io.wcm.siteapi.genericedit.component.value.RichTextValue;
import io.wcm.siteapi.genericedit.component.value.SimpleValue;
class GenericComponentImpl implements GenericComponent {
private final List<GenericPropertyImpl<?>> allProperties;
private final List<GenericProperty<SimpleValue>> simpleProperties;
private final List<GenericProperty<LinkValue>> linkProperties;
private final List<GenericProperty<MediaValue>> mediaProperties;
private final List<GenericProperty<RichTextValue>> richTextProperties;
private final List<GenericProperty<ComponentValue>> componentProperties;
private final boolean container;
private final boolean experienceFragment;
private final boolean isValid;
@SuppressWarnings("null")
GenericComponentImpl(@NotNull Object modelInstance, @NotNull List<GenericPropertyImpl<?>> properties, boolean isValid) {
this.allProperties = properties;
this.simpleProperties = filterValidProperties(properties, SimpleValue.class);
this.linkProperties = filterValidProperties(properties, LinkValue.class);
this.mediaProperties = filterValidProperties(properties, MediaValue.class);
this.richTextProperties = filterValidProperties(properties, RichTextValue.class);
this.componentProperties = filterValidProperties(properties, ComponentValue.class);
this.container = (modelInstance instanceof Container);
this.experienceFragment = (modelInstance instanceof ExperienceFragment);
if (this.experienceFragment) {
this.isValid = isValid && ((ExperienceFragment)modelInstance).isConfigured();
}
else {
this.isValid = isValid;
}
}
@Override
public boolean isContainer() {
return this.container;
}
@Override
public boolean isExperienceFragment() {
return this.experienceFragment;
}
@Override
public @NotNull List<GenericProperty<SimpleValue>> getSimpleProperties() {
return simpleProperties;
}
@Override
public @NotNull List<GenericProperty<LinkValue>> getLinkProperties() {
return linkProperties;
}
@Override
public @NotNull List<GenericProperty<MediaValue>> getMediaProperties() {
return mediaProperties;
}
@Override
public @NotNull List<GenericProperty<RichTextValue>> getRichTextProperties() {
return richTextProperties;
}
@Override
public @NotNull List<GenericProperty<ComponentValue>> getComponentProperties() {
return componentProperties;
}
@Override
@SuppressWarnings("unchecked")
public @NotNull List<GenericProperty<GenericValue>> getAllProperties() {
return (List)allProperties;
}
@Override
public boolean isValid() {
return isValid && (isContainer() || allProperties.stream().anyMatch(GenericProperty::isValid));
}
@SuppressWarnings({ "null", "unchecked" })
private static <T extends GenericValue> @NotNull List<GenericProperty<T>> filterValidProperties(
@NotNull List<GenericPropertyImpl<?>> properties, @NotNull Class<T> type) {
return properties.stream()
.filter(item -> item.isValid())
.filter(item -> item.is(type))
.map(item -> (GenericProperty<T>)item)
.collect(Collectors.toList());
}
}