View Javadoc

1   /**
2    * Copyright 2005-2013 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.kim.lookup;
17  
18  import org.apache.commons.lang.StringUtils;
19  import org.kuali.rice.kew.api.KewApiConstants;
20  import org.kuali.rice.kim.api.KimConstants;
21  import org.kuali.rice.kim.api.identity.Person;
22  import org.kuali.rice.kim.impl.KIMPropertyConstants;
23  import org.kuali.rice.kim.impl.identity.PersonImpl;
24  import org.kuali.rice.kim.util.KimCommonUtilsInternal;
25  import org.kuali.rice.kns.lookup.HtmlData;
26  import org.kuali.rice.kns.web.ui.Field;
27  import org.kuali.rice.kns.web.ui.Row;
28  import org.kuali.rice.krad.bo.BusinessObject;
29  import org.kuali.rice.krad.util.KRADConstants;
30  import org.kuali.rice.krad.util.UrlFactory;
31  
32  import java.util.ArrayList;
33  import java.util.Iterator;
34  import java.util.List;
35  import java.util.Map;
36  import java.util.Properties;
37  
38  /**
39   * This is a description of what this class does - shyu don't forget to fill this in. 
40   * 
41   * @author Kuali Rice Team (rice.collab@kuali.org)
42   *
43   */
44  public class PersonLookupableHelperServiceImpl  extends KimLookupableHelperServiceImpl {
45  	
46  	private static final long serialVersionUID = 1971744785776844579L;
47  	
48  	@Override
49  	public List<? extends BusinessObject> getSearchResults(
50  			Map<String, String> fieldValues) {
51  		if (fieldValues != null && StringUtils.isNotEmpty(fieldValues.get(KIMPropertyConstants.Person.PRINCIPAL_NAME))) {
52  			fieldValues.put(KIMPropertyConstants.Person.PRINCIPAL_NAME, fieldValues.get(KIMPropertyConstants.Person.PRINCIPAL_NAME).toLowerCase());
53  		}
54  
55  		return super.getSearchResults(fieldValues);
56  	}
57  
58  	@SuppressWarnings("unchecked")
59  	@Override
60  	public List<HtmlData> getCustomActionUrls(BusinessObject bo, List pkNames) {
61          List<HtmlData> anchorHtmlDataList = new ArrayList<HtmlData>();
62  		if(allowsNewOrCopyAction(KimConstants.KimUIConstants.KIM_PERSON_DOCUMENT_TYPE_NAME)){
63  			String href = "";
64  			Properties parameters = new Properties();
65  	        parameters.put(KRADConstants.DISPATCH_REQUEST_PARAMETER, KRADConstants.DOC_HANDLER_METHOD);
66  	        parameters.put(KRADConstants.PARAMETER_COMMAND, KewApiConstants.INITIATE_COMMAND);
67  	        parameters.put(KRADConstants.DOCUMENT_TYPE_NAME, KimConstants.KimUIConstants.KIM_PERSON_DOCUMENT_TYPE_NAME);
68  	        parameters.put(KimConstants.PrimaryKeyConstants.PRINCIPAL_ID, ((PersonImpl)bo).getPrincipalId());
69  	        if (StringUtils.isNotBlank(getReturnLocation())) {
70  	        	parameters.put(KRADConstants.RETURN_LOCATION_PARAMETER, getReturnLocation());
71  			}
72  	        href = UrlFactory.parameterizeUrl(KimCommonUtilsInternal.getKimBasePath()+KimConstants.KimUIConstants.KIM_PERSON_DOCUMENT_ACTION, parameters);
73  	
74  	        HtmlData.AnchorHtmlData anchorHtmlData = new HtmlData.AnchorHtmlData(href,
75  	        		KRADConstants.DOC_HANDLER_METHOD, KRADConstants.MAINTENANCE_EDIT_METHOD_TO_CALL);
76  	
77  	    	anchorHtmlDataList.add(anchorHtmlData);
78  		}
79      	return anchorHtmlDataList;
80  	}
81  
82  	@Override
83  	public HtmlData getInquiryUrl(BusinessObject bo, String propertyName) {
84  		HtmlData inqUrl = super.getInquiryUrl(bo, propertyName);
85  		Properties parameters = new Properties();
86          parameters.put(KewApiConstants.COMMAND_PARAMETER, KewApiConstants.INITIATE_COMMAND);
87          parameters.put(KRADConstants.DOCUMENT_TYPE_NAME, KimConstants.KimUIConstants.KIM_PERSON_DOCUMENT_TYPE_NAME);
88          parameters.put(KimConstants.PrimaryKeyConstants.PRINCIPAL_ID, ((Person)bo).getPrincipalId());
89          String href = UrlFactory.parameterizeUrl(KimCommonUtilsInternal.getKimBasePath()+ KimConstants.KimUIConstants.KIM_PERSON_INQUIRY_ACTION, parameters);
90  	    ((HtmlData.AnchorHtmlData)inqUrl).setHref(href);
91  	    return inqUrl;
92  	}
93  	
94  	/**
95  	 * Checks for the special role lookup parameters and removes/marks read-only the fields in the search criteria.
96  	 * If present, this method also has a side-effect of updating the title with the role name.
97  	 * 
98  	 * @see org.kuali.rice.krad.lookup.AbstractLookupableHelperServiceImpl#getRows()
99  	 */
100 	@Override
101 	public List<Row> getRows() {
102 		title.remove(); 
103 		List<Row> rows = super.getRows();
104 		Iterator<Row> i = rows.iterator();
105 		String roleName = null;
106 		String namespaceCode = null;
107 		while ( i.hasNext() ) {
108 			Row row = i.next();
109 			int numFieldsRemoved = 0;
110 			boolean rowIsBlank = true;
111 			// Since multi-column lookups can be specified on Rice lookups, all the fields in each row must be iterated over as well,
112 			// just in case the person lookup ever gets configured to have multiple columns per row.
113 			for (Iterator<Field> fieldIter = row.getFields().iterator(); fieldIter.hasNext();) {
114 			    Field field = fieldIter.next();
115 			    String propertyName = field.getPropertyName();
116 			    if ( propertyName.equals("lookupRoleName") ) {
117 				    Object val = getParameters().get( propertyName );
118 				    String propVal = null;
119 				    if ( val != null ) {
120 					    propVal = (val instanceof String)?(String)val:((String[])val)[0];
121 				    }
122 				    if ( StringUtils.isBlank( propVal ) ) {
123 					    fieldIter.remove();
124 					    numFieldsRemoved++;
125 				    } else {
126 					    field.setReadOnly(true);
127 					    field.setDefaultValue( propVal );
128 					    roleName = propVal;
129 					    rowIsBlank = false;
130 				    }
131 			    } else if ( propertyName.equals("lookupRoleNamespaceCode") ) {
132 				    Object val = getParameters().get( propertyName );
133 				    String propVal = null;
134 				    if ( val != null ) {
135 					    propVal = (val instanceof String)?(String)val:((String[])val)[0];
136 				    }
137 				    if ( StringUtils.isBlank( propVal ) ) {
138 					    fieldIter.remove();
139 					    numFieldsRemoved++;
140 				    } else {
141 					    field.setReadOnly(true);
142 					    field.setDefaultValue( propVal );
143 					    namespaceCode = propVal;
144 					    rowIsBlank = false;
145 				    }				
146 			    } else if (!Field.BLANK_SPACE.equals(field.getFieldType())) {
147 			    	rowIsBlank = false;
148 			    }
149 			}
150 			// Check if any fields were removed from the row.
151 			if (numFieldsRemoved > 0) {
152 				// If fields were removed, check whether or not the remainder of the row is empty or only has blank space fields.
153 				if (rowIsBlank) {
154 					// If so, then remove the row entirely.
155 					i.remove();
156 				} else {
157 					// Otherwise, add one blank space for each field that was removed, using a technique similar to FieldUtils.createBlankSpace.
158 					// It is safe to just add blank spaces as needed, since the two removable fields are the last of the visible ones in the list.
159 					while (numFieldsRemoved > 0) {
160 						Field blankSpace = new Field();
161 						blankSpace.setFieldType(Field.BLANK_SPACE);
162 						blankSpace.setPropertyName(Field.BLANK_SPACE);
163 						row.getFields().add(blankSpace);
164 						numFieldsRemoved--;
165 					}
166 				}
167 			}
168 		}
169 		if ( roleName != null && namespaceCode != null ) {
170 			title.set( namespaceCode + " " + roleName + " Lookup" );
171 		}
172 		return rows;
173 	}
174 	
175 	private ThreadLocal<String> title = new ThreadLocal<String>();
176 	public String getTitle() {
177 		if ( title.get() == null ) {
178 			return super.getTitle();
179 		}
180 		return title.get();
181 	}
182 }