Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
package com.dievision.sinicum.server.jcr;

import java.util.ArrayList;
import java.util.List;
import com.dievision.sinicum.server.mgnlAdapters.MgnlContextAdapter;
import org.apache.jackrabbit.util.ISO9075;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.dievision.sinicum.server.mgnlAdapters.MgnlContextAdapter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NodeQueryManager {
private final String workspace;
Expand All @@ -34,7 +35,7 @@ public NodeQueryManager(String workspace, String query, String language, long li
public NodeQueryManager(String workspace, String query, String language,
long limit, long offset) {
this.workspace = workspace;
this.query = query;
this.query = encodeQuery(query, language);
this.language = convertQueryLanguage(language);
this.limit = limit;
this.offset = offset;
Expand All @@ -44,7 +45,6 @@ public List<NodeApiWrapper> executeQuery() throws RepositoryException {
Session session = MgnlContextAdapter.getJcrSession(workspace);
QueryManager queryManager = session.getWorkspace().getQueryManager();
Query qry = queryManager.createQuery(query, language);

if (limit > 0) {
qry.setLimit(limit);
}
Expand All @@ -65,6 +65,13 @@ protected String getLanguage() {
return language;
}

private String encodeQuery(String query, String queryLanguage) {
if (Query.XPATH.equalsIgnoreCase(queryLanguage)) {
query = encodeXPathQuery(query);
}
return query;
}

private String convertQueryLanguage(String queryLanguage) {
if (Query.XPATH.equalsIgnoreCase(queryLanguage)) {
return Query.XPATH;
Expand All @@ -78,4 +85,32 @@ private String convertQueryLanguage(String queryLanguage) {
return queryLanguage;
}
}

private String encodeXPathQuery(String query) {
String [] queryPartToEncode = query.split("\\[(.?)\\]|\\[(.*)\\]");
String [] encodedNodes = new String[queryPartToEncode.length];
String replaceNode = null;
Matcher matchNode = null;
for (int i = 0; i < queryPartToEncode.length; i++) {
replaceNode = queryPartToEncode[i];
matchNode = Pattern.compile("[0-9]+").matcher(queryPartToEncode[i]);
while (matchNode.find()) {
replaceNode =
replaceNode.replace(matchNode.group(0), ISO9075.encode(matchNode.group(0)));
encodedNodes[i] = replaceNode;
}
}
if (encodedNodes[0] != null) {
String toEncodeNode, encodedNode = null;
for (int i = 0; i < queryPartToEncode.length; i++) {
toEncodeNode = queryPartToEncode[i];
encodedNode = encodedNodes[i];
int startIndex, endIndex = 0;
startIndex = query.indexOf(toEncodeNode);
endIndex = startIndex + toEncodeNode.length();
query = query.substring(0, startIndex) + encodedNode + query.substring(endIndex);
}
}
return query;
}
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
package com.dievision.sinicum.server.jcr;

import java.util.List;

import javax.jcr.RepositoryException;
import javax.jcr.query.Query;

import com.dievision.sinicum.server.JackrabbitTest45;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.dievision.sinicum.server.JackrabbitTest45;
import javax.jcr.RepositoryException;
import javax.jcr.query.Query;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

public class NodeQueryManagerTest extends JackrabbitTest45 {
private static final String QUERY = "/jcr:root//*[@jcr:primaryType = 'mgnl:contentNode'] "
+ "order by @jcr:path";

private static final Logger logger = LoggerFactory.getLogger(NodeQueryManagerTest.class);

@Before
Expand All @@ -32,6 +32,44 @@ public void testExecuteQuery() throws RepositoryException {
}
*/

@Test
public void testNodeAsANumberXpath() throws RepositoryException {
String [] queries = {
"/jcr:root/333[1]/1111[1]/11111//element(123,mix:title)"
+ "[jcr:contains(.,'123,132:break')]",
"//element(*, mgnl:user)[@email = 'eric@example.com']",
"//*[@mgnl:template = 'stkTeaser']",
"/jcr:root/demo-project//element(*, mgnl:metaData)"
+ "[@mgnl:template = 'standard-templating-kit:pages/stkArticle']/.."
+ "[@categories = 'ab9437db-ab2c-4df5-bb41-87e55409e8e1'] order by @date",
"//element(89878node, mgnl:content)[jcr:like(@title, '%News%')]"};

for (String query : queries) {
try {
if (isVersion2()) {
NodeQueryManager nodeQueryManager =
new NodeQueryManager("config", query, Query.XPATH, 0, 0);
List<NodeApiWrapper> result = nodeQueryManager.executeQuery();
assertEquals(0, result.size());
}
} catch (Exception e) {
assertNull(e);
}
}

String query = "/jcr:root/templates/components/1234_test_sections/*";
try {
if (isVersion2()) {
NodeQueryManager nodeQueryManager =
new NodeQueryManager("config", query, Query.XPATH, 0, 0);
List<NodeApiWrapper> result = nodeQueryManager.executeQuery();
assertEquals(3, result.size());
}
} catch (Exception e) {
assertNull(e);
}
}

@Test
public void testLimit() throws RepositoryException {
if (isVersion2()) {
Expand Down
138 changes: 138 additions & 0 deletions sinicum-server/src/test/resources/fixtures/templates.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9070,5 +9070,143 @@
</sv:node>
</sv:node>
</sv:node>
<sv:node sv:name="1234_test_sections">
<sv:property sv:name="jcr:primaryType" sv:type="Name">
<sv:value>mgnl:content</sv:value>
</sv:property>
<sv:property sv:name="jcr:mixinTypes" sv:type="Name" sv:multiple="true">
<sv:value>mix:lockable</sv:value>
</sv:property>
<sv:property sv:name="jcr:uuid" sv:type="String">
<sv:value>cf3ceb5c-fef7-4dce-bda8-51fbadb92e50</sv:value>
</sv:property>
<sv:property sv:name="jcr:createdBy" sv:type="String">
<sv:value>admin</sv:value>
</sv:property>
<sv:node sv:name="MetaData">
<sv:property sv:name="jcr:primaryType" sv:type="Name">
<sv:value>mgnl:metaData</sv:value>
</sv:property>
<sv:property sv:name="jcr:createdBy" sv:type="String">
<sv:value>admin</sv:value>
</sv:property>
<sv:property sv:name="mgnl:activated" sv:type="Boolean">
<sv:value>true</sv:value>
</sv:property>
<sv:property sv:name="mgnl:activatorid" sv:type="String">
<sv:value>superuser</sv:value>
</sv:property>
<sv:property sv:name="mgnl:authorid" sv:type="String">
<sv:value>dievision</sv:value>
</sv:property>
<sv:property sv:name="mgnl:creationdate" sv:type="Date">
<sv:value>2009-11-09T11:13:09.692+01:00</sv:value>
</sv:property>
<sv:property sv:name="mgnl:lastaction" sv:type="Date">
<sv:value>2010-09-30T22:00:49.265+08:00</sv:value>
</sv:property>
<sv:property sv:name="mgnl:lastmodified" sv:type="Date">
<sv:value>2009-11-09T11:13:14.352+01:00</sv:value>
</sv:property>
</sv:node>
<sv:node sv:name="contact_marginal">
<sv:property sv:name="jcr:primaryType" sv:type="Name">
<sv:value>mgnl:contentNode</sv:value>
</sv:property>
<sv:property sv:name="jcr:mixinTypes" sv:type="Name" sv:multiple="true">
<sv:value>mix:lockable</sv:value>
</sv:property>
<sv:property sv:name="jcr:uuid" sv:type="String">
<sv:value>676dc7cd-4e23-4de4-8999-27ba2b99056b</sv:value>
</sv:property>
<sv:property sv:name="description" sv:type="String">
<sv:value>Displays the data of a contact person</sv:value>
</sv:property>
<sv:property sv:name="dialog" sv:type="String">
<sv:value>shure:sections/contact_dialog</sv:value>
</sv:property>
<sv:property sv:name="jcr:createdBy" sv:type="String">
<sv:value>admin</sv:value>
</sv:property>
<sv:property sv:name="title" sv:type="String">
<sv:value>Contact box</sv:value>
</sv:property>
<sv:node sv:name="MetaData">
<sv:property sv:name="jcr:primaryType" sv:type="Name">
<sv:value>mgnl:metaData</sv:value>
</sv:property>
<sv:property sv:name="jcr:createdBy" sv:type="String">
<sv:value>admin</sv:value>
</sv:property>
<sv:property sv:name="mgnl:activated" sv:type="Boolean">
<sv:value>true</sv:value>
</sv:property>
<sv:property sv:name="mgnl:activatorid" sv:type="String">
<sv:value>superuser</sv:value>
</sv:property>
<sv:property sv:name="mgnl:authorid" sv:type="String">
<sv:value>dievision</sv:value>
</sv:property>
<sv:property sv:name="mgnl:creationdate" sv:type="Date">
<sv:value>2009-10-02T14:17:00.000+02:00</sv:value>
</sv:property>
<sv:property sv:name="mgnl:lastaction" sv:type="Date">
<sv:value>2010-09-30T22:00:49.266+08:00</sv:value>
</sv:property>
<sv:property sv:name="mgnl:lastmodified" sv:type="Date">
<sv:value>2009-11-09T11:15:04.634+01:00</sv:value>
</sv:property>
</sv:node>
</sv:node>
<sv:node sv:name="single_text">
<sv:property sv:name="jcr:primaryType" sv:type="Name">
<sv:value>mgnl:contentNode</sv:value>
</sv:property>
<sv:property sv:name="jcr:mixinTypes" sv:type="Name" sv:multiple="true">
<sv:value>mix:lockable</sv:value>
</sv:property>
<sv:property sv:name="jcr:uuid" sv:type="String">
<sv:value>b49e7bfb-d910-4db3-cc99-b674b4b6fc4c</sv:value>
</sv:property>
<sv:property sv:name="description" sv:type="String">
<sv:value>Simple text field</sv:value>
</sv:property>
<sv:property sv:name="dialog" sv:type="String">
<sv:value>shure:sections/single_text_dialog</sv:value>
</sv:property>
<sv:property sv:name="jcr:createdBy" sv:type="String">
<sv:value>admin</sv:value>
</sv:property>
<sv:property sv:name="title" sv:type="String">
<sv:value>Single text</sv:value>
</sv:property>
<sv:node sv:name="MetaData">
<sv:property sv:name="jcr:primaryType" sv:type="Name">
<sv:value>mgnl:metaData</sv:value>
</sv:property>
<sv:property sv:name="jcr:createdBy" sv:type="String">
<sv:value>admin</sv:value>
</sv:property>
<sv:property sv:name="mgnl:activated" sv:type="Boolean">
<sv:value>true</sv:value>
</sv:property>
<sv:property sv:name="mgnl:activatorid" sv:type="String">
<sv:value>superuser</sv:value>
</sv:property>
<sv:property sv:name="mgnl:authorid" sv:type="String">
<sv:value>dievision</sv:value>
</sv:property>
<sv:property sv:name="mgnl:creationdate" sv:type="Date">
<sv:value>2009-10-02T14:17:00.000+02:00</sv:value>
</sv:property>
<sv:property sv:name="mgnl:lastaction" sv:type="Date">
<sv:value>2010-09-30T22:00:49.266+08:00</sv:value>
</sv:property>
<sv:property sv:name="mgnl:lastmodified" sv:type="Date">
<sv:value>2009-12-15T20:26:11.562+01:00</sv:value>
</sv:property>
</sv:node>
</sv:node>
</sv:node>
</sv:node>
</sv:node>