Clover icon

Magnolia REST Content Delivery 2.0-rc1

  1. Project Clover database Mon Oct 30 2017 16:36:57 CET
  2. Package info.magnolia.rest.delivery.jcr.decorator

File AdditionNodeWrapper.java

 

Coverage histogram

../../../../../../img/srcFileCovDistChart0.png
73% of files have more coverage

Code metrics

2
31
11
1
169
107
14
0.45
2.82
11
1.27
8.3% of code in this file is excluded from these metrics.

Classes

Class Line # Actions
AdditionNodeWrapper 65 31 8.3% 14 44
0.00%
 

Contributing tests

No tests hitting this source file were found.

Source view

1    /**
2    * This file Copyright (c) 2017 Magnolia International
3    * Ltd. (http://www.magnolia-cms.com). All rights reserved.
4    *
5    *
6    * This file is dual-licensed under both the Magnolia
7    * Network Agreement and the GNU General Public License.
8    * You may elect to use one or the other of these licenses.
9    *
10    * This file is distributed in the hope that it will be
11    * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
12    * implied warranty of MERCHANTABILITY or FITNESS FOR A
13    * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
14    * Redistribution, except as permitted by whichever of the GPL
15    * or MNA you select, is prohibited.
16    *
17    * 1. For the GPL license (GPL), you can redistribute and/or
18    * modify this file under the terms of the GNU General
19    * Public License, Version 3, as published by the Free Software
20    * Foundation. You should have received a copy of the GNU
21    * General Public License, Version 3 along with this program;
22    * if not, write to the Free Software Foundation, Inc., 51
23    * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24    *
25    * 2. For the Magnolia Network Agreement (MNA), this file
26    * and the accompanying materials are made available under the
27    * terms of the MNA which accompanies this distribution, and
28    * is available at http://www.magnolia-cms.com/mna.html
29    *
30    * Any modifications to this file must keep this entire header
31    * intact.
32    *
33    */
34    package info.magnolia.rest.delivery.jcr.decorator;
35   
36    import info.magnolia.jcr.util.NodeUtil;
37    import info.magnolia.jcr.wrapper.DelegateNodeWrapper;
38   
39    import java.util.ArrayList;
40    import java.util.Collection;
41    import java.util.Collections;
42    import java.util.Iterator;
43    import java.util.List;
44    import java.util.stream.Collectors;
45   
46    import javax.jcr.Item;
47    import javax.jcr.Node;
48    import javax.jcr.NodeIterator;
49    import javax.jcr.Property;
50    import javax.jcr.PropertyIterator;
51    import javax.jcr.RepositoryException;
52   
53    import org.apache.jackrabbit.commons.ItemNameMatcher;
54    import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
55    import org.apache.jackrabbit.commons.iterator.PropertyIteratorAdapter;
56    import org.apache.jackrabbit.spi.commons.iterator.Iterators;
57    import org.slf4j.Logger;
58    import org.slf4j.LoggerFactory;
59   
60    import com.google.common.collect.Lists;
61   
62    /**
63    * An implementation for {@link Node} supports adding addition properties or nodes.
64    */
 
65    public class AdditionNodeWrapper extends DelegateNodeWrapper {
66    private static final Logger log = LoggerFactory.getLogger(AdditionNodeWrapper.class);
67   
68    private final String placeholderName;
69    private final List<Item> additionItems;
70   
 
71  0 toggle public AdditionNodeWrapper(Node node, String placeholderName, List<Item> additionItems) {
72  0 super(node);
73  0 this.placeholderName = placeholderName;
74  0 this.additionItems = additionItems;
75    }
76   
 
77  0 toggle public AdditionNodeWrapper(Node node, String placeholderName) {
78  0 this(node, placeholderName, Collections.emptyList());
79    }
80   
 
81  0 toggle public AdditionNodeWrapper(Node node, List<Item> additionItems) {
82  0 this(node, null, additionItems);
83    }
84   
 
85  0 toggle protected List<Item> getAdditionItems() {
86  0 return additionItems;
87    }
88   
 
89  0 toggle @Override
90    public String getName() throws RepositoryException {
91  0 return placeholderName == null ? super.getName() : placeholderName;
92    }
93   
 
94    toggle @Override
95    public PropertyIterator getProperties() throws RepositoryException {
96    return getProperties("*");
97    }
98   
 
99  0 toggle @Override
100    public PropertyIterator getProperties(String namePattern) throws RepositoryException {
101  0 return getProperties(new String[] { namePattern });
102    }
103   
 
104  0 toggle @Override
105    public PropertyIterator getProperties(String[] nameGlobs) throws RepositoryException {
106  0 Iterator<Property> properties = Iterators.properties(super.getProperties(nameGlobs));
107   
108  0 List<Property> merged = Lists.newArrayList(properties);
109  0 List<Property> resolvedProperties = getAdditionItems().stream()
110    .filter(item -> {
111  0 try {
112  0 return !item.isNode() && ItemNameMatcher.matches(item.getName(), nameGlobs);
113    } catch (RepositoryException e) {
114  0 log.warn("Cannot get name of item {}:", item, e);
115    }
116   
117  0 return false;
118    })
119    .map(item -> (Property) item)
120    .collect(Collectors.toList());
121  0 merged.addAll(resolvedProperties);
122   
123  0 return new PropertyIteratorAdapter(merged);
124    }
125   
 
126  0 toggle @Override
127    public boolean hasNodes() throws RepositoryException {
128  0 boolean hasNodes = getAdditionItems().stream().anyMatch(Item::isNode);
129  0 return hasNodes || super.hasNodes();
130    }
131   
 
132  0 toggle @Override
133    public boolean hasProperties() throws RepositoryException {
134  0 boolean hasProperties = getAdditionItems().stream().anyMatch(item -> !item.isNode());
135  0 return hasProperties || super.hasProperties();
136    }
137   
 
138    toggle @Override
139    public NodeIterator getNodes() throws RepositoryException {
140    return getNodes("*");
141    }
142   
 
143  0 toggle @Override
144    public NodeIterator getNodes(String namePattern) throws RepositoryException {
145  0 return getNodes(new String[] { namePattern });
146    }
147   
 
148  0 toggle @Override
149    public NodeIterator getNodes(String[] nameGlobs) throws RepositoryException {
150  0 Collection<Node> children = NodeUtil.getCollectionFromNodeIterator(getWrappedNode().getNodes(nameGlobs));
151   
152  0 List<Node> merged = new ArrayList<>(children);
153  0 List<Node> resolvedNodes = getAdditionItems().stream()
154    .filter(item -> {
155  0 try {
156  0 return item.isNode() && ItemNameMatcher.matches(item.getName(), nameGlobs);
157    } catch (RepositoryException e) {
158  0 log.warn("Cannot get name of item {}:", item, e);
159    }
160   
161  0 return false;
162    })
163    .map(item -> (Node) item)
164    .collect(Collectors.toList());
165  0 merged.addAll(resolvedNodes);
166   
167  0 return new NodeIteratorAdapter(merged);
168    }
169    }