1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.kew.impl.document.attribute;
17
18 import org.apache.commons.lang.StringUtils;
19 import org.apache.log4j.Logger;
20 import org.apache.log4j.MDC;
21 import org.joda.time.DateTime;
22 import org.kuali.rice.core.api.exception.RiceIllegalArgumentException;
23 import org.kuali.rice.kew.api.KewApiServiceLocator;
24 import org.kuali.rice.kew.api.WorkflowRuntimeException;
25 import org.kuali.rice.kew.api.document.Document;
26 import org.kuali.rice.kew.api.document.DocumentContent;
27 import org.kuali.rice.kew.api.document.DocumentWithContent;
28 import org.kuali.rice.kew.api.document.WorkflowDocumentService;
29 import org.kuali.rice.kew.api.document.attribute.DocumentAttribute;
30 import org.kuali.rice.kew.api.document.attribute.DocumentAttributeDateTime;
31 import org.kuali.rice.kew.api.document.attribute.DocumentAttributeDecimal;
32 import org.kuali.rice.kew.api.document.attribute.DocumentAttributeIndexingQueue;
33 import org.kuali.rice.kew.api.document.attribute.DocumentAttributeInteger;
34 import org.kuali.rice.kew.api.document.attribute.DocumentAttributeString;
35 import org.kuali.rice.kew.docsearch.SearchableAttributeDateTimeValue;
36 import org.kuali.rice.kew.docsearch.SearchableAttributeFloatValue;
37 import org.kuali.rice.kew.docsearch.SearchableAttributeLongValue;
38 import org.kuali.rice.kew.docsearch.SearchableAttributeStringValue;
39 import org.kuali.rice.kew.docsearch.SearchableAttributeValue;
40 import org.kuali.rice.kew.doctype.bo.DocumentType;
41 import org.kuali.rice.kew.framework.document.attribute.SearchableAttribute;
42 import org.kuali.rice.kew.service.KEWServiceLocator;
43
44 import java.math.BigInteger;
45 import java.sql.Timestamp;
46 import java.util.ArrayList;
47 import java.util.List;
48
49
50
51
52
53
54 public class DocumentAttributeIndexingQueueImpl implements DocumentAttributeIndexingQueue {
55
56 private static Logger LOG = Logger.getLogger(DocumentAttributeIndexingQueueImpl.class);
57
58 @Override
59 public void indexDocument(String documentId) {
60 if (StringUtils.isBlank(documentId)) {
61 throw new RiceIllegalArgumentException("documentId was null or blank");
62 }
63 MDC.put("docId", documentId);
64 try {
65 long t1 = System.currentTimeMillis();
66 LOG.info("Indexing document attributes for document " + documentId);
67 Document document = getWorkflowDocumentService().getDocument(documentId);
68 if (document == null) {
69 throw new RiceIllegalArgumentException("Failed to locate document with the given id: " + documentId);
70 }
71 DocumentContent documentContent =
72 KewApiServiceLocator.getWorkflowDocumentService().getDocumentContent(documentId);
73 List<SearchableAttributeValue> attributes = buildSearchableAttributeValues(document, documentContent);
74 KEWServiceLocator.getRouteHeaderService().updateRouteHeaderSearchValues(documentId, attributes);
75 long t2 = System.currentTimeMillis();
76 LOG.info("...finished indexing document " + documentId + " for document search, total time = " + (t2 - t1) +
77 " ms.");
78 } finally {
79 MDC.remove("docId");
80 }
81 }
82
83
84
85
86
87 private List<SearchableAttributeValue> buildSearchableAttributeValues(Document document, DocumentContent documentContent) {
88 List<SearchableAttributeValue> searchableAttributeValues = new ArrayList<SearchableAttributeValue>();
89 DocumentType documentTypeBo = KEWServiceLocator.getDocumentTypeService().findByName(document.getDocumentTypeName());
90 for (DocumentType.ExtensionHolder<SearchableAttribute> searchableAttributeHolder : documentTypeBo.loadSearchableAttributes()) {
91 DocumentWithContent documentWithContent = DocumentWithContent.create(document, documentContent);
92 SearchableAttribute searchableAttribute = searchableAttributeHolder.getExtension();
93 if ( searchableAttribute == null ) {
94 LOG.warn( "Encountered a 'null' SearchableAttribute on " + document.getDocumentTypeName() + " : " + searchableAttributeHolder.getExtensionDefinition().getName() );
95 continue;
96 }
97 List<DocumentAttribute> documentAttributes = searchableAttribute.extractDocumentAttributes(
98 searchableAttributeHolder.getExtensionDefinition(), documentWithContent);
99 if (documentAttributes != null) {
100 for (DocumentAttribute documentAttribute : documentAttributes) {
101 if (documentAttribute == null) {
102 LOG.warn("Encountered a 'null' DocumentAttribute on " + document.getDocumentTypeName() + " from searchable attribute: " + searchableAttribute);
103 continue;
104 }
105 SearchableAttributeValue searchableAttributeValue = null;
106 if (documentAttribute instanceof DocumentAttributeString) {
107 searchableAttributeValue = new SearchableAttributeStringValue();
108 ((SearchableAttributeStringValue)searchableAttributeValue).setSearchableAttributeValue(((DocumentAttributeString)documentAttribute).getValue());
109 } else if (documentAttribute instanceof DocumentAttributeDateTime) {
110 searchableAttributeValue = new SearchableAttributeDateTimeValue();
111 DateTime dateTimeValue = ((DocumentAttributeDateTime)documentAttribute).getValue();
112 Timestamp timestamp = (dateTimeValue == null ? null : new Timestamp(dateTimeValue.getMillis()));
113 ((SearchableAttributeDateTimeValue)searchableAttributeValue).setSearchableAttributeValue(timestamp);
114 } else if (documentAttribute instanceof DocumentAttributeInteger) {
115 searchableAttributeValue = new SearchableAttributeLongValue();
116 BigInteger bigIntegerValue = ((DocumentAttributeInteger)documentAttribute).getValue();
117 Long longValue = (bigIntegerValue == null ? null : bigIntegerValue.longValue());
118 ((SearchableAttributeLongValue)searchableAttributeValue).setSearchableAttributeValue(longValue);
119 } else if (documentAttribute instanceof DocumentAttributeDecimal) {
120 searchableAttributeValue = new SearchableAttributeFloatValue();
121 ((SearchableAttributeFloatValue)searchableAttributeValue).setSearchableAttributeValue(((DocumentAttributeDecimal)documentAttribute).getValue());
122 } else {
123 throw new WorkflowRuntimeException("Encountered an invalid instance of DocumentAttribute, was: " + documentAttribute.getClass());
124 }
125 searchableAttributeValue.setSearchableAttributeKey(documentAttribute.getName());
126 searchableAttributeValue.setDocumentId(document.getDocumentId());
127 searchableAttributeValue.setRouteHeader(null);
128 searchableAttributeValues.add(searchableAttributeValue);
129 }
130 }
131 }
132 return searchableAttributeValues;
133 }
134
135 protected WorkflowDocumentService getWorkflowDocumentService() {
136 return KewApiServiceLocator.getWorkflowDocumentService();
137 }
138 }