use of com.haulmont.chile.core.model.MetaProperty in project cuba by cuba-platform.
the class ConditionDescriptorsTreeBuilder method build.
@Override
public Tree<AbstractConditionDescriptor> build() {
Messages messages = AppBeans.get(Messages.class);
String messagesPack = filter.getFrame().getMessagesPack();
CollectionDatasource datasource = filter.getDatasource();
Tree<AbstractConditionDescriptor> tree = new Tree<>();
List<AbstractConditionDescriptor> propertyDescriptors = new ArrayList<>();
List<AbstractConditionDescriptor> customDescriptors = new ArrayList<>();
boolean propertiesExplicitlyDefined = false;
if (filter.getXmlDescriptor() != null) {
for (Element element : Dom4j.elements(filter.getXmlDescriptor())) {
AbstractConditionDescriptor conditionDescriptor;
if ("properties".equals(element.getName())) {
addMultiplePropertyDescriptors(element, propertyDescriptors, filter);
propertiesExplicitlyDefined = true;
} else if ("property".equals(element.getName())) {
conditionDescriptor = new PropertyConditionDescriptor(element, messagesPack, filterComponentName, datasource);
propertyDescriptors.add(conditionDescriptor);
propertiesExplicitlyDefined = true;
} else if ("custom".equals(element.getName())) {
conditionDescriptor = new CustomConditionDescriptor(element, messagesPack, filterComponentName, datasource);
customDescriptors.add(conditionDescriptor);
propertiesExplicitlyDefined = true;
} else {
throw new UnsupportedOperationException("Element not supported: " + element.getName());
}
}
}
if (!propertiesExplicitlyDefined) {
addMultiplePropertyDescriptors(".*", "", propertyDescriptors, filter);
}
propertyDescriptors.sort(new ConditionDescriptorComparator());
customDescriptors.sort(new ConditionDescriptorComparator());
HeaderConditionDescriptor propertyHeaderDescriptor = new HeaderConditionDescriptor("propertyConditions", messages.getMainMessage("filter.addCondition.propertyConditions"), filterComponentName, datasource);
HeaderConditionDescriptor customHeaderDescriptor = new HeaderConditionDescriptor("customConditions", messages.getMainMessage("filter.addCondition.customConditions"), filterComponentName, datasource);
Node<AbstractConditionDescriptor> propertyHeaderNode = new Node<>(propertyHeaderDescriptor);
Node<AbstractConditionDescriptor> customHeaderNode = new Node<>(customHeaderDescriptor);
int currentDepth = 0;
for (AbstractConditionDescriptor propertyDescriptor : propertyDescriptors) {
MetaClass propertyDsMetaClass = propertyDescriptor.getDatasourceMetaClass();
MetaPropertyPath propertyPath = propertyDsMetaClass.getPropertyPath(propertyDescriptor.getName());
if (propertyPath == null) {
log.error("Property path for {} of metaClass {} not found", propertyDescriptor.getName(), propertyDsMetaClass.getName());
continue;
}
MetaProperty metaProperty = propertyPath.getMetaProperty();
MetaClass propertyEnclosingMetaClass = metadataTools.getPropertyEnclosingMetaClass(propertyPath);
if (isPropertyAllowed(propertyEnclosingMetaClass, metaProperty) && !excludedProperties.contains(metaProperty.getName())) {
Node<AbstractConditionDescriptor> node = new Node<>(propertyDescriptor);
propertyHeaderNode.addChild(node);
if (currentDepth < hierarchyDepth) {
recursivelyFillPropertyDescriptors(node, currentDepth);
}
}
}
for (AbstractConditionDescriptor customDescriptor : customDescriptors) {
Node<AbstractConditionDescriptor> node = new Node<>(customDescriptor);
customHeaderNode.addChild(node);
}
List<Node<AbstractConditionDescriptor>> rootNodes = new ArrayList<>();
rootNodes.add(propertyHeaderNode);
if (!customDescriptors.isEmpty())
rootNodes.add(customHeaderNode);
if (!hideCustomConditions && security.isSpecificPermitted(CUSTOM_CONDITIONS_PERMISSION)) {
rootNodes.add(new Node<>(new CustomConditionCreator(filterComponentName, datasource)));
}
if (!hideDynamicAttributes && !dynamicAttributes.getAttributesForMetaClass(datasource.getMetaClass()).isEmpty()) {
rootNodes.add(new Node<>(new DynamicAttributesConditionCreator(filterComponentName, datasource, "")));
}
if (FtsConfigHelper.getEnabled()) {
rootNodes.add(new Node<>(new FtsConditionDescriptor(filterComponentName, datasource)));
}
tree.setRootNodes(rootNodes);
return tree;
}
use of com.haulmont.chile.core.model.MetaProperty in project cuba by cuba-platform.
the class ConditionDescriptorsTreeBuilder method recursivelyFillPropertyDescriptors.
protected void recursivelyFillPropertyDescriptors(Node<AbstractConditionDescriptor> parentNode, int currentDepth) {
currentDepth++;
List<AbstractConditionDescriptor> descriptors = new ArrayList<>();
MetaClass filterMetaClass = filter.getDatasource().getMetaClass();
String propertyId = parentNode.getData().getName();
MetaPropertyPath mpp = filterMetaClass.getPropertyPath(propertyId);
if (mpp == null) {
throw new RuntimeException("Unable to find property " + propertyId);
}
MetaProperty metaProperty = mpp.getMetaProperty();
if (metaProperty.getRange().isClass() && (metadataTools.getCrossDataStoreReferenceIdProperty(storeName, metaProperty) == null)) {
MetaClass childMetaClass = metaProperty.getRange().asClass();
for (MetaProperty property : childMetaClass.getProperties()) {
if (isPropertyAllowed(childMetaClass, property)) {
String propertyPath = mpp.toString() + "." + property.getName();
if (excludedProperties.contains(propertyPath))
continue;
PropertyConditionDescriptor childPropertyConditionDescriptor = new PropertyConditionDescriptor(propertyPath, null, filter.getFrame().getMessagesPack(), filterComponentName, filter.getDatasource());
descriptors.add(childPropertyConditionDescriptor);
}
}
}
descriptors.sort(new ConditionDescriptorComparator());
for (AbstractConditionDescriptor descriptor : descriptors) {
Node<AbstractConditionDescriptor> newNode = new Node<>(descriptor);
parentNode.addChild(newNode);
if (currentDepth < hierarchyDepth) {
recursivelyFillPropertyDescriptors(newNode, currentDepth);
}
}
if (metaProperty.getRange().isClass()) {
MetaClass childMetaClass = metaProperty.getRange().asClass();
if (!dynamicAttributes.getAttributesForMetaClass(childMetaClass).isEmpty()) {
DynamicAttributesConditionCreator descriptor = new DynamicAttributesConditionCreator(filterComponentName, filter.getDatasource(), propertyId);
Node<AbstractConditionDescriptor> newNode = new Node<>(descriptor);
parentNode.addChild(newNode);
}
}
}
use of com.haulmont.chile.core.model.MetaProperty in project cuba by cuba-platform.
the class FilterConditionUtils method formatParamValue.
public static String formatParamValue(Param param, Object value) {
// noinspection unchecked
Datatype datatype = Datatypes.get(param.getJavaClass());
MetaProperty property = param.getProperty();
if (property != null) {
TemporalType tt = (TemporalType) property.getAnnotations().get(MetadataTools.TEMPORAL_ANN_NAME);
if (tt == TemporalType.DATE) {
datatype = Datatypes.getNN(java.sql.Date.class);
}
}
if (datatype != null) {
UserSessionSource userSessionSource = AppBeans.get(UserSessionSource.class);
return datatype.format(value, userSessionSource.getLocale());
}
return value.toString();
}
use of com.haulmont.chile.core.model.MetaProperty in project cuba by cuba-platform.
the class FilterConditionUtils method getPropertyLocCaption.
public static String getPropertyLocCaption(MetaClass metaClass, String propertyPath) {
MessageTools messageTools = AppBeans.get(MessageTools.class);
MetaPropertyPath mpp = metaClass.getPropertyPath(propertyPath);
if (mpp == null) {
return propertyPath;
} else {
MetaProperty[] metaProperties = mpp.getMetaProperties();
StringBuilder sb = new StringBuilder();
List<String> metaPropertyNames = new ArrayList<>();
for (int i = 0; i < metaProperties.length; i++) {
metaPropertyNames.add(metaProperties[i].getName());
String currentMetaPropertyPath = StringUtils.join(metaPropertyNames, ".");
sb.append(messageTools.getPropertyCaption(metaClass, currentMetaPropertyPath));
if (i < metaProperties.length - 1) {
sb.append(".");
}
}
return sb.toString();
}
}
use of com.haulmont.chile.core.model.MetaProperty in project cuba by cuba-platform.
the class ExcelExporter method formatValueCell.
protected void formatValueCell(HSSFCell cell, @Nullable Object cellValue, @Nullable MetaPropertyPath metaPropertyPath, int sizersIndex, int notificationRequired, int level, @Nullable Integer groupChildCount) {
if (cellValue == null) {
return;
}
String childCountValue = "";
if (groupChildCount != null) {
childCountValue = " (" + groupChildCount + ")";
}
if (cellValue instanceof IdProxy) {
cellValue = ((IdProxy) cellValue).get();
}
if (cellValue instanceof Number) {
Number n = (Number) cellValue;
final Datatype datatype = Datatypes.getNN(n.getClass());
String str;
if (sizersIndex == 0) {
str = createSpaceString(level) + datatype.format(n);
cell.setCellValue(str);
} else {
try {
str = datatype.format(n);
Number result = (Number) datatype.parse(str);
if (result != null) {
if (n instanceof Integer || n instanceof Long || n instanceof Byte || n instanceof Short) {
cell.setCellValue(result.longValue());
cell.setCellStyle(integerFormatCellStyle);
} else {
cell.setCellValue(result.doubleValue());
cell.setCellStyle(doubleFormatCellStyle);
}
}
} catch (ParseException e) {
throw new RuntimeException("Unable to parse numeric value", e);
}
cell.setCellType(CellType.NUMERIC);
}
if (sizers[sizersIndex].isNotificationRequired(notificationRequired)) {
sizers[sizersIndex].notifyCellValue(str, stdFont);
}
} else if (cellValue instanceof Date) {
Class javaClass = null;
boolean supportTimezones = false;
TimeZone timeZone = userSessionSource.getUserSession().getTimeZone();
if (metaPropertyPath != null) {
MetaProperty metaProperty = metaPropertyPath.getMetaProperty();
if (metaProperty.getRange().isDatatype()) {
javaClass = metaProperty.getRange().asDatatype().getJavaClass();
}
Boolean ignoreUserTimeZone = metadataTools.getMetaAnnotationValue(metaProperty, IgnoreUserTimeZone.class);
supportTimezones = timeZone != null && Objects.equals(Date.class, javaClass) && !Boolean.TRUE.equals(ignoreUserTimeZone);
}
Date date = (Date) cellValue;
if (supportTimezones) {
TimeZone currentTimeZone = LocaleUtil.getUserTimeZone();
try {
LocaleUtil.setUserTimeZone(timeZone);
cell.setCellValue(date);
} finally {
if (Objects.equals(currentTimeZone, TimeZone.getDefault())) {
LocaleUtil.resetUserTimeZone();
} else {
LocaleUtil.setUserTimeZone(currentTimeZone);
}
}
} else {
cell.setCellValue(date);
}
if (Objects.equals(java.sql.Time.class, javaClass)) {
cell.setCellStyle(timeFormatCellStyle);
} else if (Objects.equals(java.sql.Date.class, javaClass)) {
cell.setCellStyle(dateFormatCellStyle);
} else {
cell.setCellStyle(dateTimeFormatCellStyle);
}
if (sizers[sizersIndex].isNotificationRequired(notificationRequired)) {
String str = Datatypes.getNN(Date.class).format(date);
sizers[sizersIndex].notifyCellValue(str, stdFont);
}
} else if (cellValue instanceof Boolean) {
String str = "";
if (sizersIndex == 0) {
str += createSpaceString(level);
}
str += ((Boolean) cellValue) ? trueStr : falseStr;
cell.setCellValue(new HSSFRichTextString(str));
if (sizers[sizersIndex].isNotificationRequired(notificationRequired)) {
sizers[sizersIndex].notifyCellValue(str, stdFont);
}
} else if (cellValue instanceof EnumClass) {
String nameKey = cellValue.getClass().getSimpleName() + "." + cellValue.toString();
final String message = sizersIndex == 0 ? createSpaceString(level) + messages.getMessage(cellValue.getClass(), nameKey) : messages.getMessage(cellValue.getClass(), nameKey);
cell.setCellValue(message + childCountValue);
if (sizers[sizersIndex].isNotificationRequired(notificationRequired)) {
sizers[sizersIndex].notifyCellValue(message, stdFont);
}
} else if (cellValue instanceof Entity) {
Entity entityVal = (Entity) cellValue;
String instanceName = entityVal.getInstanceName();
String str = sizersIndex == 0 ? createSpaceString(level) + instanceName : instanceName;
str = str + childCountValue;
cell.setCellValue(new HSSFRichTextString(str));
if (sizers[sizersIndex].isNotificationRequired(notificationRequired)) {
sizers[sizersIndex].notifyCellValue(str, stdFont);
}
} else if (cellValue instanceof Collection) {
String str = "";
cell.setCellValue(new HSSFRichTextString(str));
if (sizers[sizersIndex].isNotificationRequired(notificationRequired)) {
sizers[sizersIndex].notifyCellValue(str, stdFont);
}
} else {
String strValue = cellValue == null ? "" : cellValue.toString();
String str = sizersIndex == 0 ? createSpaceString(level) + strValue : strValue;
str = str + childCountValue;
cell.setCellValue(new HSSFRichTextString(str));
if (sizers[sizersIndex].isNotificationRequired(notificationRequired)) {
sizers[sizersIndex].notifyCellValue(str, stdFont);
}
}
}
Aggregations