View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   * http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.chemistry.opencmis.tck.tests.query;
20  
21  import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.FAILURE;
22  import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.SKIPPED;
23  
24  import java.util.GregorianCalendar;
25  import java.util.Map;
26  
27  import org.apache.chemistry.opencmis.client.api.Folder;
28  import org.apache.chemistry.opencmis.client.api.ItemIterable;
29  import org.apache.chemistry.opencmis.client.api.QueryResult;
30  import org.apache.chemistry.opencmis.client.api.QueryStatement;
31  import org.apache.chemistry.opencmis.client.api.Session;
32  import org.apache.chemistry.opencmis.commons.PropertyIds;
33  import org.apache.chemistry.opencmis.tck.CmisTestResult;
34  
35  /**
36   * Root folder query test.
37   */
38  public class QueryRootFolderTest extends AbstractQueryTest {
39  
40      @Override
41      public void init(Map<String, String> parameters) {
42          super.init(parameters);
43          setName("Query Root Folder Test");
44          setDescription("Performs a query that should return the root folder name and id.");
45      }
46  
47      @Override
48      public void run(Session session) {
49          if (supportsQuery(session) && !isFulltextOnly(session)) {
50              if (Boolean.TRUE.equals(session.getRootFolder().getType().isQueryable())) {
51                  queryById(session);
52                  queryByDate(session);
53              } else {
54                  addResult(createResult(SKIPPED, "Root folder type (" + session.getRootFolder().getType().getId()
55                          + ") is not queryable. Test Skipped!"));
56              }
57          } else {
58              addResult(createResult(SKIPPED, "Metadata query not supported. Test Skipped!"));
59          }
60      }
61  
62      protected void queryById(Session session) {
63          CmisTestResult f;
64  
65          String testType = "cmis:folder";
66  
67          Folder rootFolder = session.getRootFolder();
68  
69          QueryStatement statement = session
70                  .createQueryStatement("SELECT ? AS folderName, ? AS folderId FROM ? WHERE ? = ?");
71  
72          statement.setProperty(1, testType, PropertyIds.NAME);
73          statement.setProperty(2, testType, PropertyIds.OBJECT_ID);
74          statement.setType(3, testType);
75          statement.setProperty(4, testType, PropertyIds.OBJECT_ID);
76          statement.setString(5, rootFolder.getId());
77  
78          addResult(createInfoResult("Query: " + statement.toQueryString()));
79  
80          int count = 0;
81          ItemIterable<QueryResult> results = statement.query(false);
82          for (QueryResult qr : results) {
83              count++;
84  
85              String folderName = qr.getPropertyValueByQueryName("folderName");
86              String folderId = qr.getPropertyValueByQueryName("folderId");
87  
88              f = createResult(FAILURE, "Query result does not match root folder name!");
89              addResult(assertEquals(rootFolder.getName(), folderName, null, f));
90  
91              f = createResult(FAILURE, "Query result does not match root folder id!");
92              addResult(assertEquals(rootFolder.getId(), folderId, null, f));
93          }
94  
95          f = createResult(FAILURE, "The query should return exactly one result but returned " + count + "!");
96          addResult(assertEquals(1, count, null, f));
97  
98          if (results.getTotalNumItems() >= 0) {
99              f = createResult(FAILURE,
100                     "The query returned a total number of items != 1, but there can be only exactly one hit!");
101             addResult(assertEquals(1L, results.getTotalNumItems(), null, f));
102         }
103     }
104 
105     protected void queryByDate(Session session) {
106         CmisTestResult f;
107 
108         String testType = "cmis:folder";
109 
110         Folder rootFolder = session.getRootFolder();
111 
112         GregorianCalendar before = new GregorianCalendar();
113         before.setTimeInMillis(rootFolder.getCreationDate().getTimeInMillis() - (60 * 60 * 1000));
114 
115         GregorianCalendar after = new GregorianCalendar();
116         after.setTimeInMillis(rootFolder.getCreationDate().getTimeInMillis() + (60 * 60 * 1000));
117 
118         QueryStatement statement = session
119                 .createQueryStatement("SELECT ? AS folderName, ? AS folderId FROM ? WHERE ? > TIMESTAMP ? AND ? < TIMESTAMP ?");
120 
121         statement.setProperty(1, testType, PropertyIds.NAME);
122         statement.setProperty(2, testType, PropertyIds.OBJECT_ID);
123         statement.setType(3, testType);
124         statement.setProperty(4, testType, PropertyIds.CREATION_DATE);
125         statement.setDateTime(5, before);
126         statement.setProperty(6, testType, PropertyIds.CREATION_DATE);
127         statement.setDateTime(7, after);
128 
129         addResult(createInfoResult("Query: " + statement.toQueryString()));
130 
131         boolean found = false;
132         ItemIterable<QueryResult> results = statement.query(false);
133         for (QueryResult qr : results) {
134             String folderId = qr.getPropertyValueByQueryName("folderId");
135 
136             if (rootFolder.getId().equals(folderId)) {
137                 found = true;
138 
139                 String folderName = qr.getPropertyValueByQueryName("folderName");
140 
141                 f = createResult(FAILURE, "Query result does not match root folder name!");
142                 addResult(assertEquals(rootFolder.getName(), folderName, null, f));
143                 break;
144             }
145         }
146 
147         f = createResult(FAILURE, "The query should return the root folder but does not!");
148         addResult(assertIsTrue(found, null, f));
149 
150         if (results.getTotalNumItems() >= 0) {
151             f = createResult(FAILURE,
152                     "The query returned a total number of items < 1, but there must be at least one hit!");
153             addResult(assertIsTrue(results.getTotalNumItems() >= 1L, null, f));
154         }
155     }
156 }