我正在尝试获取使用某些AEM标记的引用/路径。我试过这个:
import org.apache.sling.api.resource.Resource
import com.day.cq.tagging.Tag
import com.day.cq.tagging.TagManager
import org.apache.sling.api.resource.ResourceResolver
import java.lang.Thread.*;
import javax.jcr.Node;
def tagpath = "/etc/tags";
def delay = 10 ; //in Milliseconds.
def query = getAllTags(tagpath)
def result = query.execute()
def rows = result.rows
def unusedTags = 0
rows.each { row ->
Resource res = resourceResolver.getResource(row.path)
if(res!=null){
Tag tag = res.adaptTo(com.day.cq.tagging.Tag)
Node tempNode = res.adaptTo(javax.jcr.Node);
TagManager tm = resourceResolver.adaptTo(com.day.cq.tagging.TagManager);
FindResults fr = tm.findByTitle(tag.title)
RangeIterator rangeIterator = fr.resources; -> this throws Cast Exception
//how to get paths of results (content) from fr to see where is this tag used
Thread.currentThread().sleep((long)(delay));
}
}
def getAllTags(tagpath) {
def queryManager = session.workspace.queryManager
def statement = "/jcr:root"+tagpath+"//element(*, cq:Tag)"
def query = queryManager.createQuery(statement, "xpath")
}
现在我对如何从fr变量获得结果感兴趣。我应该以某种方式使它适应Resource类,或者我如何获得返回的资产/页面的路径?
FindResults findByTitle(String) - 搜索使用包含给定标题的标记标记为标记标题的所有内容。
import org.apache.sling.api.resource.Resource
import com.day.cq.tagging.Tag
import com.day.cq.tagging.TagManager
import com.day.cq.tagging.TagManager.FindResults
import org.apache.sling.api.resource.ResourceResolver
import java.lang.Thread.*;
import javax.jcr.Node;
import javax.jcr.RangeIterator;
def tagpath = "/etc/tags";
def query = getAllTags(tagpath)
def result = query.execute()
def rows = result.rows
def counter = 1;
def tagTitles = ["tag1", "tag2", "tag3"]
rows.each { row ->
Resource res = resourceResolver.getResource(row.path)
if(res!=null){
Tag tag = res.adaptTo(com.day.cq.tagging.Tag)
Node tempNode = res.adaptTo(javax.jcr.Node);
TagManager tm = resourceResolver.adaptTo(com.day.cq.tagging.TagManager);
tagTitles.each { tagTitle ->
if(tag.title.equalsIgnoreCase(tagTitle)){
counter++;
try{
FindResults fr = tm.findByTitle(tag.title);
Iterator rangeIterator = fr.resources;
if(rangeIterator.size() != 0){
println("Tag: " + tagTitle);
println("-- References: ");
println();
fr = tm.findByTitle(tag.title);
rangeIterator = fr.resources;
rangeIterator.each { resource ->
println(resource.path);
}
}
else{
println("REFERENCES NOT FOUND FOR: " + tagTitle);
}
} catch(MissingMethodException ex){
println("Title not found in tag list: " + tagTitle);
println(ex);
}
}
}
}
}
println("List lenght: " + tagTitles.size());
println("Number of tags with given title found: " + counter);
def getAllTags(tagpath) {
def queryManager = session.workspace.queryManager
def statement = "/jcr:root"+tagpath+"//element(*, cq:Tag)"
def query = queryManager.createQuery(statement, "xpath")
}
这就是答案。我不知道确切的原因,但Groovy无法识别RangeIterator。在我看到RangeIterator扩展Iterator并以新的方式使用它之后,它开始工作了。
------编辑------
我不认为这是完整的答案,因为我不知道Groovy没有将其识别为RangeIterator的确切原因,所以如果有人能够回答这个问题,请做。
此外,这个fr = tm.findByTitle(tag.title);
只获得带有给定标题的标签的引用,还是他的孩子的参考?
由于返回的类不是迭代器,因此存在Cast Exception。这是一个RangeIterator这个类从迭代器扩展并提供了一些有用的额外方法。
如果你使用RangeIterator rangeIterator = fr.resources
最好
然后你可以正常继承hasNext next
方法
在这种情况下,这是Resource的RangeIterator,因此您可以通过在每个元素上调用getPath
方法来获取路径。