/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.sa.descriptor;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import com.google.common.collect.Maps;
/**
* Represents a field on a form
*/
public class ServiceField extends ServiceItem {
private static final long serialVersionUID = -1755035953840982580L;
public static final String SELECT_ONE = "one";
public static final String SELECT_MANY = "many";
public static final String ASSET_TYPE_PREFIX = "assetType.";
public static final String TYPE_TEXT = "text";
public static final String TYPE_NUMBER = "number";
public static final String TYPE_CHOICE = "choice";
public static final String TYPE_STORAGE_SIZE = "storageSize";
public static final String TYPE_EXPAND_SIZE = "expandSize";
public static final String TYPE_BOOLEAN = "boolean";
public static final String TYPE_PASSWORD = "password"; // NOSONAR ("False positive, field does not store a password")
/** Indicates whether the field is required. */
private boolean required = true;
/** Indicates whether the field will add "None" if required. */
private boolean omitNone = false;
/** Indicates that the field can be 'locked' down (pre-defined) by an admin in the catalog. */
private boolean lockable;
/** The initial value of the field. */
private String initialValue;
/** Whether the field belongs to the service modal */
public boolean modalField = false;
/** For choice or asset fields, whether one or many values can be selected. */
private String select = SELECT_ONE;
/** Validation descriptor for the field. */
private Validation validation = new Validation();
/** For choice fields, defines fixed options. */
private Map<String, String> options = Maps.newLinkedHashMap();
public boolean isRequired() {
return required;
}
public void setRequired(boolean required) {
this.required = required;
}
public boolean isOmitNone() {
return omitNone;
}
public void setOmitNone(boolean omitNone) {
this.omitNone = omitNone;
}
public boolean isLockable() {
return lockable;
}
public void setLockable(boolean lockable) {
this.lockable = lockable;
}
public String getInitialValue() {
return initialValue;
}
public boolean isModalField() {
return modalField;
}
public void setModalField(boolean modalField) {
this.modalField = modalField;
}
public void setInitialValue(String initialValue) {
this.initialValue = initialValue;
}
public String getSelect() {
return select;
}
public void setSelect(String select) {
this.select = select;
}
public Validation getValidation() {
return validation;
}
public void setValidation(Validation validation) {
this.validation = validation;
}
public Map<String, String> getOptions() {
return options;
}
public void setOptions(Map<String, String> options) {
this.options = options;
}
public void addOptions(Map<String, String> options) {
this.options.putAll(options);
}
@Override
public void setType(String type) {
if (StringUtils.equals(type, TYPE_GROUP) || StringUtils.equals(type, TYPE_TABLE)
|| StringUtils.equals(type, TYPE_MODAL)) {
throw new IllegalArgumentException("Invalid field type: " + type);
}
super.setType(type);
}
public boolean isAsset() {
return StringUtils.startsWith(getType(), ASSET_TYPE_PREFIX);
}
public String getAssetType() {
return StringUtils.substringAfter(getType(), ASSET_TYPE_PREFIX);
}
@Override
public String toString() {
ToStringBuilder builder = new ToStringBuilder(ToStringStyle.SHORT_PREFIX_STYLE);
toString(builder);
builder.append("required", required);
builder.append("omitNone", omitNone);
builder.append("lockable", lockable);
builder.append("initialValue", initialValue);
builder.append("modalField", modalField);
builder.append("select", select);
builder.append("options", options);
builder.append("validation", validation);
return builder.toString();
}
public static List<ServiceField> getFieldList(ServiceItemContainer container) {
List<ServiceField> fields = new ArrayList<>();
for (ServiceItem item : container.getItems().values()) {
if (item.isField()) {
fields.add((ServiceField) item);
}
}
return fields;
}
public static List<ServiceField> getAllFieldList(ServiceItemContainer container) {
List<ServiceField> fields = new ArrayList<>();
for (ServiceItem item : container.getItems().values()) {
if (item.isField()) {
fields.add((ServiceField) item);
}
else if (item instanceof ServiceItemContainer) {
fields.addAll(getAllFieldList((ServiceItemContainer) item));
}
}
return fields;
}
public static ServiceField findField(ServiceItemContainer container, String name) {
ServiceItem value = container.getItems().get(name);
if (value != null && value.isField()) {
return (ServiceField) value;
}
// Search for a nested field
for (ServiceItem item : container.getItems().values()) {
if (item instanceof ServiceItemContainer) {
ServiceField field = findField((ServiceItemContainer) item, name);
if (field != null) {
return field;
}
}
}
// No field found
return null;
}
public static ServiceField removeField(ServiceItemContainer container, String name) {
ServiceItem value = container.getItems().get(name);
if (value != null && value.isField()) {
container.getItems().remove(name);
return (ServiceField) value;
}
// Search for a nested field
for (ServiceItem item : container.getItems().values()) {
if (item instanceof ServiceItemContainer) {
ServiceField field = removeField((ServiceItemContainer) item, name);
if (field != null) {
return field;
}
}
}
// No field found
return null;
}
public static List<ServiceField> getAssetFields(ServiceItemContainer container) {
return getAssetFields(container.getItems().values());
}
public static Set<String> getAssetTypes(ServiceItemContainer container) {
return getAssetTypes(container.getItems().values());
}
public static List<ServiceField> getAssetFields(Collection<? extends ServiceItem> items) {
List<ServiceField> assetFields = new ArrayList<>();
for (ServiceItem item : items) {
if (item.isField() && ((ServiceField) item).isAsset()) {
assetFields.add((ServiceField) item);
}
}
return assetFields;
}
public static Set<String> getAssetTypes(Collection<? extends ServiceItem> items) {
Set<String> assetTypes = new HashSet<>();
for (ServiceField assetField : getAssetFields(items)) {
assetTypes.add(assetField.getAssetType());
}
return assetTypes;
}
public static class Validation implements Serializable {
private static final long serialVersionUID = 7910763484942532839L;
private Integer min;
private Integer max;
private String regEx;
private String error;
public Integer getMin() {
return min;
}
public void setMin(Integer min) {
this.min = min;
}
public Integer getMax() {
return max;
}
public void setMax(Integer max) {
this.max = max;
}
public String getRegEx() {
return regEx;
}
public void setRegEx(String regEx) {
this.regEx = regEx;
}
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
@Override
public String toString() {
ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE);
builder.append("min", min);
builder.append("max", max);
builder.append("regEx", regEx);
builder.append("error", error);
return builder.toString();
}
}
}