Clover icon

Magnolia REST Content Delivery 2.0.1

  1. Project Clover database Thu Dec 21 2017 11:02:58 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

8
34
11
1
178
113
16
0.47
3.09
11
1.45
10.2% of code in this file is excluded from these metrics.

Classes

Class Line # Actions
AdditionNodeWrapper 66 34 10.2% 16 53
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.Collection;
40    import java.util.Collections;
41    import java.util.HashSet;
42    import java.util.Iterator;
43    import java.util.List;
44    import java.util.Set;
45    import java.util.stream.Collectors;
46   
47    import javax.jcr.Item;
48    import javax.jcr.Node;
49    import javax.jcr.NodeIterator;
50    import javax.jcr.Property;
51    import javax.jcr.PropertyIterator;
52    import javax.jcr.RepositoryException;
53   
54    import org.apache.jackrabbit.commons.ItemNameMatcher;
55    import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
56    import org.apache.jackrabbit.commons.iterator.PropertyIteratorAdapter;
57    import org.apache.jackrabbit.spi.commons.iterator.Iterators;
58    import org.slf4j.Logger;
59    import org.slf4j.LoggerFactory;
60   
61    import com.google.common.collect.Lists;
62   
63    /**
64    * An implementation for {@link Node} supports adding addition properties or nodes.
65    */
 
66    public class AdditionNodeWrapper extends DelegateNodeWrapper {
67    private static final Logger log = LoggerFactory.getLogger(AdditionNodeWrapper.class);
68   
69    private final String placeholderName;
70    private final List<Item> additionItems;
71   
 
72  0 toggle public AdditionNodeWrapper(Node node, String placeholderName, List<Item> additionItems) {
73  0 super(node);
74  0 this.placeholderName = placeholderName;
75  0 this.additionItems = additionItems;
76    }
77   
 
78  0 toggle public AdditionNodeWrapper(Node node, String placeholderName) {
79  0 this(node, placeholderName, Collections.emptyList());
80    }
81   
 
82  0 toggle public AdditionNodeWrapper(Node node, List<Item> additionItems) {
83  0 this(node, null, additionItems);
84    }
85   
 
86    toggle @Override
87    public void setWrappedNode(Node node) {
88    this.wrapped = node;
89    }
90   
 
91  0 toggle protected List<Item> getAdditionItems() {
92  0 return additionItems;
93    }
94   
 
95  0 toggle @Override
96    public String getName() throws RepositoryException {
97  0 return placeholderName == null ? super.getName() : placeholderName;
98    }
99   
 
100    toggle @Override
101    public PropertyIterator getProperties() throws RepositoryException {
102    return getProperties("*");
103    }
104   
 
105  0 toggle @Override
106    public PropertyIterator getProperties(String namePattern) throws RepositoryException {
107  0 return getProperties(new String[] { namePattern });
108    }
109   
 
110  0 toggle @Override
111    public PropertyIterator getProperties(String[] nameGlobs) throws RepositoryException {
112  0 Iterator<Property> properties = Iterators.properties(super.getProperties(nameGlobs));
113   
114  0 List<Property> merged = Lists.newArrayList(properties);
115  0 List<Property> resolvedProperties = getAdditionItems().stream()
116    .filter(item -> {
117  0 try {
118  0 return !item.isNode() && ItemNameMatcher.matches(item.getName(), nameGlobs);
119    } catch (RepositoryException e) {
120  0 log.warn("Cannot get name of item {}:", item, e);
121    }
122   
123  0 return false;
124    })
125    .map(item -> (Property) item)
126    .collect(Collectors.toList());
127  0 merged.addAll(resolvedProperties);
128   
129  0 return new PropertyIteratorAdapter(merged);
130    }
131   
 
132  0 toggle @Override
133    public boolean hasNodes() throws RepositoryException {
134  0 boolean hasNodes = getAdditionItems().stream().anyMatch(Item::isNode);
135  0 return hasNodes || super.hasNodes();
136    }
137   
 
138  0 toggle @Override
139    public boolean hasProperties() throws RepositoryException {
140  0 boolean hasProperties = getAdditionItems().stream().anyMatch(item -> !item.isNode());
141  0 return hasProperties || super.hasProperties();
142    }
143   
 
144    toggle @Override
145    public NodeIterator getNodes() throws RepositoryException {
146    return getNodes("*");
147    }
148   
 
149  0 toggle @Override
150    public NodeIterator getNodes(String namePattern) throws RepositoryException {
151  0 return getNodes(new String[] { namePattern });
152    }
153   
 
154  0 toggle @Override
155    public NodeIterator getNodes(String[] nameGlobs) throws RepositoryException {
156  0 Collection<Node> children = NodeUtil.getCollectionFromNodeIterator(getWrappedNode().getNodes(nameGlobs));
157   
158  0 Set<Node> merged = new HashSet<>();
159  0 for (Node child : children) {
160  0 for (Item item : getAdditionItems()) {
161  0 if (!item.isNode()) {
162  0 continue;
163    }
164   
165    // Merge 2 nodes with same names
166  0 if (child.getName().equals(item.getName())) {
167  0 child = new AdditionNodeWrapper(child, Lists.newArrayList (((Node) item).getProperties()));
168  0 } else if (!getWrappedNode().hasNode(item.getName())) {
169  0 merged.add((Node) item);
170    }
171    }
172   
173  0 merged.add(child);
174    }
175   
176  0 return new NodeIteratorAdapter(merged);
177    }
178    }