/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.streams.pojo.extensions;
import org.apache.streams.jackson.StreamsJacksonMapper;
import org.apache.streams.pojo.json.Activity;
import org.apache.streams.pojo.json.ActivityObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.Map;
/**
* Class makes it easier to manage extensions added to activities, actors, objects, etc...
*/
public class ExtensionUtil {
public static final String DEFAULT_EXTENSION_PROPERTY = null;
private static final ExtensionUtil INSTANCE = new ExtensionUtil(DEFAULT_EXTENSION_PROPERTY);
private String extensionProperty;
public static ExtensionUtil getInstance() {
return INSTANCE;
}
public static ExtensionUtil getInstance(String property) {
return new ExtensionUtil(property);
}
private ExtensionUtil(String extensionProperty) {
this.extensionProperty = extensionProperty;
}
private static final ObjectMapper mapper = StreamsJacksonMapper.getInstance();
public Map<String, Object> getExtensions(Activity activity) {
return ensureExtensions(activity);
}
public Map<String, Object> getExtensions(ActivityObject object) {
ActivityObject activityObject = mapper.convertValue(object, ActivityObject.class);
return ensureExtensions(activityObject);
}
public Object getExtension(Activity activity, String key) {
Map<String,Object> extensions = ensureExtensions(activity);
return extensions.get(key);
}
public Object getExtension(ActivityObject object, String key) {
Map<String,Object> extensions = ensureExtensions(object);
return extensions.get(key);
}
public void addExtension(Activity activity, String key, Object extension) {
Map<String,Object> extensions = ensureExtensions(activity);
extensions.put(key, extension);
}
public void addExtension(ActivityObject object, String key, Object extension) {
Map<String,Object> extensions = ensureExtensions(object);
extensions.put(key, extension);
}
public void removeExtension(Activity activity, String key) {
Map<String,Object> extensions = ensureExtensions(activity);
extensions.remove(key);
}
public void removeExtension(ActivityObject object, String key) {
Map<String,Object> extensions = ensureExtensions(object);
extensions.remove(key);
}
public void setExtensions(Activity activity, Map<String, Object> extensions) {
activity.setAdditionalProperty(extensionProperty, extensions);
}
public void setExtensions(ActivityObject object, Map<String, Object> extensions) {
object.setAdditionalProperty(extensionProperty, extensions);
}
public void addExtensions(Activity activity, Map<String, Object> extensions) {
for ( Map.Entry<String, Object> item : extensions.entrySet()) {
addExtension(activity, item.getKey(), item.getValue());
}
}
public void addExtensions(ActivityObject object, Map<String, Object> extensions) {
for ( Map.Entry<String, Object> item : extensions.entrySet()) {
addExtension(object, item.getKey(), item.getValue());
}
}
/**
* Creates a standard extension property.
* @param activity activity to create the property in
* @return the Map representing the extensions property
*/
@SuppressWarnings("unchecked")
public Map<String, Object> ensureExtensions(Activity activity) {
Map<String,Object> additionalProperties = activity.getAdditionalProperties();
Map<String,Object> extensions;
if (additionalProperties == null) {
additionalProperties = new HashMap<>();
}
if (StringUtils.isNotBlank(extensionProperty) ) {
extensions = (Map<String, Object>) additionalProperties.get(extensionProperty);
if (extensions == null) {
extensions = new HashMap<>();
additionalProperties.put(extensionProperty, extensions);
}
return extensions;
} else {
return additionalProperties;
}
}
/**
* Creates a standard extension property.
* @param object object node to create the property in
* @return {@link Map} representing the extensions property
*/
@SuppressWarnings("unchecked")
public Map<String, Object> ensureExtensions(ActivityObject object) {
Map<String,Object> additionalProperties = object.getAdditionalProperties();
Map<String,Object> extensions;
if (additionalProperties == null) {
additionalProperties = new HashMap<>();
}
if (StringUtils.isNotBlank(extensionProperty) ) {
extensions = (Map<String, Object>) additionalProperties.get(extensionProperty);
if (extensions == null) {
extensions = new HashMap<>();
additionalProperties.put(extensionProperty, extensions);
}
return extensions;
} else {
return additionalProperties;
}
}
}