/*
* Copyright (c) 2010-2015 Evolveum
*
* 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.
*/
package com.evolveum.midpoint.web.component.search;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
import com.evolveum.midpoint.prism.PrismReferenceDefinition;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.DisplayableValue;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.wicket.model.StringResourceModel;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* @author Viliam Repan (lazyman)
*/
public class SearchItem<T extends Serializable> implements Serializable {
public static final String F_VALUES = "values";
public enum Type {
TEXT, BOOLEAN, ENUM, BROWSER
}
private Search search;
private ItemPath path;
private ItemDefinition definition;
private List<DisplayableValue<T>> values;
private boolean fixed;
private boolean editWhenVisible;
public SearchItem(Search search, ItemPath path, ItemDefinition definition) {
Validate.notNull(path, "Item path must not be null.");
Validate.notNull(definition, "Item definition must not be null.");
if (!(definition instanceof PrismPropertyDefinition)
&& !(definition instanceof PrismReferenceDefinition)) {
throw new IllegalArgumentException("Unknown item definition type '" + definition + "'");
}
this.search = search;
this.path = path;
this.definition = definition;
}
public ItemPath getPath() {
return path;
}
public ItemDefinition getDefinition() {
return definition;
}
public String getName() {
String key = definition.getDisplayName();
if (StringUtils.isEmpty(key)) {
StringBuilder sb = new StringBuilder();
sb.append(search.getType().getSimpleName()).append('.').append(definition.getName().getLocalPart());
key = sb.toString();
}
StringResourceModel nameModel = PageBase.createStringResourceStatic(null, key);
if (nameModel != null){
if (StringUtils.isNotEmpty(nameModel.getString())) {
return nameModel.getString();
}
}
String name = definition.getDisplayName();
if (StringUtils.isNotEmpty(name)) {
return name;
}
return definition.getName().getLocalPart();
}
public Type getType() {
if (definition instanceof PrismReferenceDefinition) {
return Type.BROWSER;
}
PrismPropertyDefinition def = (PrismPropertyDefinition) definition;
if (def.getAllowedValues() != null && !def.getAllowedValues().isEmpty()) {
return Type.ENUM;
}
if (DOMUtil.XSD_BOOLEAN.equals(def.getTypeName())) {
return Type.BOOLEAN;
}
return Type.TEXT;
}
public List<DisplayableValue<T>> getValues() {
if (values == null) {
values = new ArrayList<>();
}
return values;
}
public void setValues(List<DisplayableValue<T>> values) {
this.values = values;
}
public Search getSearch() {
return search;
}
public List<DisplayableValue> getAllowedValues() {
List<DisplayableValue> list = new ArrayList();
if (!(definition instanceof PrismPropertyDefinition)) {
return list;
}
PrismPropertyDefinition def = (PrismPropertyDefinition) definition;
list.addAll(def.getAllowedValues());
return list;
}
public boolean isFixed() {
return fixed;
}
public void setFixed(boolean fixed) {
this.fixed = fixed;
}
public boolean isEditWhenVisible() {
return editWhenVisible;
}
public void setEditWhenVisible(boolean editWhenVisible) {
this.editWhenVisible = editWhenVisible;
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("definition", definition)
.append("search", search)
.append("path", path)
.append("values", values)
.toString();
}
}