JcrExportCommand 过滤器以排除 magnolia cms 中的“mgnl:page”

Posted

技术标签:

【中文标题】JcrExportCommand 过滤器以排除 magnolia cms 中的“mgnl:page”【英文标题】:JcrExportCommand filter to exclude "mgnl:page" in magnolia cms 【发布时间】:2019-12-02 13:11:27 【问题描述】:

当我在具有自定义操作的节点上执行它时,我想过滤掉 magnolia 中 JcrExportCommand 的“mgnl:page”节点。

我在下面的代码中编写的过滤器不起作用。它仍然给我导出文件中的 mgnl:page 子节点。

//set filter to only export mgnl:area subnodes
    DefaultFilter filter = new JcrExportCommand.DefaultFilter();
    NodeFilteringPredicate nodePredicate = new NodeFilteringPredicate();
    nodePredicate.setNodeTypes(Lists.newArrayList("mgnl:area"));
    filter.setNodePredicate(nodePredicate);

如何设置正确的过滤器来导出除“mgnl:page”子节点之外的所有内容?我相信将 NodeFilteringPredicate 设置为 "mgnl:area" 我只会得到该类型的节点。

【问题讨论】:

【参考方案1】:

您必须在JcrExportCommand 上设置过滤器才能使其生效:

DefaultFilter filter = new DefaultFilter();
filter.getNodePredicate().getNodeTypes().add("mgnl:page");
jcrExport.setFilter(Collections.singletonMap("website", filter));

【讨论】:

谢谢@michid 我测试了它并且它工作但由于***节点的类型为 mgnl:page 它会从导出的文件中删除它以及它下面的所有内容:) 我想创建一个过滤器将保留***页面节点并删除导出文件中所有 mgnl:page 类型的子节点。我可以通过过滤器来实现吗? 在这种情况下,您可能必须实现自己的谓词来决定要保留哪些节点。从AbstractPredicate 继承并在那里实现您的逻辑,并通过调用JcrExportCommand.DefaultFilter#setNodePredicate() 在默认过滤器中设置您的谓词。 我一无所知。我建议您首先从NodeFilteringPredicate 派生谓词并覆盖evaluate() 方法。在这里,您必须确定传递的节点是否为页面以及是否为***节点。你可以通过查看它的父母来做到这一点。【参考方案2】:

* 这不是我问题的答案,而是评论的答案,因为评论中的代码格式不正确 *

正如@michid 建议的那样,我创建了一个自定义预测器并使用 JcrExportCommand.DefaultFilter#setNodePredicate() 来应用它。

我希望根据 Predicate 得到一个带有过滤节点的导出 YAML,但我仍然得到所有节点(包括 mgnl:page 类型的子节点)。

我的自定义谓词类是:

public class MyPredicate extends NodeFilteringPredicate 

    public boolean evaluate(Node node) throws AccessDeniedException, ItemNotFoundException, RepositoryException 
            //only nodes that are not of type mgnl:page 
            if((node.getParent().getPrimaryNodeType().getName().contains("mgnl:page"))&&(node.getPrimaryNodeType().getName().contains("mgnl:page"))) 
                return false;
            else
                return true;
            
    

我的自定义 Action 类是:

public class MyAction extends AbstractMultiItemAction<UzhVersioning>  


private AbstractPredicate<Node> MyPredicate;



public MyAction(xxxVersioning definition, JcrItemAdapter item, UiContext uiContext) 
    super(definition, item, uiContext);
    // TODO Auto-generated constructor stub





@Override
public void execute() 

    //export nodes from a JCR workspace
    JcrExportCommand exporter = new JcrExportCommand();
    //sets export format to yaml
    exporter.setFormat("yaml");
    exporter.setRepository("website");


    //set filter to only export top mgnl:page and its mgnl:area nodes
    DefaultFilter filter = new JcrExportCommand.DefaultFilter();
    AbstractPredicate<Node> predicate = new MyPredicate();
    filter.setNodePredicate(predicate);
    exporter.setFilters(Collections.singletonMap("website", filter));



    //setup the root directory for exports
    File rootDir = new File("/Users/asusti/Downloads/yamlExport");
    // clean up first
    rootDir.delete();
    rootDir.mkdirs();

    //get root node
    Node node = (Node) getItems().get(0).getJcrItem();


    try 
        //set export path
        exporter.setPath(node.getPath());
        File file = new File(rootDir, node.getName()+".yaml");
        FileOutputStream out = new FileOutputStream(file);
        exporter.setOutputStream(out);
        exporter.execute(MgnlContext.getInstance());
     catch (Exception e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    

【讨论】:

以上是关于JcrExportCommand 过滤器以排除 magnolia cms 中的“mgnl:page”的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress - 过滤搜索查询以排除 postmeta 值

bigQuery 和 GA-Premium 集成:从 GA 中的未过滤视图导出数据时,如何在 bigQuery 中使用 IP 过滤器(以排除内部流量)

如何排除按钮被过滤?

视图上的过滤器应用于视图中排除的过滤器

我可以以某种方式从java中的Collections.Min / Collections.Max中排除或过滤掉一个值吗?

通配符与正规