diff --git a/core/src/main/java/nz/co/manawabay/core/models/form/OptionItemImpl.java b/core/src/main/java/nz/co/manawabay/core/models/form/OptionItemImpl.java new file mode 100644 index 0000000..2c1d11e --- /dev/null +++ b/core/src/main/java/nz/co/manawabay/core/models/form/OptionItemImpl.java @@ -0,0 +1,13 @@ +package nz.co.manawabay.core.models.form; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class OptionItemImpl implements com.adobe.cq.wcm.core.components.models.form.OptionItem { + private String value; + private String text; + private boolean disabled; + private boolean selected; +} diff --git a/core/src/main/java/nz/co/manawabay/core/models/form/Options.java b/core/src/main/java/nz/co/manawabay/core/models/form/Options.java new file mode 100644 index 0000000..75f2223 --- /dev/null +++ b/core/src/main/java/nz/co/manawabay/core/models/form/Options.java @@ -0,0 +1,108 @@ +package nz.co.manawabay.core.models.form; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpStatus; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.models.annotations.DefaultInjectionStrategy; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.Via; +import org.apache.sling.models.annotations.injectorspecific.Self; +import org.apache.sling.models.annotations.injectorspecific.ValueMapValue; +import org.apache.sling.models.annotations.via.ResourceSuperType; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +@Model(adaptables = SlingHttpServletRequest.class, + adapters = com.adobe.cq.wcm.core.components.models.form.Options.class, + resourceType = "manawabay/components/form/options", + defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL) +@Slf4j +public class Options implements com.adobe.cq.wcm.core.components.models.form.Options { + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + static { + OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + } + + @Self + @Via(type = ResourceSuperType.class) + private com.adobe.cq.wcm.core.components.models.form.Options options; + + private List optionItems; + + @ValueMapValue + @Nullable + private String source; + + @ValueMapValue + @Nullable + private String datasourceRT; + + @Override + public List getItems() { + if (StringUtils.equalsIgnoreCase(source, "datasource")) { + if (optionItems == null) { + populateOptionItemsFromDatasource(); + } + return optionItems; + } + + return options.getItems(); + } + + private void populateOptionItemsFromDatasource() { + optionItems = new ArrayList<>(); + + if (StringUtils.isBlank(datasourceRT)) { + return; + } + + try (CloseableHttpClient client = HttpClientBuilder.create().build()) { + client.execute(new HttpGet(datasourceRT), response -> { + final int statusCode = response.getStatusLine().getStatusCode(); + + if (statusCode == HttpStatus.SC_OK) { + final InputStream content = response.getEntity().getContent(); + final List items = OBJECT_MAPPER.readValue(content, new TypeReference>() { + }); + optionItems.addAll(items); + } + + return response; + }); + } catch (IOException e) { + log.error(String.format("Cannot get items from resource: %s", source), e); + } + } + + @Override + public Type getType() { + return options.getType(); + } + + @Override + public String getId() { + return options.getId(); + } + + @Override + public String getTitle() { + return options.getTitle(); + } + + @Override + public String getHelpMessage() { + return options.getHelpMessage(); + } +} diff --git a/core/src/main/java/nz/co/manawabay/core/models/form/package-info.java b/core/src/main/java/nz/co/manawabay/core/models/form/package-info.java new file mode 100644 index 0000000..3f84dd9 --- /dev/null +++ b/core/src/main/java/nz/co/manawabay/core/models/form/package-info.java @@ -0,0 +1,4 @@ +@Version("1.0") +package nz.co.manawabay.core.models.form; + +import org.osgi.annotation.versioning.Version;