001    /**
002     * Copyright 2005-2014 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    }