1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.ui.workbench.thumbnail;
35
36 import info.magnolia.context.MgnlContext;
37 import info.magnolia.jcr.RuntimeRepositoryException;
38 import info.magnolia.jcr.util.NodeTypes;
39 import info.magnolia.ui.vaadin.integration.contentconnector.JcrContentConnectorDefinition;
40 import info.magnolia.ui.vaadin.integration.contentconnector.NodeTypeDefinition;
41 import info.magnolia.ui.vaadin.integration.jcr.JcrItemId;
42 import info.magnolia.ui.vaadin.integration.jcr.JcrItemUtil;
43 import info.magnolia.ui.workbench.container.AbstractJcrContainer;
44
45 import java.util.ArrayList;
46 import java.util.List;
47
48 import javax.jcr.NodeIterator;
49 import javax.jcr.RepositoryException;
50 import javax.jcr.query.Query;
51 import javax.jcr.query.QueryManager;
52 import javax.jcr.query.QueryResult;
53
54 import org.apache.commons.lang3.StringUtils;
55 import org.slf4j.Logger;
56 import org.slf4j.LoggerFactory;
57
58
59
60
61
62 public class JcrThumbnailItemIdProvider implements ThumbnailContainer.IdProvider {
63
64 protected static final String WHERE_TEMPLATE_FOR_PATH = " WHERE (%s) %s ";
65
66 private Logger log = LoggerFactory.getLogger(getClass());
67
68 private JcrContentConnectorDefinition definition;
69
70 public JcrThumbnailItemIdProvider(JcrContentConnectorDefinition definition) {
71 this.definition = definition;
72 }
73
74 @Override
75 public List<?> getItemIds() {
76 List<JcrItemId> uuids = new ArrayList<JcrItemId>();
77 String workspaceName = definition.getWorkspace();
78 final String query = constructQuery();
79 try {
80 QueryManager qm = MgnlContext.getJCRSession(workspaceName).getWorkspace().getQueryManager();
81 Query q = qm.createQuery(query, Query.JCR_SQL2);
82
83 log.debug("Executing query statement [{}] on workspace [{}]", query, workspaceName);
84 long start = System.currentTimeMillis();
85
86 QueryResult queryResult = q.execute();
87 NodeIterator iter = queryResult.getNodes();
88
89 while (iter.hasNext()) {
90 uuids.add(JcrItemUtil.getItemId(iter.nextNode()));
91 }
92
93 log.debug("Done collecting {} nodes in {}ms", uuids.size(), System.currentTimeMillis() - start);
94
95 } catch (RepositoryException e) {
96 throw new RuntimeRepositoryException(e);
97 }
98 return uuids;
99 }
100
101
102
103
104 protected String getMainNodeType() {
105 final List<NodeTypeDefinition> nodeTypes = definition.getNodeTypes();
106 return nodeTypes.isEmpty() ? AbstractJcrContainer.DEFAULT_NODE_TYPE : nodeTypes.get(0).getName();
107 }
108
109 protected String prepareSelectQueryStatement() {
110 return String.format("select * from [nt:base] as t ", getMainNodeType());
111 }
112
113 protected String prepareFilterQueryStatement() {
114 String nodeTypes = getQueryWhereClauseNodeTypes();
115 String path = definition.getRootPath();
116 boolean pathIsNotRoot = StringUtils.isNotBlank(path) && !"/".equals(path);
117 return String.format(WHERE_TEMPLATE_FOR_PATH, nodeTypes, pathIsNotRoot ? " AND ISDESCENDANTNODE('" + path + "')" : "");
118
119 }
120
121 protected String prepareOrderQueryStatement() {
122 return " order by name(t)";
123 }
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146 protected String getQueryWhereClauseNodeTypes() {
147 List<String> defs = new ArrayList<String>();
148 for (NodeTypeDefinition type : definition.getNodeTypes()) {
149 if (type.isHideInList() || NodeTypes.Folder.NAME.equals(type.getName())) {
150 log.debug("Skipping {} node type. Nodes of such type won't be searched for.", type.getName());
151 continue;
152 }
153 defs.add("[jcr:primaryType] = '" + type.getName() + "'");
154 }
155 return StringUtils.join(defs, " or ");
156 }
157
158 private String constructQuery() {
159 return prepareSelectQueryStatement() + prepareFilterQueryStatement() + prepareOrderQueryStatement();
160 }
161 }