1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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 }