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
63
64
65 @Deprecated
66 public class JcrThumbnailItemIdProvider implements ThumbnailContainer.IdProvider {
67
68 protected static final String WHERE_TEMPLATE_FOR_PATH = " WHERE (%s) %s ";
69
70 private Logger log = LoggerFactory.getLogger(getClass());
71
72 private JcrContentConnectorDefinition definition;
73
74 public JcrThumbnailItemIdProvider(JcrContentConnectorDefinition definition) {
75 this.definition = definition;
76 }
77
78 @Override
79 public List<?> getItemIds() {
80 List<JcrItemId> uuids = new ArrayList<JcrItemId>();
81 String workspaceName = definition.getWorkspace();
82 final String query = constructQuery();
83 try {
84 QueryManager qm = MgnlContext.getJCRSession(workspaceName).getWorkspace().getQueryManager();
85 Query q = qm.createQuery(query, Query.JCR_SQL2);
86
87 log.debug("Executing query statement [{}] on workspace [{}]", query, workspaceName);
88 long start = System.currentTimeMillis();
89
90 QueryResult queryResult = q.execute();
91 NodeIterator iter = queryResult.getNodes();
92
93 while (iter.hasNext()) {
94 uuids.add(JcrItemUtil.getItemId(iter.nextNode()));
95 }
96
97 log.debug("Done collecting {} nodes in {}ms", uuids.size(), System.currentTimeMillis() - start);
98
99 } catch (RepositoryException e) {
100 throw new RuntimeRepositoryException(e);
101 }
102 return uuids;
103 }
104
105
106
107
108 protected String getMainNodeType() {
109 final List<NodeTypeDefinition> nodeTypes = definition.getNodeTypes();
110 return nodeTypes.isEmpty() ? AbstractJcrContainer.DEFAULT_NODE_TYPE : nodeTypes.get(0).getName();
111 }
112
113 protected String prepareSelectQueryStatement() {
114 return String.format("select * from [nt:base] as t ", getMainNodeType());
115 }
116
117 protected String prepareFilterQueryStatement() {
118 String nodeTypes = getQueryWhereClauseNodeTypes();
119 String path = definition.getRootPath();
120 boolean pathIsNotRoot = StringUtils.isNotBlank(path) && !"/".equals(path);
121 return String.format(WHERE_TEMPLATE_FOR_PATH, nodeTypes, pathIsNotRoot ? " AND ISDESCENDANTNODE('" + path + "')" : "");
122
123 }
124
125 protected String prepareOrderQueryStatement() {
126 return " order by name(t)";
127 }
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150 protected String getQueryWhereClauseNodeTypes() {
151 List<String> defs = new ArrayList<String>();
152 for (NodeTypeDefinition type : definition.getNodeTypes()) {
153 if (type.isHideInList() || NodeTypes.Folder.NAME.equals(type.getName())) {
154 log.debug("Skipping {} node type. Nodes of such type won't be searched for.", type.getName());
155 continue;
156 }
157 defs.add("[jcr:primaryType] = '" + type.getName() + "'");
158 }
159 return StringUtils.join(defs, " or ");
160 }
161
162 private String constructQuery() {
163 return prepareSelectQueryStatement() + prepareFilterQueryStatement() + prepareOrderQueryStatement();
164 }
165 }