1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.portals.graffito.jcr.query.impl;
18
19
20 import java.util.Iterator;
21 import java.util.Map;
22
23 import org.apache.portals.graffito.jcr.mapper.Mapper;
24 import org.apache.portals.graffito.jcr.mapper.model.ClassDescriptor;
25 import org.apache.portals.graffito.jcr.mapper.model.FieldDescriptor;
26 import org.apache.portals.graffito.jcr.persistence.PersistenceConstant;
27 import org.apache.portals.graffito.jcr.query.Filter;
28 import org.apache.portals.graffito.jcr.query.Query;
29 import org.apache.portals.graffito.jcr.query.QueryManager;
30
31 public class QueryManagerImpl implements QueryManager {
32
33 private Mapper mapper;
34 private Map atomicTypeConverters;
35
36 public QueryManagerImpl(Mapper mapper, Map atomicTypeConverters) {
37 this.mapper = mapper;
38 this.atomicTypeConverters = atomicTypeConverters;
39 }
40
41 public Filter createFilter(Class classQuery) {
42 return new FilterImpl(mapper.getClassDescriptorByClass(classQuery),
43 atomicTypeConverters,
44 classQuery);
45 }
46
47 public Query createQuery(Filter filter) {
48 return new QueryImpl(filter, mapper);
49 }
50
51 public String buildJCRExpression(Query query) {
52
53 Filter filter = query.getFilter();
54
55
56 ClassDescriptor classDescriptor = mapper.getClassDescriptorByClass(filter.getFilterClass());
57 if (classDescriptor.hasDiscriminator()) {
58 Filter discrininatorFilter = buildDiscriminatorFilter(query, classDescriptor);
59 filter = filter.addAndFilter(discrininatorFilter);
60 }
61
62 String jcrExp = "";
63
64
65 if (((filter.getScope() != null) && (!filter.getScope().equals("")))) {
66 jcrExp += "/jcr:root" + filter.getScope() + "element(*, ";
67 }
68 else {
69 jcrExp += "//element(*, ";
70 }
71
72
73 jcrExp += this.getNodeType(filter) + ") ";
74
75
76 String filterExp = ((FilterImpl) filter).getJcrExpression();
77
78
79 if ((filterExp != null) && (!filterExp.equals(""))) {
80 jcrExp += "[" + filterExp + "]";
81 }
82
83
84 jcrExp += ((QueryImpl) query).getOrderByExpression();
85
86 return jcrExp;
87
88 }
89
90 private Filter buildDiscriminatorFilter(Query query, ClassDescriptor classDescriptor) {
91 Filter discriminatorFilter = this.createFilter(query.getFilter().getFilterClass());
92 if (!classDescriptor.isAbstract() && (! classDescriptor.isInterface()) ) {
93 discriminatorFilter.addJCRExpression("@" + PersistenceConstant.DISCRIMINATOR_PROPERTY_NAME + "='" + classDescriptor.getClassName() + "'");
94 }
95
96 if (classDescriptor.hasDescendants()) {
97 Iterator descendantDescriptorIterator = classDescriptor.getDescendantClassDescriptors().iterator();
98
99 while (descendantDescriptorIterator.hasNext()) {
100 ClassDescriptor descendantClassDescriptor = (ClassDescriptor) descendantDescriptorIterator.next();
101
102
103 discriminatorFilter = discriminatorFilter.addOrFilter(
104 this.buildDiscriminatorFilter(query, descendantClassDescriptor));
105 }
106
107 }
108
109 return discriminatorFilter;
110 }
111
112 private String getNodeType(Filter filter) {
113 ClassDescriptor classDescriptor = mapper.getClassDescriptorByClass(filter.getFilterClass());
114
115 String jcrNodeType = classDescriptor.getJcrNodeType();
116 if (jcrNodeType == null || jcrNodeType.equals(""))
117 {
118 return PersistenceConstant.NT_UNSTRUCTURED;
119 }
120 else
121 {
122 return jcrNodeType;
123 }
124 }
125
126 }