package org.wso2.carbon.identity.workflow.mgt.util; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.CarbonContext; import org.wso2.carbon.identity.workflow.mgt.bean.Parameter; import org.wso2.carbon.identity.workflow.mgt.exception.WorkflowException; import org.wso2.carbon.identity.workflow.mgt.exception.WorkflowRuntimeException; import org.wso2.carbon.user.api.UserStoreException; import org.wso2.carbon.user.core.UserCoreConstants; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URISyntaxException; import java.util.Arrays; import java.util.List; public class WorkflowManagementUtil { private static Log log = LogFactory.getLog(WorkflowManagementUtil.class); /** * Create a internal role in workflow domain with same name as workflow. * * @param workflowName Workflow name * @throws WorkflowException */ public static void createAppRole(String workflowName) throws WorkflowException { String roleName = createWorkflowRoleName(workflowName); String qualifiedUsername = CarbonContext.getThreadLocalCarbonContext().getUsername(); String[] user = {qualifiedUsername}; try { if (log.isDebugEnabled()) { log.debug("Creating workflow role : " + roleName + " and assign the user : " + Arrays.toString(user) + " to that role"); } CarbonContext.getThreadLocalCarbonContext().getUserRealm().getUserStoreManager() .addRole(roleName, user, null); } catch (UserStoreException e) { throw new WorkflowException("Error while creating role", e); } } /** * Delete role created for workflow. * * @param workflowName Workflow name * @throws WorkflowException */ public static void deleteWorkflowRole(String workflowName) throws WorkflowException { String roleName = createWorkflowRoleName(workflowName); try { if (log.isDebugEnabled()) { log.debug("Deleting workflow role : " + roleName); } CarbonContext.getThreadLocalCarbonContext().getUserRealm().getUserStoreManager() .deleteRole(roleName); } catch (UserStoreException e) { throw new WorkflowException("Error while creating workflow", e); } } /** * Update name of workflow role * * @param oldWorkflowName Previous role name * @param newWorkflowName New role name * @throws WorkflowException */ public static void updateWorkflowRoleName(String oldWorkflowName, String newWorkflowName) throws WorkflowException { String oldRoleName = createWorkflowRoleName(oldWorkflowName); String newRoleName = createWorkflowRoleName(newWorkflowName); try { if (log.isDebugEnabled()) { log.debug("Updating workflow role : " + oldRoleName); } CarbonContext.getThreadLocalCarbonContext().getUserRealm().getUserStoreManager() .updateRoleName(oldRoleName, newRoleName); } catch (UserStoreException e) { throw new WorkflowException("Error while updating workflow role name.", e); } } /** * Generate owner role name for workflow. * * @param workflowName Workflow name * @return */ public static String createWorkflowRoleName(String workflowName) { return UserCoreConstants.INTERNAL_DOMAIN + UserCoreConstants.DOMAIN_SEPARATOR + workflowName; } /** * Un-marshall given string to given class type * * @param xmlString XML String that is validated against its XSD * @param classType Root Class Name to convert XML String to Object * @param <T> Root Class that should return * @return Instance of T * @throws JAXBException */ public static <T> T unmarshalXML(String xmlString, Class<T> classType) throws JAXBException { T t = null; if (xmlString != null) { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(xmlString.toString().getBytes()); JAXBContext jaxbContext = JAXBContext.newInstance(classType); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); t = (T) jaxbUnmarshaller.unmarshal(byteArrayInputStream); } return t; } /** * Reading File Content from the resource path * * @param resourceAsStream * @return * @throws URISyntaxException * @throws IOException */ public static String readFileFromResource(InputStream resourceAsStream) throws URISyntaxException, IOException { String content = null; try { BufferedInputStream bufferedInputStream = new BufferedInputStream(resourceAsStream); int c = -1; StringBuilder resourceFile = new StringBuilder(); while ((c = bufferedInputStream.read()) != -1) { char val = (char) c; resourceFile.append(val); } content = resourceFile.toString(); } catch (IOException e) { String errorMsg = "Error occurred while reading file from class path, " + e.getMessage(); log.error(errorMsg); throw new WorkflowRuntimeException(errorMsg, e); } return content; } /** * Utility method to read Parameter from the list * * @param parameterList * @param paramName * @param holder * @return */ public static Parameter getParameter(List<Parameter> parameterList, String paramName, String holder) { for (Parameter parameter : parameterList) { if (parameter.getParamName().equals(paramName) && parameter.getqName().equals(paramName) && parameter.getHolder().equals(holder)) { return parameter; } } return null; } }