package org.aperteworkflow.editor.ui.property; import org.apache.commons.lang.StringUtils; import org.aperteworkflow.editor.stepeditor.user.Property; import org.aperteworkflow.editor.ui.permission.PermissionDefinition; import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.*; import pl.net.bluesoft.rnd.util.i18n.I18NSource; import pl.net.bluesoft.util.lang.Classes; import java.lang.reflect.Field; import java.util.*; public class AperteProcessClassInfo { private List<Property<?>> properties; private List<PermissionDefinition> permissions; private String docName; private String docDescription; private String docIcon; private String aliasName; private boolean childrenAllowed; private Class<?> aperteClass; public AperteProcessClassInfo() {} public AperteProcessClassInfo(Class<?> aperteClass) { this(aperteClass, null); } public AperteProcessClassInfo(Class<?> aperteClass, Set<Permission> defaultPermissions) { this.aperteClass = aperteClass; AliasName an = Classes.getClassAnnotation(aperteClass, AliasName.class); ChildrenAllowed ca = aperteClass.getAnnotation(ChildrenAllowed.class); AperteDoc classDoc = Classes.getClassAnnotation(aperteClass, AperteDoc.class); List<Field> fields = Classes.getFieldsWithAnnotation(aperteClass, AutoWiredProperty.class); PermissionsUsed permissionsUsed = Classes.getClassAnnotation(aperteClass, PermissionsUsed.class); aliasName = an == null ? "" : an.name(); childrenAllowed = ca == null ? false : ca.value(); docName = null; docDescription = null; properties = new ArrayList<Property<?>>(); permissions = getPermissionsFromAnnotation(permissionsUsed, defaultPermissions); I18NSource i18NSource = I18NSource.ThreadUtil.getThreadI18nSource(); if (classDoc != null) { docName = i18NSource.getMessage(classDoc.humanNameKey()); docDescription = i18NSource.getMessage(classDoc.descriptionKey()); docIcon = i18NSource.getMessage(classDoc.icon()); } if (StringUtils.isEmpty(docName)) { docName = aliasName; } if (StringUtils.isEmpty(docDescription)) { docDescription = aperteClass.getSimpleName(); } if (fields != null && !fields.isEmpty()) { for (Field field : fields) { properties.add(getProperty(field)); } Collections.sort(properties); } } private Property getProperty(Field field) { AutoWiredProperty awp = field.getAnnotation(AutoWiredProperty.class); AutoWiredPropertyConfigurator awpConfigurator = field.getAnnotation(AutoWiredPropertyConfigurator.class); AperteDoc fieldDoc = field.getAnnotation(AperteDoc.class); I18NSource i18NSource = I18NSource.ThreadUtil.getThreadI18nSource(); String fieldDocName = null; String fieldDocDescription = null; if (fieldDoc != null) { fieldDocName = i18NSource.getMessage(fieldDoc.humanNameKey()); fieldDocDescription = i18NSource.getMessage(fieldDoc.descriptionKey()); } if (StringUtils.isEmpty(fieldDocName)) { fieldDocName = field.getName(); } if (StringUtils.isEmpty(fieldDocDescription)) { fieldDocDescription = field.getName(); } Property property = new Property(null, field.getType()); property.setPropertyId(field.getName()); property.setName(fieldDocName); property.setDescription(fieldDocDescription); if (awp != null) { property.setRequired(awp.required()); } if (awpConfigurator != null) { property.setPropertyFieldClass(awpConfigurator.fieldClass()); } return property; } public List<Property<?>> getProperties() { return properties; } public void setProperties(List<Property<?>> properties) { this.properties = properties; } public String getDocName() { return docName; } public void setDocName(String docName) { this.docName = docName; } public String getDocDescription() { return docDescription; } public void setDocDescription(String docDescription) { this.docDescription = docDescription; } public String getAliasName() { return aliasName; } public void setAliasName(String aliasName) { this.aliasName = aliasName; } public boolean isChildrenAllowed() { return childrenAllowed; } public void setChildrenAllowed(boolean childrenAllowed) { this.childrenAllowed = childrenAllowed; } public Class<?> getAperteClass() { return aperteClass; } public void setAperteClass(Class<?> aperteClass) { this.aperteClass = aperteClass; } public String getDocIcon() { return docIcon; } public void setDocIcon(String docIcon) { this.docIcon = docIcon; } public List<PermissionDefinition> getPermissions() { return permissions; } public void setPermissions(List<PermissionDefinition> permissions) { this.permissions = permissions; } private List<PermissionDefinition> getPermissionsFromAnnotation(PermissionsUsed permissionsUsed, Set<Permission> defaultPermissions) { List<PermissionDefinition> permissions = new ArrayList<PermissionDefinition>(); Set<Permission> perms = null; if (permissionsUsed == null) { // only use default permissions when widget does not provide own annotation perms = defaultPermissions; } else { Permission[] usedPermissions = permissionsUsed.value(); if (usedPermissions != null && usedPermissions.length > 0) { perms = new HashSet<Permission>(); perms.addAll(Arrays.asList(usedPermissions)); } } if (perms != null) { for (Permission perm : perms) { PermissionDefinition permissionDefinition = new PermissionDefinition(); permissionDefinition.setKey(perm.key()); permissionDefinition.setDescription(perm.desc()); permissions.add(permissionDefinition); } Collections.sort(permissions); } return permissions; } }