blob: b65cc5e3b7594d70a9a5da8aebbe93c0813f9b97 [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*******************************************************************************/
package org.ofbiz.product.config;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import javolution.util.FastList;
import javolution.util.FastMap;
import javolution.util.FastSet;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.entity.Delegator;
import org.ofbiz.entity.DelegatorFactory;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.entity.GenericValue;
import org.ofbiz.entity.util.EntityUtil;
import org.ofbiz.service.LocalDispatcher;
import org.ofbiz.service.ServiceContainer;
/**
* Product Config Wrapper: gets product config to display
*/
@SuppressWarnings("serial")
public class ProductConfigWrapper implements Serializable {
public static final String module = ProductConfigWrapper.class.getName();
protected transient LocalDispatcher dispatcher;
protected String dispatcherName;
protected String productStoreId;
protected String catalogId;
protected String webSiteId;
protected String currencyUomId;
protected transient Delegator delegator;
protected String delegatorName = null;
protected GenericValue product = null; // the aggregated product
protected GenericValue autoUserLogin = null;
protected BigDecimal listPrice = BigDecimal.ZERO;
protected BigDecimal basePrice = BigDecimal.ZERO;
protected BigDecimal defaultPrice = BigDecimal.ZERO;
protected String configId = null; // Id of persisted ProductConfigWrapper
protected List<ConfigItem> questions = null; // ProductConfigs
/** Creates a new instance of ProductConfigWrapper */
public ProductConfigWrapper() {
}
public ProductConfigWrapper(Delegator delegator, LocalDispatcher dispatcher, String productId, String productStoreId, String catalogId, String webSiteId, String currencyUomId, Locale locale, GenericValue autoUserLogin) throws Exception {
init(delegator, dispatcher, productId, productStoreId, catalogId, webSiteId, currencyUomId, locale, autoUserLogin);
}
public ProductConfigWrapper(ProductConfigWrapper pcw) {
product = GenericValue.create(pcw.product);
listPrice = pcw.listPrice;
basePrice = pcw.basePrice;
defaultPrice = pcw.defaultPrice;
questions = FastList.newInstance();
delegator = pcw.getDelegator();
delegatorName = delegator.getDelegatorName();
dispatcher = pcw.getDispatcher();
dispatcherName = dispatcher.getName();
productStoreId = pcw.productStoreId;
catalogId = pcw.catalogId;
webSiteId = pcw.webSiteId;
currencyUomId = pcw.currencyUomId;
autoUserLogin = pcw.autoUserLogin;
for (ConfigItem ci: pcw.questions) {
questions.add(new ConfigItem(ci));
}
}
private void init(Delegator delegator, LocalDispatcher dispatcher, String productId, String productStoreId, String catalogId, String webSiteId, String currencyUomId, Locale locale, GenericValue autoUserLogin) throws Exception {
product = delegator.findOne("Product", UtilMisc.toMap("productId", productId), false);
if (product == null || !product.getString("productTypeId").equals("AGGREGATED") && !product.getString("productTypeId").equals("AGGREGATED_SERVICE")) {
throw new ProductConfigWrapperException("Product " + productId + " is not an AGGREGATED product.");
}
this.dispatcher = dispatcher;
this.dispatcherName = dispatcher.getName();
this.productStoreId = productStoreId;
this.catalogId = catalogId;
this.webSiteId = webSiteId;
this.currencyUomId = currencyUomId;
this.delegator = delegator;
this.delegatorName = delegator.getDelegatorName();
this.autoUserLogin = autoUserLogin;
// get the list Price, the base Price
Map<String, Object> priceContext = UtilMisc.toMap("product", product, "prodCatalogId", catalogId, "webSiteId", webSiteId, "productStoreId", productStoreId,
"currencyUomId", currencyUomId, "autoUserLogin", autoUserLogin);
Map<String, Object> priceMap = dispatcher.runSync("calculateProductPrice", priceContext);
BigDecimal originalListPrice = (BigDecimal) priceMap.get("listPrice");
BigDecimal price = (BigDecimal) priceMap.get("price");
if (originalListPrice != null) {
listPrice = originalListPrice;
}
if (price != null) {
basePrice = price;
}
questions = FastList.newInstance();
if ("AGGREGATED".equals(product.getString("productTypeId")) || "AGGREGATED_SERVICE".equals(product.getString("productTypeId"))) {
List<GenericValue> questionsValues = delegator.findByAnd("ProductConfig", UtilMisc.toMap("productId", productId), UtilMisc.toList("sequenceNum"), false);
questionsValues = EntityUtil.filterByDate(questionsValues);
Set<String> itemIds = FastSet.newInstance();
for (GenericValue questionsValue: questionsValues) {
ConfigItem oneQuestion = new ConfigItem(questionsValue);
oneQuestion.setContent(locale, "text/html"); // TODO: mime-type shouldn't be hardcoded
if (itemIds.contains(oneQuestion.getConfigItem().getString("configItemId"))) {
oneQuestion.setFirst(false);
} else {
itemIds.add(oneQuestion.getConfigItem().getString("configItemId"));
}
questions.add(oneQuestion);
List<GenericValue> configOptions = delegator.findByAnd("ProductConfigOption", UtilMisc.toMap("configItemId", oneQuestion.getConfigItemAssoc().getString("configItemId")), UtilMisc.toList("sequenceNum"), false);
for (GenericValue configOption: configOptions) {
ConfigOption option = new ConfigOption(delegator, dispatcher, configOption, oneQuestion, catalogId, webSiteId, currencyUomId, autoUserLogin);
oneQuestion.addOption(option);
}
}
this.setDefaultPrice();
}
}
public void loadConfig(Delegator delegator, String configId) throws Exception {
//configure ProductConfigWrapper according to ProductConfigConfig entity
if (UtilValidate.isNotEmpty(configId)) {
this.configId = configId;
List<GenericValue> productConfigConfig = delegator.findByAnd("ProductConfigConfig", UtilMisc.toMap("configId", configId), null, false);
if (UtilValidate.isNotEmpty(productConfigConfig)) {
for (GenericValue pcc: productConfigConfig) {
String configItemId = pcc.getString("configItemId");
String configOptionId = pcc.getString("configOptionId");
Long sequenceNum = pcc.getLong("sequenceNum");
String comments = pcc.getString("description");
this.setSelected(configItemId, sequenceNum, configOptionId, comments);
}
}
}
}
public void setSelected(String configItemId, Long sequenceNum, String configOptionId, String comments) throws Exception {
for (int i = 0; i < questions.size(); i++) {
ConfigItem ci = questions.get(i);
if (ci.configItemAssoc.getString("configItemId").equals(configItemId) && ci.configItemAssoc.getLong("sequenceNum").equals(sequenceNum)) {
List<ConfigOption> avalOptions = ci.getOptions();
for (int j = 0; j < avalOptions.size(); j++) {
ConfigOption oneOption = avalOptions.get(j);
if (oneOption.configOption.getString("configOptionId").equals(configOptionId)) {
setSelected(i, j, comments);
break;
}
}
}
}
}
public void resetConfig() {
for (ConfigItem ci: questions) {
if (!ci.isStandard()) {
List<ConfigOption> options = ci.getOptions();
for (ConfigOption co: options) {
co.setSelected(false);
co.setComments(null);
}
}
}
}
public void setDefaultConfig() {
resetConfig();
for (ConfigItem ci: questions) {
if (ci.isMandatory()) {
ConfigOption co = ci.getDefault();
if (co != null) {
co.setSelected(true);
} else if (ci.getOptions().size() > 0) {
co = ci.getOptions().get(0);
co.setSelected(true);
}
}
}
}
public String getConfigId() {
return configId;
}
public Delegator getDelegator() {
if (delegator == null) {
delegator = DelegatorFactory.getDelegator(delegatorName);
}
return delegator;
}
public LocalDispatcher getDispatcher() {
if (dispatcher == null) {
dispatcher = ServiceContainer.getLocalDispatcher(dispatcherName, this.getDelegator());
}
return dispatcher;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof ProductConfigWrapper)) {
return false;
}
ProductConfigWrapper cw = (ProductConfigWrapper)obj;
if (!product.getString("productId").equals(cw.getProduct().getString("productId"))) {
return false;
}
List<ConfigItem> cwq = cw.getQuestions();
if (questions.size() != cwq.size()) {
return false;
}
for (int i = 0; i < questions.size(); i++) {
ConfigItem ci = questions.get(i);
if (!ci.equals(cwq.get(i))) {
return false;
}
}
return true;
}
@Override
public String toString() {
return questions.toString();
}
public List<ConfigItem> getQuestions() {
return questions;
}
public GenericValue getProduct() {
return product;
}
public void setSelected(int question, int option, String comments) throws Exception {
ConfigItem ci = questions.get(question);
List<ConfigOption> avalOptions = ci.getOptions();
if (ci.isSingleChoice()) {
for (int j = 0; j < avalOptions.size(); j++) {
ConfigOption oneOption = avalOptions.get(j);
oneOption.setSelected(false);
oneOption.setComments(null);
}
}
ConfigOption theOption = null;
if (option >= 0 && option < avalOptions.size()) {
theOption = avalOptions.get(option);
}
if (theOption != null) {
theOption.setSelected(true);
theOption.setComments(comments);
}
}
public void setSelected(int question, int option, int component, String componentOption) throws Exception {
// set variant products
ConfigOption theOption = getItemOtion(question, option);
List<GenericValue> components = theOption.getComponents();
GenericValue oneComponent = components.get(component);
if (theOption.isVirtualComponent(oneComponent)) {
if (theOption.componentOptions == null) {
theOption.componentOptions = FastMap.newInstance();
}
theOption.componentOptions.put(oneComponent.getString("productId"), componentOption);
// recalculate option price
theOption.recalculateOptionPrice(this);
}
}
public List<ConfigOption> getSelectedOptions() {
List<ConfigOption> selectedOptions = FastList.newInstance();
for (ConfigItem ci: questions) {
if (ci.isStandard()) {
selectedOptions.addAll(ci.getOptions());
} else {
for (ConfigOption oneOption: ci.getOptions()) {
if (oneOption.isSelected()) {
selectedOptions.add(oneOption);
}
}
}
}
return selectedOptions;
}
public List<ConfigOption> getDefaultOptions() {
List<ConfigOption> defaultOptions = FastList.newInstance();
for (ConfigItem ci: questions) {
ConfigOption co = ci.getDefault();
if (co != null) {
defaultOptions.add(co);
}
}
return defaultOptions;
}
public BigDecimal getTotalListPrice() {
BigDecimal totalListPrice = listPrice;
List<ConfigOption> options = getSelectedOptions();
for (ConfigOption oneOption: options) {
totalListPrice = totalListPrice.add(oneOption.getListPrice());
}
return totalListPrice;
}
public BigDecimal getTotalPrice() {
BigDecimal totalPrice = basePrice;
List<ConfigOption> options = getSelectedOptions();
for (ConfigOption oneOption: options) {
totalPrice = totalPrice.add(oneOption.getPrice());
}
return totalPrice;
}
private void setDefaultPrice() {
BigDecimal totalPrice = basePrice;
List<ConfigOption> options = getDefaultOptions();
for (ConfigOption oneOption: options) {
totalPrice = totalPrice.add(oneOption.getPrice());
}
defaultPrice = totalPrice;
}
public BigDecimal getDefaultPrice() {
return defaultPrice;
}
public boolean isCompleted() {
boolean completed = true;
for (ConfigItem ci: questions) {
if (!ci.isStandard() && ci.isMandatory()) {
List<ConfigOption> availOptions = ci.getOptions();
for (ConfigOption oneOption: availOptions) {
if (oneOption.isSelected()) {
completed = true;
break;
} else {
completed = false;
}
}
if (!completed) {
break;
}
}
}
return completed;
}
public ConfigOption getItemOtion(int itemIndex, int optionIndex) {
if (questions.size() > itemIndex) {
ConfigItem ci = questions.get(itemIndex);
List<ConfigOption> options = ci.getOptions();
if (options.size() > optionIndex) {
ConfigOption co = options.get(optionIndex);
return co;
}
}
return null;
}
public class ConfigItem implements java.io.Serializable {
GenericValue configItem = null;
GenericValue configItemAssoc = null;
ProductConfigItemContentWrapper content = null;
List<ConfigOption> options = null;
boolean first = true;
public ConfigItem(GenericValue questionAssoc) throws Exception {
configItemAssoc = questionAssoc;
configItem = configItemAssoc.getRelatedOne("ConfigItemProductConfigItem", false);
options = FastList.newInstance();
}
public ConfigItem(ConfigItem ci) {
configItem = GenericValue.create(ci.configItem);
configItemAssoc = GenericValue.create(ci.configItemAssoc);
options = FastList.newInstance();
for (ConfigOption co: ci.options) {
options.add(new ConfigOption(co));
}
first = ci.first;
content = ci.content; // FIXME: this should be cloned
}
public void setContent(Locale locale, String mimeTypeId) {
content = new ProductConfigItemContentWrapper(dispatcher, configItem, locale, mimeTypeId);
}
public ProductConfigItemContentWrapper getContent() {
return content;
}
public GenericValue getConfigItem() {
return configItem;
}
public GenericValue getConfigItemAssoc() {
return configItemAssoc;
}
public boolean isStandard() {
return configItemAssoc.getString("configTypeId").equals("STANDARD");
}
public boolean isSingleChoice() {
return configItem.getString("configItemTypeId").equals("SINGLE");
}
public boolean isMandatory() {
return configItemAssoc.getString("isMandatory") != null && configItemAssoc.getString("isMandatory").equals("Y");
}
public boolean isFirst() {
return first;
}
public void setFirst(boolean newValue) {
first = newValue;
}
public void addOption(ConfigOption option) {
options.add(option);
}
public List<ConfigOption> getOptions() {
return options;
}
public String getQuestion() {
String question = "";
if (UtilValidate.isNotEmpty(configItemAssoc.getString("description"))) {
question = configItemAssoc.getString("description");
} else {
if (content != null) {
question = content.get("DESCRIPTION");
} else {
question = (configItem.getString("description") != null? configItem.getString("description"): "");
}
}
return question;
}
public String getDescription() {
String description = "";
if (UtilValidate.isNotEmpty(configItemAssoc.getString("longDescription"))) {
description = configItemAssoc.getString("longDescription");
} else {
if (content != null) {
description = content.get("LONG_DESCRIPTION");
} else {
description = (configItem.getString("longDescription") != null? configItem.getString("longDescription"): "");
}
}
return description;
}
public boolean isSelected() {
if (isStandard()) return true;
for (ConfigOption oneOption: getOptions()) {
if (oneOption.isSelected()) {
return true;
}
}
return false;
}
public ConfigOption getSelected() {
for (ConfigOption oneOption: getOptions()) {
if (oneOption.isSelected()) {
return oneOption;
}
}
return null;
}
public ConfigOption getDefault() {
String defaultConfigOptionId = configItemAssoc.getString("defaultConfigOptionId");
if (UtilValidate.isNotEmpty(defaultConfigOptionId)) {
for(ConfigOption oneOption : getOptions()) {
String currentConfigOptionId = oneOption.getId();
if (defaultConfigOptionId.compareToIgnoreCase(currentConfigOptionId) == 0 ) {
return oneOption;
}
}
}
return null;
}
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof ConfigItem)) {
return false;
}
ConfigItem ci = (ConfigItem)obj;
if (!configItem.getString("configItemId").equals(ci.getConfigItem().getString("configItemId"))) {
return false;
}
List<ConfigOption> opts = ci.getOptions();
if (options.size() != opts.size()) {
return false;
}
for (int i = 0; i < options.size(); i++) {
ConfigOption co = options.get(i);
if (!co.equals(opts.get(i))) {
return false;
}
}
return true;
}
@Override
public String toString() {
return configItem.getString("configItemId");
}
}
public class ConfigOption implements java.io.Serializable {
BigDecimal optionListPrice = BigDecimal.ZERO;
BigDecimal optionPrice = BigDecimal.ZERO;
Date availabilityDate = null;
List<GenericValue> componentList = null; // lists of ProductConfigProduct
Map<String, String> componentOptions = null;
GenericValue configOption = null;
boolean selected = false;
boolean available = true;
ConfigItem parentConfigItem = null;
String comments = null; // comments for production run entered during ordering
public ConfigOption(Delegator delegator, LocalDispatcher dispatcher, GenericValue option, ConfigItem configItem, String catalogId, String webSiteId, String currencyUomId, GenericValue autoUserLogin) throws Exception {
configOption = option;
parentConfigItem = configItem;
componentList = option.getRelated("ConfigOptionProductConfigProduct", null, null, false);
for (GenericValue oneComponent: componentList) {
BigDecimal listPrice = BigDecimal.ZERO;
BigDecimal price = BigDecimal.ZERO;
// Get the component's price
Map<String, Object> fieldMap = UtilMisc.toMap("product", oneComponent.getRelatedOne("ProductProduct", false), "prodCatalogId", catalogId, "webSiteId", webSiteId, "currencyUomId", currencyUomId, "productPricePurposeId", "COMPONENT_PRICE", "autoUserLogin", autoUserLogin, "productStoreId",productStoreId);
Map<String, Object> priceMap = dispatcher.runSync("calculateProductPrice", fieldMap);
BigDecimal componentListPrice = (BigDecimal) priceMap.get("listPrice");
BigDecimal componentPrice = (BigDecimal) priceMap.get("price");
Boolean validPriceFound = (Boolean)priceMap.get("validPriceFound");
BigDecimal mult = BigDecimal.ONE;
if (oneComponent.getBigDecimal("quantity") != null) {
mult = oneComponent.getBigDecimal("quantity");
}
if (mult.compareTo(BigDecimal.ZERO) == 0) {
mult = BigDecimal.ONE;
}
if (validPriceFound.booleanValue()) {
if (componentListPrice != null) {
listPrice = componentListPrice;
}
if (componentPrice != null) {
price = componentPrice;
}
} else {
fieldMap.put("productPricePurposeId", "PURCHASE");
Map<String, Object> purchasePriceResultMap = dispatcher.runSync("calculateProductPrice", fieldMap);
BigDecimal purchaseListPrice = (BigDecimal) purchasePriceResultMap.get("listPrice");
BigDecimal purchasePrice = (BigDecimal) purchasePriceResultMap.get("price");
if (purchaseListPrice != null) {
listPrice = purchaseListPrice;
}
if (purchasePrice != null) {
price = purchasePrice;
}
}
optionListPrice = optionListPrice.add(listPrice.multiply(mult));
optionPrice = optionPrice.add(price.multiply(mult));
// TODO: get the component's availability date
}
}
public ConfigOption(ConfigOption co) {
configOption = GenericValue.create(co.configOption);
componentList = FastList.newInstance();
for (GenericValue component: co.componentList) {
componentList.add(GenericValue.create(component));
}
optionListPrice = co.optionListPrice;
optionPrice = co.optionPrice;
available = co.available;
selected = co.selected;
comments = co.getComments();
}
public void recalculateOptionPrice(ProductConfigWrapper pcw) throws Exception {
optionListPrice = BigDecimal.ZERO;
optionPrice = BigDecimal.ZERO;
for (GenericValue oneComponent: componentList) {
BigDecimal listPrice = BigDecimal.ZERO;
BigDecimal price = BigDecimal.ZERO;
GenericValue oneComponentProduct = oneComponent.getRelatedOne("ProductProduct", false);
String variantProductId = componentOptions.get(oneComponent.getString("productId"));
if (UtilValidate.isNotEmpty(variantProductId)) {
oneComponentProduct = pcw.delegator.findOne("Product", UtilMisc.toMap("productId", variantProductId), false);
}
// Get the component's price
Map<String, Object> fieldMap = UtilMisc.toMap("product", oneComponentProduct, "prodCatalogId", pcw.catalogId, "webSiteId", pcw.webSiteId, "currencyUomId", pcw.currencyUomId, "productPricePurposeId", "COMPONENT_PRICE", "autoUserLogin", pcw.autoUserLogin, "productStoreId",productStoreId);
Map<String, Object> priceMap = pcw.getDispatcher().runSync("calculateProductPrice", fieldMap);
BigDecimal componentListPrice = (BigDecimal) priceMap.get("listPrice");
BigDecimal componentPrice = (BigDecimal) priceMap.get("price");
Boolean validPriceFound = (Boolean)priceMap.get("validPriceFound");
BigDecimal mult = BigDecimal.ONE;
if (oneComponent.getBigDecimal("quantity") != null) {
mult = oneComponent.getBigDecimal("quantity");
}
if (mult.compareTo(BigDecimal.ZERO) == 0) {
mult = BigDecimal.ONE;
}
if (validPriceFound.booleanValue()) {
if (componentListPrice != null) {
listPrice = componentListPrice;
}
if (componentPrice != null) {
price = componentPrice;
}
} else {
fieldMap.put("productPricePurposeId", "PURCHASE");
Map<String, Object> purchasePriceResultMap = pcw.getDispatcher().runSync("calculateProductPrice", fieldMap);
BigDecimal purchaseListPrice = (BigDecimal) purchasePriceResultMap.get("listPrice");
BigDecimal purchasePrice = (BigDecimal) purchasePriceResultMap.get("price");
if (purchaseListPrice != null) {
listPrice = purchaseListPrice;
}
if (purchasePrice != null) {
price = purchasePrice;
}
}
optionListPrice = optionListPrice.add(listPrice.multiply(mult));
optionPrice = optionPrice.add(price.multiply(mult));
}
}
public String getOptionName() {
return (configOption.getString("configOptionName") != null? configOption.getString("configOptionName"): "no option name");
}
public String getOptionName(Locale locale) {
return (configOption.getString("configOptionName") != null? (String) configOption.get("configOptionName", locale): "no option name");
}
public String getDescription() {
return (configOption.getString("description") != null? configOption.getString("description"): "no description");
}
public String getDescription(Locale locale) {
return (configOption.getString("description") != null? (String) configOption.get("description", locale): "no description");
}
public String getId() {
return configOption.getString("configOptionId");
}
public String getComments() {
return comments;
}
public void setComments(String comments) {
this.comments = comments;
}
public BigDecimal getListPrice() {
return optionListPrice;
}
public BigDecimal getPrice() {
return optionPrice;
}
public BigDecimal getOffsetListPrice() {
ConfigOption defaultConfigOption = parentConfigItem.getDefault();
if (parentConfigItem.isSingleChoice() && UtilValidate.isNotEmpty(defaultConfigOption)) {
return optionListPrice.subtract(defaultConfigOption.getListPrice());
} else { // can select multiple or no default; show full price
return optionListPrice;
}
}
public BigDecimal getOffsetPrice() {
ConfigOption defaultConfigOption = parentConfigItem.getDefault();
if (parentConfigItem.isSingleChoice() && UtilValidate.isNotEmpty(defaultConfigOption)) {
return optionPrice.subtract(defaultConfigOption.getPrice());
} else { // can select multiple or no default; show full price
return optionPrice;
}
}
public boolean isDefault() {
ConfigOption defaultConfigOption = parentConfigItem.getDefault();
if (this.equals(defaultConfigOption)) {
return true;
}
return false;
}
public boolean hasVirtualComponent () {
List <GenericValue> components = getComponents();
if (UtilValidate.isNotEmpty(components)) {
for (GenericValue component : components) {
if (isVirtualComponent(component)) {
return true;
}
}
}
return false;
}
public boolean isVirtualComponent (GenericValue component) {
int index = getComponents().indexOf(component);
if (index != -1) {
try {
GenericValue product = component.getRelatedOne("ProductProduct", false);
return "Y".equals(product.getString("isVirtual"));
} catch (GenericEntityException e) {
Debug.logWarning(e.getMessage(), module);
}
}
return false;
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean newValue) {
selected = newValue;
}
public boolean isAvailable() {
return available;
}
public void setAvailable(boolean newValue) {
available = newValue;
}
public List<GenericValue> getComponents() {
return componentList;
}
public Map<String, String> getComponentOptions() {
return componentOptions;
}
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof ConfigOption)) {
return false;
}
ConfigOption co = (ConfigOption)obj;
if (componentOptions != null && !componentOptions.equals(co.getComponentOptions())) {
return false;
}
return isSelected() == co.isSelected();
}
@Override
public String toString() {
return configOption.getString("configItemId") + "/" + configOption.getString("configOptionId") + (isSelected()? "*": "");
}
}
}