Получить ссылки на теги в AEM с помощью консоли Groovy - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь получить ссылки / пути, где используются некоторые теги 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 или как я могу получить path к ресурсам / страницам, которые это возвращает?

FindResults findByTitle (String) - Выполняет поиск всего содержимого, помеченного тегомтег, который содержит данный заголовок в качестве заголовка тега.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019
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 и использовал его как-то иначе, он начал работать.

------ EDIT ------

Я не считаюэто полный ответ, поскольку я не знаю точной причины, по которой Groovy не может распознать это как RangeIterator, поэтому, если кто-то может ответить на этот вопрос, сделайте это.

Кроме того, это fr = tm.findByTitle(tag.title); получает толькоссылки на тег с заданным названием или ссылки на его детей?

0 голосов
/ 29 апреля 2019

Существует Исключение Приведения, поскольку возвращаемый класс не является Итератором.Это RangeIterator , этот класс расширяется от итератора и предоставляет некоторые дополнительные методы, которые могут быть полезны.

Было бы лучше, если вы используете RangeIterator rangeIterator = fr.resources

Тогда вы можетеобычно наследуют hasNext next методов

В этом случае это RangeIterator Resource , поэтому вы можете получить путь, вызвав метод getPath для каждого из элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...