summaryrefslogtreecommitdiffstats
path: root/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/DocumentProcessorsMap.java
diff options
context:
space:
mode:
Diffstat (limited to 'branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/DocumentProcessorsMap.java')
-rw-r--r--branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/DocumentProcessorsMap.java125
1 files changed, 125 insertions, 0 deletions
diff --git a/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/DocumentProcessorsMap.java b/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/DocumentProcessorsMap.java
new file mode 100644
index 0000000000..19c9e51d8d
--- /dev/null
+++ b/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/DocumentProcessorsMap.java
@@ -0,0 +1,125 @@
+package org.apache.tuscany.sca.domain.search;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.tuscany.sca.domain.search.impl.Document;
+
+public class DocumentProcessorsMap extends
+ HashMap<Class<?>, List<DocumentProcessor>> implements DocumentProcessor {
+
+ private static final long serialVersionUID = 3967390896890947159L;
+
+ private Object documentKey;
+
+ public void addDocumentProcessor(Class<?> clazz, DocumentProcessor processor) {
+ List<DocumentProcessor> processors = get(clazz);
+
+ if (processors == null) {
+ processors = new LinkedList<DocumentProcessor>();
+ put(clazz, processors);
+
+ }
+
+ processors.add(processor);
+
+ }
+
+ private void appendProcessors(LinkedList<DocumentProcessor> processorsList,
+ List<DocumentProcessor> processors, Object object) {
+
+ if (processors != null) {
+
+ for (DocumentProcessor processor : processors) {
+
+ if (this.documentKey == null) {
+ this.documentKey = processor.getDocumentKey(object);
+
+ if (processorsList == null) {
+ return;
+ }
+
+ }
+
+ if (processorsList != null) {
+ processorsList.add(processor);
+ }
+
+ }
+
+ }
+
+ }
+
+ private void findAllDocumentProcessors(
+ LinkedList<DocumentProcessor> processorsList, Object object) {
+ Class<?> clazz = object.getClass();
+ appendProcessors(processorsList, get(clazz), object);
+
+ while (clazz != null) {
+ Class<?>[] interfaces = clazz.getInterfaces();
+
+ for (Class<?> interfac : interfaces) {
+ Class<?>[] interfaces2 = interfac.getInterfaces();
+ appendProcessors(processorsList, get(interfac), object);
+
+ for (Class<?> interface2 : interfaces2) {
+ appendProcessors(processorsList, get(interface2), object);
+ }
+
+ }
+
+ clazz = clazz.getSuperclass();
+ appendProcessors(processorsList, get(clazz), object);
+
+ }
+
+ }
+
+ public Document process(DocumentProcessorsMap processors,
+ DocumentMap documents, Object object, Document document, String parent) {
+
+ LinkedList<DocumentProcessor> processorsList;
+
+ try {
+
+ this.documentKey = document;
+ processorsList = new LinkedList<DocumentProcessor>();
+ findAllDocumentProcessors(processorsList, object);
+
+ if (document == null && this.documentKey != null) {
+ document = documents.get(this.documentKey);
+
+ if (document == null) {
+ document = FAKE_DOCUMENT;
+ }
+
+ }
+
+ } finally {
+ this.documentKey = null;
+ }
+
+ for (DocumentProcessor processor : processorsList) {
+ processor.process(processors, documents, object, document, parent);
+ }
+
+ return document;
+
+ }
+
+ public Object getDocumentKey(Object object) {
+
+ try {
+ findAllDocumentProcessors(null, object);
+
+ return this.documentKey;
+
+ } finally {
+ this.documentKey = null;
+ }
+
+ }
+
+}