View Javadoc

1   /*
2    * Copyright 2004-2005 The Apache Software Foundation or its licensors,
3    *                     as applicable.
4    *
5    * Licensed under the Apache License, Version 2.0 (the "License");
6    * you may not use this file except in compliance with the License.
7    * You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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          // Check if the class has  an inheritance discriminator field
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          // Add scope
65          if (((filter.getScope() != null) && (!filter.getScope().equals("")))) {
66              jcrExp += "/jcr:root" + filter.getScope() + "element(*, ";
67          }
68          else {
69              jcrExp += "//element(*, ";
70          }
71  
72          // Add node type
73          jcrExp += this.getNodeType(filter) + ") ";
74  
75          // Add filter criteria
76          String filterExp = ((FilterImpl) filter).getJcrExpression();
77  
78          // Build the jcr filter
79          if ((filterExp != null) && (!filterExp.equals(""))) {
80              jcrExp += "[" + filterExp + "]";
81          }
82  
83          // Add order by
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                 //Add subdescendant discriminator value
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 }