/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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.jbpm.services.task.identity; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import org.kie.api.task.model.Group; import org.kie.api.task.model.OrganizationalEntity; import org.kie.api.task.model.User; import org.kie.internal.task.api.TaskModelProvider; import org.kie.internal.task.api.UserInfo; import org.kie.internal.task.api.model.InternalOrganizationalEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DefaultUserInfo extends AbstractUserGroupInfo implements UserInfo { private static final Logger logger = LoggerFactory.getLogger(DefaultUserInfo.class); protected Map<String, Map<String, Object>> registry = new HashMap<String, Map<String,Object>>(); //no no-arg constructor to prevent cdi from auto deploy public DefaultUserInfo(boolean activate) { try { Properties registryProps = new Properties(); // BZ-1037445: Obtain the properties file from the webapp classload (current thread classloader). // If not, when deploying the app into EAP static modules will fail. InputStream in = this.getClass().getResourceAsStream("/userinfo.properties"); if (in == null) { in = Thread.currentThread().getContextClassLoader().getResourceAsStream("/userinfo.properties"); } if( in != null ) { registryProps.load(in); buildRegistry(registryProps); } } catch (Exception e) { logger.warn("Problem loading userinfo properties {}", e.getMessage(), e); } } /** * Constructs default UserInfo implementation to provide required information to the escalation handler. * following is the string for every organizational entity * entityId=email:locale:displayname:[member,member] * members are optional and should be given for group entities * @param registryProps */ public DefaultUserInfo(Properties registryProps) { buildRegistry(registryProps); } public String getDisplayName(OrganizationalEntity entity) { Map<String, Object> entityInfo = registry.get(entity.getId()); if (entityInfo != null) { return (String) entityInfo.get("name"); } return null; } @SuppressWarnings("unchecked") public Iterator<OrganizationalEntity> getMembersForGroup(Group group) { Map<String, Object> entityInfo = registry.get(group.getId()); if (entityInfo != null && entityInfo.get("members") != null) { return ((List<OrganizationalEntity>) entityInfo.get("members")).iterator(); } return null; } public boolean hasEmail(Group group) { Map<String, Object> entityInfo = registry.get(group.getId()); if (entityInfo != null) { return entityInfo.containsKey("email"); } return false; } public String getEmailForEntity(OrganizationalEntity entity) { Map<String, Object> entityInfo = registry.get(entity.getId()); if (entityInfo != null) { return (String) entityInfo.get("email"); } throw new IllegalStateException("No EMail address found for " + entity.getId()); } public String getLanguageForEntity(OrganizationalEntity entity) { Map<String, Object> entityInfo = registry.get(entity.getId()); if (entityInfo != null) { return (String) entityInfo.get("locale"); } return null; } protected void buildRegistry(Properties registryProps) { if (registryProps != null) { Iterator<Object> propertyKeys = registryProps.keySet().iterator(); while (propertyKeys.hasNext()) { String propertyKey = (String) propertyKeys.next(); // following is the string for every organizational entity // email:locale:displayname:[member,member] // members are optional and should be given for group entities String propertyValue = registryProps.getProperty(propertyKey); String[] elems = propertyValue.split(":"); Map<String, Object> entityInfo = new HashMap<String, Object>(); entityInfo.put("email", elems[0]); entityInfo.put("locale", elems[1]); entityInfo.put("name", elems[2]); if (elems.length == 4 && elems[3] != null) { String memberList = elems[3]; if (memberList.startsWith("[")) { memberList = memberList.substring(1); } if (memberList.endsWith("]")) { memberList = memberList.substring(0, memberList.length()-1); } String[] members = memberList.split(","); List<OrganizationalEntity> membersList = new ArrayList<OrganizationalEntity>(); for (String member : members) { User user = TaskModelProvider.getFactory().newUser(); ((InternalOrganizationalEntity) user).setId(member); membersList.add(user); } entityInfo.put("members", membersList); } registry.put(propertyKey, entityInfo); } } } }