Skip to content

Commit

Permalink
Merge pull request #2 from thojava/support-form-options-from-datasource
Browse files Browse the repository at this point in the history
Support form options from datasource
thojava authored Nov 13, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
2 parents fc9cbbd + d00bfe6 commit 64b750f
Showing 3 changed files with 125 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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;
}
108 changes: 108 additions & 0 deletions core/src/main/java/nz/co/manawabay/core/models/form/Options.java
Original file line number Diff line number Diff line change
@@ -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<com.adobe.cq.wcm.core.components.models.form.OptionItem> optionItems;

@ValueMapValue
@Nullable
private String source;

@ValueMapValue
@Nullable
private String datasourceRT;

@Override
public List<com.adobe.cq.wcm.core.components.models.form.OptionItem> 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<OptionItemImpl> items = OBJECT_MAPPER.readValue(content, new TypeReference<List<OptionItemImpl>>() {
});
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();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@Version("1.0")
package nz.co.manawabay.core.models.form;

import org.osgi.annotation.versioning.Version;

0 comments on commit 64b750f

Please sign in to comment.