Your achievements

Level 1

0% to

Level 2

Tip /
Sign in

Sign in to Community

to gain points, level up, and earn exciting badges like the new
BedrockMission!

Learn more

View all

Sign in to view all badges

SOLVED

How to combine two ValueMaps?

TB3dock
Level 7
Level 7

trying to combine 2 valuemaps into 1.   putAll fails with null pointer, and it doesnt not seem possible to create an empty valueMap.  Any ideas for another option? I have tried posting the full info on why we are doing this, but the forum system always deletes it, so trying this short version.

 

		predicate.put("path", path);
		predicate.put("type", "cq:unstructured");
		predicate.put("group.1_property", "sling:resourceType");
		predicate.put("group.1_property.value", "mysite/components/gamemain");
		predicate.put("group.2_property", "sling:resourceType");
		predicate.put("group.2_property.value", "mysite/components/gameterms");
		predicate.put("group.p.or", "true");
		
		Query query = _builder.createQuery(PredicateGroup.create(predicate), session);
		
		// should only be 2 components!
		query.setStart(0);
		query.setHitsPerPage(20);
		
		SearchResult searchResult = query.getResult();
		
		ValueMap allProps = null;
		
		for(Hit hit : searchResult.getHits()) {
			ValueMap props = hit.getProperties();
			if (allProps == null) {
				allProps  = props;
			}  else {
				allProps.putAll(props);  // null pointer exception
			}
		}

 

 

1 Accepted Solution
Vijayalakshmi_S
Correct answer by
Community Advisor
Community Advisor

Hi @TB3dock,

Ways to instantiate an empty ValueMap is through its implementing Decorator classes. 

Map<String, Object> map = new HashMap<String, Object>();
ValueMap vm = new ValueMapDecorator(map);

Example :

 

Map<String, Object> map = new HashMap<String, Object>();
ValueMap vm = new ValueMapDecorator(map);
/* Within Query results iteration */
for (Hit hit : queryResults.getHits()) {
			try {
				String pagePath = hit.getPath();								
				vm.putAll(hit.getProperties());
....

 

Below API doc has the list of all known implementing classes of ValueMap, you can choose the one based on your need. (Ignore Deprecated ones from the list)

https://sling.apache.org/apidocs/sling8/org/apache/sling/api/resource/ValueMap.html

View solution in original post

2 Replies
Vijayalakshmi_S
Correct answer by
Community Advisor
Community Advisor

Hi @TB3dock,

Ways to instantiate an empty ValueMap is through its implementing Decorator classes. 

Map<String, Object> map = new HashMap<String, Object>();
ValueMap vm = new ValueMapDecorator(map);

Example :

 

Map<String, Object> map = new HashMap<String, Object>();
ValueMap vm = new ValueMapDecorator(map);
/* Within Query results iteration */
for (Hit hit : queryResults.getHits()) {
			try {
				String pagePath = hit.getPath();								
				vm.putAll(hit.getProperties());
....

 

Below API doc has the list of all known implementing classes of ValueMap, you can choose the one based on your need. (Ignore Deprecated ones from the list)

https://sling.apache.org/apidocs/sling8/org/apache/sling/api/resource/ValueMap.html

View solution in original post

Anudeep_Garnepudi
Community Advisor
Community Advisor

@TB3dock 

You will get NullPointerException if any one of variables is null. 

allProps.putAll(props);

allProps and props should not be null. Please check.