001 /**
002 * Copyright 2005-2013 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.rice.kew.xml;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.jdom.Document;
020 import org.jdom.Element;
021 import org.jdom.JDOMException;
022 import org.jdom.Namespace;
023 import org.kuali.rice.core.api.util.xml.XmlException;
024 import org.kuali.rice.core.api.util.xml.XmlHelper;
025 import org.kuali.rice.kim.api.identity.CodedAttribute;
026 import org.kuali.rice.kim.api.identity.email.EntityEmail;
027 import org.kuali.rice.kim.impl.identity.email.EntityEmailBo;
028 import org.kuali.rice.kim.impl.identity.employment.EntityEmploymentBo;
029 import org.kuali.rice.kim.impl.identity.entity.EntityBo;
030 import org.kuali.rice.kim.impl.identity.name.EntityNameBo;
031 import org.kuali.rice.kim.impl.identity.principal.PrincipalBo;
032 import org.kuali.rice.kim.impl.identity.type.EntityTypeContactInfoBo;
033 import org.kuali.rice.krad.service.KRADServiceLocator;
034 import org.kuali.rice.krad.service.SequenceAccessorService;
035 import org.xml.sax.SAXException;
036
037 import javax.xml.parsers.ParserConfigurationException;
038 import java.io.IOException;
039 import java.io.InputStream;
040 import java.util.ArrayList;
041 import java.util.Collections;
042 import java.util.Iterator;
043 import java.util.List;
044
045 /**
046 * Parses users from XML.
047 *
048 * This is really meant for use only in the unit tests and was written to help ease
049 * transition over to KIM. There are numerous unit tests which took advantage of
050 * the ability to import "users" from XML in KEW. KIM does not provide XML
051 * import capabilities in the initial implementation so this class provides that.
052 *
053 * @author Kuali Rice Team (rice.collab@kuali.org)
054 *
055 */
056 public class UserXmlParser {
057
058 private static final Namespace NAMESPACE = Namespace.getNamespace("", "ns:workflow/User");
059
060 private static final String USERS_ELEMENT = "users";
061 private static final String USER_ELEMENT = "user";
062 private static final String WORKFLOW_ID_ELEMENT = "workflowId";
063 private static final String AUTHENTICATION_ID_ELEMENT = "authenticationId";
064 private static final String PRINCIPAL_ID_ELEMENT = "principalId";
065 private static final String PRINCIPAL_NAME_ELEMENT = "principalName";
066 private static final String EMPL_ID_ELEMENT = "emplId";
067 private static final String EMAIL_ELEMENT = "emailAddress";
068 private static final String GIVEN_NAME_ELEMENT = "givenName";
069 private static final String LAST_NAME_ELEMENT = "lastName";
070 private static final String TYPE_ELEMENT = "type";
071
072 public void parseUsers(InputStream input) throws IOException, XmlException {
073 try {
074 Document doc = XmlHelper.trimSAXXml(input);
075 Element root = doc.getRootElement();
076 parseUsers(root);
077 } catch (JDOMException e) {
078 throw new XmlException("Parse error.", e);
079 } catch (SAXException e){
080 throw new XmlException("Parse error.",e);
081 } catch(ParserConfigurationException e){
082 throw new XmlException("Parse error.",e);
083 }
084 }
085
086 public void parseUsers(Element root) throws XmlException {
087 for (Iterator usersElementIt = root.getChildren(USERS_ELEMENT, NAMESPACE).iterator(); usersElementIt.hasNext();) {
088 Element usersElement = (Element) usersElementIt.next();
089 for (Iterator iterator = usersElement.getChildren(USER_ELEMENT, NAMESPACE).iterator(); iterator.hasNext();) {
090 Element userElement = (Element) iterator.next();
091 EntityBo entity = constructEntity(userElement);
092 constructPrincipal(userElement, entity.getId());
093 }
094 }
095 }
096
097 protected EntityBo constructEntity(Element userElement) {
098 SequenceAccessorService sas = KRADServiceLocator.getSequenceAccessorService();
099
100 String firstName = userElement.getChildTextTrim(GIVEN_NAME_ELEMENT, NAMESPACE);
101 String lastName = userElement.getChildTextTrim(LAST_NAME_ELEMENT, NAMESPACE);
102 String emplId = userElement.getChildTextTrim(EMPL_ID_ELEMENT, NAMESPACE);
103 String entityTypeCode = userElement.getChildTextTrim(TYPE_ELEMENT, NAMESPACE);
104 if (StringUtils.isBlank(entityTypeCode)) {
105 entityTypeCode = "PERSON";
106 }
107
108 Long entityId = sas.getNextAvailableSequenceNumber("KRIM_ENTITY_ID_S",
109 EntityEmploymentBo.class);
110
111 // if they define an empl id, let's set that up
112 EntityEmploymentBo emplInfo = null;
113 if (!StringUtils.isBlank(emplId)) {
114 emplInfo = new EntityEmploymentBo();
115 emplInfo.setActive(true);
116 emplInfo.setEmployeeId(emplId);
117 emplInfo.setPrimary(true);
118 emplInfo.setEntityId("" + entityId);
119 emplInfo.setId(emplId);
120 emplInfo.setEntityAffiliationId(null);
121 }
122
123
124 EntityBo entity = new EntityBo();
125 entity.setActive(true);
126 entity.setId("" + entityId);
127 List<EntityEmploymentBo> emplInfos = new ArrayList<EntityEmploymentBo>();
128 if (emplInfo != null) {
129 emplInfos.add(emplInfo);
130 }
131 entity.setEmploymentInformation(emplInfos);
132
133 EntityTypeContactInfoBo entityType = new EntityTypeContactInfoBo();
134 //identity.getEntityTypes().add(entityType);
135 entityType.setEntityTypeCode(entityTypeCode);
136 entityType.setEntityId(entity.getId());
137 entityType.setActive(true);
138 entityType.setVersionNumber(new Long(1));
139 String emailAddress = userElement.getChildTextTrim(EMAIL_ELEMENT, NAMESPACE);
140 if (!StringUtils.isBlank(emailAddress)) {
141 Long emailId = sas.getNextAvailableSequenceNumber(
142 "KRIM_ENTITY_EMAIL_ID_S", EntityEmailBo.class);
143 EntityEmail.Builder email = EntityEmail.Builder.create();
144 email.setActive(true);
145 email.setId("" + emailId);
146 email.setEntityTypeCode(entityTypeCode);
147 // must be in krim_email_typ_t.email_typ_cd:
148 email.setEmailType(CodedAttribute.Builder.create("WRK"));
149 email.setVersionNumber(new Long(1));
150 email.setEmailAddress(emailAddress);
151 email.setDefaultValue(true);
152 email.setEntityId(entity.getId());
153 List<EntityEmailBo> emailAddresses = new ArrayList<EntityEmailBo>(1);
154 emailAddresses.add(EntityEmailBo.from(email.build()));
155 entityType.setEmailAddresses(emailAddresses);
156 //email = (KimEntityEmailImpl)KRADServiceLocatorInternal.getBusinessObjectService().save(email);
157 }
158 List<EntityTypeContactInfoBo> entityTypes = new ArrayList<EntityTypeContactInfoBo>(1);
159 entityTypes.add(entityType);
160 entity.setEntityTypeContactInfos(entityTypes);
161
162 if (!StringUtils.isBlank(firstName) || !StringUtils.isBlank(lastName)) {
163 Long entityNameId = sas.getNextAvailableSequenceNumber(
164 "KRIM_ENTITY_NM_ID_S", EntityNameBo.class);
165 EntityNameBo name = new EntityNameBo();
166 name.setActive(true);
167 name.setId("" + entityNameId);
168 name.setEntityId(entity.getId());
169 // must be in krim_ent_nm_typ_t.ent_nm_typ_cd
170 name.setNameCode("PRFR");
171 name.setFirstName(firstName);
172 name.setMiddleName("");
173 name.setLastName(lastName);
174 name.setDefaultValue(true);
175
176 entity.setNames(Collections.singletonList(name));
177 }
178
179 entity = KRADServiceLocator.getBusinessObjectService().save(entity);
180
181 return entity;
182 }
183
184 protected PrincipalBo constructPrincipal(Element userElement, String entityId) {
185 String principalId = userElement.getChildTextTrim(WORKFLOW_ID_ELEMENT, NAMESPACE);
186 if (principalId == null) {
187 principalId = userElement.getChildTextTrim(PRINCIPAL_ID_ELEMENT, NAMESPACE);
188 }
189 String principalName = userElement.getChildTextTrim(AUTHENTICATION_ID_ELEMENT, NAMESPACE);
190 if (principalName == null) {
191 principalName = userElement.getChildTextTrim(PRINCIPAL_NAME_ELEMENT, NAMESPACE);
192 }
193
194 PrincipalBo principal = new PrincipalBo();
195 principal.setActive(true);
196 principal.setPrincipalId(principalId);
197 principal.setPrincipalName(principalName);
198 principal.setEntityId(entityId);
199 principal = (PrincipalBo) KRADServiceLocator.getBusinessObjectService().save(principal);
200
201 return principal;
202 }
203
204 }