001 /** 002 * Copyright 2010 The Kuali Foundation Licensed under the 003 * Educational Community License, Version 2.0 (the "License"); you may 004 * not use this file except in compliance with the License. You may 005 * obtain a copy of the License at 006 * 007 * http://www.osedu.org/licenses/ECL-2.0 008 * 009 * Unless required by applicable law or agreed to in writing, 010 * software distributed under the License is distributed on an "AS IS" 011 * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 012 * or implied. See the License for the specific language governing 013 * permissions and limitations under the License. 014 */ 015 016 package org.kuali.rice.student.kew.xml; 017 018 import java.security.GeneralSecurityException; 019 import java.util.ArrayList; 020 import java.util.List; 021 022 import org.apache.commons.lang.StringUtils; 023 import org.apache.log4j.Logger; 024 import org.jdom.Element; 025 import org.jdom.Namespace; 026 import org.kuali.rice.kew.xml.UserXmlParser; 027 import org.kuali.rice.kim.bo.entity.impl.KimEntityAffiliationImpl; 028 import org.kuali.rice.kim.bo.entity.impl.KimEntityEmailImpl; 029 import org.kuali.rice.kim.bo.entity.impl.KimEntityEmploymentInformationImpl; 030 import org.kuali.rice.kim.bo.entity.impl.KimEntityEntityTypeImpl; 031 import org.kuali.rice.kim.bo.entity.impl.KimEntityImpl; 032 import org.kuali.rice.kim.bo.entity.impl.KimEntityNameImpl; 033 import org.kuali.rice.kim.bo.entity.impl.KimPrincipalImpl; 034 import org.kuali.rice.kns.service.KNSServiceLocator; 035 import org.kuali.rice.kns.service.SequenceAccessorService; 036 037 /** 038 * Adds password to the User xml ingestion 039 * 040 */ 041 public class KSUserXmlParser extends UserXmlParser { 042 043 protected final Logger LOG = Logger.getLogger(getClass()); 044 045 private static final Namespace NAMESPACE = Namespace.getNamespace("", "ns:workflow/User"); 046 047 private static final String WORKFLOW_ID_ELEMENT = "workflowId"; 048 private static final String AUTHENTICATION_ID_ELEMENT = "authenticationId"; 049 private static final String PRINCIPAL_ID_ELEMENT = "principalId"; 050 private static final String PRINCIPAL_NAME_ELEMENT = "principalName"; 051 private static final String EMPL_ID_ELEMENT = "emplId"; 052 private static final String EMAIL_ELEMENT = "emailAddress"; 053 private static final String GIVEN_NAME_ELEMENT = "givenName"; 054 private static final String LAST_NAME_ELEMENT = "lastName"; 055 private static final String TYPE_ELEMENT = "type"; 056 private static final String PASSWORD_ELEMENT = "password"; 057 private static final String HASH_SUFFIX = "(&^HSH#&)"; 058 059 private static final String AFFILIATION_CD_ELEMENT = "affiliationTypeCode"; 060 private static final String ACTIVE_ELEMENT = "active"; 061 private static final String CAMPUS_CD_ELEMENT = "campusCode"; 062 063 @Override 064 protected KimEntityImpl constructEntity(Element userElement) { 065 SequenceAccessorService sas = KNSServiceLocator.getSequenceAccessorService(); 066 067 String firstName = userElement.getChildTextTrim(GIVEN_NAME_ELEMENT, NAMESPACE); 068 String lastName = userElement.getChildTextTrim(LAST_NAME_ELEMENT, NAMESPACE); 069 String emplId = userElement.getChildTextTrim(EMPL_ID_ELEMENT, NAMESPACE); 070 String entityTypeCode = userElement.getChildTextTrim(TYPE_ELEMENT, NAMESPACE); 071 if (StringUtils.isBlank(entityTypeCode)) { 072 entityTypeCode = "PERSON"; 073 } 074 075 Long entityId = sas.getNextAvailableSequenceNumber("KRIM_ENTITY_ID_S", 076 KimEntityEmploymentInformationImpl.class); 077 078 // if they define an empl id, let's set that up 079 KimEntityEmploymentInformationImpl emplInfo = null; 080 if (!StringUtils.isBlank(emplId)) { 081 emplInfo = new KimEntityEmploymentInformationImpl(); 082 emplInfo.setActive(true); 083 emplInfo.setEmployeeId(emplId); 084 emplInfo.setPrimary(true); 085 emplInfo.setEntityId("" + entityId); 086 emplInfo.setEntityEmploymentId(emplId); 087 } 088 089 090 KimEntityImpl entity = new KimEntityImpl(); 091 092 //Set active on the entity 093 String active = userElement.getChildTextTrim(ACTIVE_ELEMENT, NAMESPACE); 094 if("false".equals(active)){ 095 entity.setActive(false); 096 }else{ 097 entity.setActive(true); 098 } 099 100 101 entity.setEntityId("" + entityId); 102 List<KimEntityEmploymentInformationImpl> emplInfos = new ArrayList<KimEntityEmploymentInformationImpl>(); 103 if (emplInfo != null) { 104 emplInfos.add(emplInfo); 105 } 106 entity.setEmploymentInformation(emplInfos); 107 108 //Add affiliations 109 String affiliationTypeCode = userElement.getChildTextTrim(AFFILIATION_CD_ELEMENT, NAMESPACE); 110 if (!StringUtils.isBlank(affiliationTypeCode)) { 111 if(entity.getAffiliations()==null){ 112 entity.setAffiliations(new ArrayList<KimEntityAffiliationImpl>()); 113 } 114 KimEntityAffiliationImpl affiliation = new KimEntityAffiliationImpl(); 115 116 Long affiliationId = sas.getNextAvailableSequenceNumber( 117 "KRIM_ENTITY_AFLTN_ID_S", KimEntityAffiliationImpl.class); 118 affiliation.setEntityAffiliationId(""+affiliationId); 119 affiliation.setAffiliationTypeCode(affiliationTypeCode); 120 affiliation.setActive(true); 121 affiliation.setDefault(true); 122 affiliation.setEntityId(entity.getEntityId()); 123 String campusCode = userElement.getChildTextTrim(CAMPUS_CD_ELEMENT, NAMESPACE); 124 if(!StringUtils.isBlank(campusCode)){ 125 affiliation.setCampusCode(campusCode); 126 } 127 entity.getAffiliations().add(affiliation); 128 } 129 130 KimEntityEntityTypeImpl entityType = new KimEntityEntityTypeImpl(); 131 entity.getEntityTypes().add(entityType); 132 entityType.setEntityTypeCode(entityTypeCode); 133 entityType.setEntityId(entity.getEntityId()); 134 entityType.setActive(true); 135 136 if (!StringUtils.isBlank(firstName) || !StringUtils.isBlank(lastName)) { 137 Long entityNameId = sas.getNextAvailableSequenceNumber( 138 "KRIM_ENTITY_NM_ID_S", KimEntityNameImpl.class); 139 KimEntityNameImpl name = new KimEntityNameImpl(); 140 name.setActive(true); 141 name.setEntityNameId("" + entityNameId); 142 name.setEntityId(entity.getEntityId()); 143 // must be in krim_ent_nm_typ_t.ent_nm_typ_cd 144 name.setNameTypeCode("PRFR"); 145 name.setFirstName(firstName); 146 name.setMiddleName(""); 147 name.setLastName(lastName); 148 name.setDefault(true); 149 150 entity.getNames().add(name); 151 } 152 153 KNSServiceLocator.getBusinessObjectService().save(entity); 154 155 String emailAddress = userElement.getChildTextTrim(EMAIL_ELEMENT, NAMESPACE); 156 if (!StringUtils.isBlank(emailAddress)) { 157 Long emailId = sas.getNextAvailableSequenceNumber( 158 "KRIM_ENTITY_EMAIL_ID_S", KimEntityEmailImpl.class); 159 KimEntityEmailImpl email = new KimEntityEmailImpl(); 160 email.setActive(true); 161 email.setEntityEmailId("" + emailId); 162 email.setEntityTypeCode("PERSON"); 163 // must be in krim_email_typ_t.email_typ_cd: 164 email.setEmailTypeCode("WRK"); 165 email.setEmailAddress(emailAddress); 166 email.setDefault(true); 167 email.setEntityId(entity.getEntityId()); 168 KNSServiceLocator.getBusinessObjectService().save(email); 169 } 170 171 return entity; 172 } 173 174 @Override 175 protected KimPrincipalImpl constructPrincipal(Element userElement, String entityId) { 176 String principalId = userElement.getChildTextTrim(WORKFLOW_ID_ELEMENT, NAMESPACE); 177 if (principalId == null) { 178 principalId = userElement.getChildTextTrim(PRINCIPAL_ID_ELEMENT, NAMESPACE); 179 } 180 String principalName = userElement.getChildTextTrim(AUTHENTICATION_ID_ELEMENT, NAMESPACE); 181 if (principalName == null) { 182 principalName = userElement.getChildTextTrim(PRINCIPAL_NAME_ELEMENT, NAMESPACE); 183 } 184 String password= userElement.getChildTextTrim(PASSWORD_ELEMENT, NAMESPACE); 185 186 187 KimPrincipalImpl principal = new KimPrincipalImpl(); 188 principal.setActive(true); 189 principal.setPrincipalId(principalId); 190 principal.setPrincipalName(principalName); 191 principal.setEntityId(entityId); 192 try { 193 principal.setPassword(KNSServiceLocator.getEncryptionService().hash(password)+HASH_SUFFIX); 194 } catch (GeneralSecurityException e) { 195 LOG.warn("Error hashing password.",e); 196 } 197 KNSServiceLocator.getBusinessObjectService().save(principal); 198 199 return principal; 200 } 201 }