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.impl.service;
017
018 import org.joda.time.DateTime;
019 import org.kuali.rice.core.api.criteria.Predicate;
020 import org.kuali.rice.core.api.criteria.PredicateUtils;
021 import org.kuali.rice.core.api.criteria.QueryByCriteria;
022 import org.kuali.rice.kew.api.KewApiServiceLocator;
023 import org.kuali.rice.kew.api.doctype.DocumentTypeService;
024 import org.kuali.rice.kew.api.document.Document;
025 import org.kuali.rice.kew.api.document.DocumentStatus;
026 import org.kuali.rice.kew.docsearch.DocumentSearchCriteriaEbo;
027 import org.kuali.rice.kew.doctype.bo.DocumentType;
028 import org.kuali.rice.kew.doctype.bo.DocumentTypeEBO;
029 import org.kuali.rice.kim.api.group.Group;
030 import org.kuali.rice.kim.api.group.GroupContract;
031 import org.kuali.rice.kim.api.identity.Person;
032 import org.kuali.rice.kim.api.role.Role;
033 import org.kuali.rice.kim.api.role.RoleContract;
034 import org.kuali.rice.kim.framework.group.GroupEbo;
035 import org.kuali.rice.kim.framework.role.RoleEbo;
036 import org.kuali.rice.krad.bo.ExternalizableBusinessObject;
037 import org.kuali.rice.krad.service.impl.RemoteModuleServiceBase;
038
039 import java.util.ArrayList;
040 import java.util.Collections;
041 import java.util.List;
042 import java.util.Map;
043
044 public class KewRemoteModuleService extends RemoteModuleServiceBase {
045
046 protected DocumentTypeService docTypeService = null;
047
048 /**
049 * This overridden method calls the DocumentTypeService instead of the underlying
050 * KNS service. Allows you to search on name and docTypeId
051 *
052 * @see org.kuali.rice.krad.service.impl.ModuleServiceBase#getExternalizableBusinessObject(java.lang.Class, java.util.Map)
053 */
054 @Override
055 public <T extends ExternalizableBusinessObject> T getExternalizableBusinessObject(
056 Class<T> businessObjectClass, Map<String, Object> fieldValues) {
057 if(DocumentTypeEBO.class.isAssignableFrom(businessObjectClass)){
058 if ( fieldValues.containsKey( "name" ) ) {
059 return (T) DocumentType.from(getDocumentTypeService().getDocumentTypeByName((String) fieldValues.get(
060 "name")));
061 } else if( fieldValues.containsKey( "documentTypeId" ) ){
062 return (T) DocumentType.from(getDocumentTypeService().getDocumentTypeById(fieldValues.get("documentTypeId").toString()));
063 } else if (fieldValues.containsKey( "id" ) ) {
064 // assume it's a string and convert it to a long.
065 return (T) DocumentType.from(getDocumentTypeService().getDocumentTypeById(fieldValues.get("id").toString()));
066 }
067
068 } else if(DocumentSearchCriteriaEbo.class.isAssignableFrom( businessObjectClass )) {
069 if ( fieldValues.containsKey( "documentId" ) ) {
070 return (T)createDocumentSearchEbo(KewApiServiceLocator.getWorkflowDocumentService().getDocument(
071 fieldValues.get("documentId").toString()));
072 }
073
074 }
075
076 return null;
077 }
078
079 private DocumentSearchCriteriaEbo createDocumentSearchEbo(final Document doc){
080 return new DocumentSearchCriteriaEbo(){
081
082 @Override
083 public String getApplicationDocumentId() {
084 return doc.getApplicationDocumentId();
085 }
086
087 @Override
088 public DocumentStatus getStatus() {
089 return doc.getStatus();
090 }
091
092 @Override
093 public String getApplicationDocumentStatus() {
094 return doc.getApplicationDocumentStatus();
095 }
096
097 @Override
098 public String getTitle() {
099 return doc.getTitle();
100 }
101
102 @Override
103 public String getDocumentTypeName() {
104 return doc.getDocumentTypeName();
105 }
106
107 @Override
108 public String getInitiatorPrincipalId() {
109 return doc.getInitiatorPrincipalId();
110 }
111
112 @Override
113 public String getDocumentId() {
114 return doc.getDocumentId();
115 }
116
117 @Override
118 public DateTime getDateCreated() {
119 return doc.getDateCreated();
120 }
121
122 @Override
123 public void refresh() {
124 // do nothing
125 }
126
127 };
128 }
129
130 @Override
131 public <T extends ExternalizableBusinessObject> List<T> getExternalizableBusinessObjectsList(
132 Class<T> businessObjectClass, Map<String, Object> fieldValues) {
133 if (!fieldValues.isEmpty()) {
134 throw new IllegalStateException("fieldValues must be empty");
135 }
136 List<T> ebos = new ArrayList<T>();
137 if(DocumentTypeEBO.class.isAssignableFrom(businessObjectClass)){
138 List<org.kuali.rice.kew.api.doctype.DocumentType> docTypes = getDocumentTypeService().findAllDocumentTypes();
139
140 for (org.kuali.rice.kew.api.doctype.DocumentType docType : docTypes) {
141 ebos.add((T)DocumentType.from(docType));
142 }
143 return ebos;
144 }
145 return Collections.emptyList();
146 }
147
148 @Override
149 public boolean isExternalizableBusinessObjectLookupable(Class boClass) {
150 return isExternalizable(boClass);
151 }
152
153 @Override
154 public boolean isExternalizableBusinessObjectInquirable(Class boClass) {
155 return isExternalizable(boClass);
156 }
157
158 @Override
159 public boolean isExternalizable(Class boClazz) {
160 if (boClazz == null) {
161 return false;
162 }
163 if(DocumentTypeEBO.class.isAssignableFrom(boClazz)) {
164 return true;
165 } else if(DocumentSearchCriteriaEbo.class.isAssignableFrom(boClazz)) {
166 return true;
167 }
168 return ExternalizableBusinessObject.class.isAssignableFrom(boClazz);
169 }
170
171 @Override
172 public List<String> listPrimaryKeyFieldNames(Class boClass) {
173 if ( DocumentTypeEBO.class.isAssignableFrom( boClass ) ) {
174 List<String> pkFields = new ArrayList<String>( 1 );
175 pkFields.add( "documentTypeId" );
176 return pkFields;
177 }else if(DocumentSearchCriteriaEbo.class.isAssignableFrom( boClass )){
178 List<String> pkFields = new ArrayList<String>( 1 );
179 pkFields.add( "documentId" );
180 return pkFields;
181 }
182 return Collections.emptyList();
183 }
184
185 /**
186 * We want to be able to use name as an alternate key
187 *
188 * @see org.kuali.rice.krad.service.ModuleService#listAlternatePrimaryKeyFieldNames(java.lang.Class)
189 */
190 public List<List<String>> listAlternatePrimaryKeyFieldNames(
191 Class businessObjectInterfaceClass) {
192 if ( DocumentTypeEBO.class.isAssignableFrom( businessObjectInterfaceClass ) ) {
193 ArrayList<List<String>> retList = new ArrayList<List<String>>();
194 ArrayList<String> keyList = new ArrayList<String>();
195
196 keyList.add("name");
197 retList.add(keyList);
198 return retList;
199 }else{
200 return null;
201 }
202
203 }
204
205 /**
206 * @return the docTypeService
207 */
208 protected synchronized DocumentTypeService getDocumentTypeService() {
209 if(this.docTypeService == null){
210 // the default
211 this.docTypeService = KewApiServiceLocator.getDocumentTypeService();
212 }
213 return this.docTypeService;
214 }
215 }