View Javadoc

1   /*
2    * Copyright 2007-2008 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 java.util.ArrayList;
19  import java.util.Iterator;
20  import java.util.List;
21  import java.util.Map;
22  import java.util.Properties;
23  
24  import org.apache.commons.lang.StringUtils;
25  import org.kuali.rice.kew.util.KEWConstants;
26  import org.kuali.rice.kim.bo.Person;
27  import org.kuali.rice.kim.bo.impl.PersonImpl;
28  import org.kuali.rice.kim.util.KIMPropertyConstants;
29  import org.kuali.rice.kim.util.KimCommonUtilsInternal;
30  import org.kuali.rice.kim.util.KimConstants;
31  import org.kuali.rice.kns.bo.BusinessObject;
32  import org.kuali.rice.kns.lookup.HtmlData;
33  import org.kuali.rice.kns.lookup.HtmlData.AnchorHtmlData;
34  import org.kuali.rice.kns.util.KNSConstants;
35  import org.kuali.rice.kns.util.UrlFactory;
36  import org.kuali.rice.kns.web.ui.Field;
37  import org.kuali.rice.kns.web.ui.Row;
38  
39  /**
40   * This is a description of what this class does - shyu don't forget to fill this in. 
41   * 
42   * @author Kuali Rice Team (rice.collab@kuali.org)
43   *
44   */
45  public class PersonLookupableHelperServiceImpl  extends KimLookupableHelperServiceImpl {
46  	
47  	private static final long serialVersionUID = 1971744785776844579L;
48  	
49  	@Override
50  	public List<? extends BusinessObject> getSearchResults(
51  			Map<String, String> fieldValues) {
52  		if (fieldValues != null && StringUtils.isNotEmpty(fieldValues.get(KIMPropertyConstants.Person.PRINCIPAL_NAME))) {
53  			fieldValues.put(KIMPropertyConstants.Person.PRINCIPAL_NAME, fieldValues.get(KIMPropertyConstants.Person.PRINCIPAL_NAME).toLowerCase());
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(KNSConstants.DISPATCH_REQUEST_PARAMETER, KNSConstants.DOC_HANDLER_METHOD);
66  	        parameters.put(KNSConstants.PARAMETER_COMMAND, KEWConstants.INITIATE_COMMAND);
67  	        parameters.put(KNSConstants.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(KNSConstants.RETURN_LOCATION_PARAMETER, getReturnLocation());	 
71  			}
72  	        href = UrlFactory.parameterizeUrl(KimCommonUtilsInternal.getKimBasePath()+KimConstants.KimUIConstants.KIM_PERSON_DOCUMENT_ACTION, parameters);
73  	
74  	        AnchorHtmlData anchorHtmlData = new AnchorHtmlData(href, 
75  	        		KNSConstants.DOC_HANDLER_METHOD, KNSConstants.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(KEWConstants.COMMAND_PARAMETER, KEWConstants.INITIATE_COMMAND);
87          parameters.put(KNSConstants.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  	    ((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.kns.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 }