Add functional method for mapping maps to PfUtils
[policy/models.git] / models-base / src / main / java / org / onap / policy / models / base / PfUtils.java
index 7bdd9a5..d5b70d7 100644 (file)
@@ -1,6 +1,6 @@
-/*
+/*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2019 Nordix Foundation.
+ *  Copyright (C) 2019-2020 Nordix Foundation.
  *  Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
 
 package org.onap.policy.models.base;
 
-import java.util.ArrayList;
+import java.lang.reflect.InvocationTargetException;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import javax.ws.rs.core.Response;
 
 /**
  * Utility class for Policy Framework concept utilities.
@@ -64,18 +68,89 @@ public final class PfUtils {
     }
 
     /**
-     * Convenience method to apply a mapping function to all of the elements of a list,
-     * generating a new list.
+     * Convenience method to apply a mapping function to all of the elements of a list, generating a new list.
      *
      * @param source list whose elements are to be mapped, or {@code null}
      * @param mapFunc mapping function
+     * @param defaultValue value to be returned if source is {@code null}
      * @return a new list, containing mappings of all of the items in the original list
      */
-    public static <T> List<T> mapList(List<T> source, Function<T, T> mapFunc) {
+    public static <T, R> List<R> mapList(List<T> source, Function<T, R> mapFunc, List<R> defaultValue) {
         if (source == null) {
-            return new ArrayList<>();
+            return defaultValue;
         }
 
         return source.stream().map(mapFunc).collect(Collectors.toList());
     }
+
+    /**
+     * Convenience method to apply a mapping function to all of the elements of a list, generating a new list.
+     *
+     * @param source list whose elements are to be mapped, or {@code null}
+     * @param mapFunc mapping function
+     * @return a new list, containing mappings of all of the items in the original list, or {@code null} if the source
+     *         is {@code null}
+     */
+    public static <T, R> List<R> mapList(List<T> source, Function<T, R> mapFunc) {
+        return mapList(source, mapFunc, null);
+    }
+
+    /**
+     * Convenience method to apply a mapping function to all of the values of a map, generating a new map.
+     *
+     * @param source map whose values are to be mapped, or {@code null}
+     * @param mapFunc mapping function
+     * @param defaultValue value to be returned if source is {@code null}
+     * @return a new map, containing mappings of all of the items in the original map
+     */
+    public static <T, R> Map<String, R> mapMap(Map<String, T> source, Function<T, R> mapFunc,
+            Map<String, R> defaultValue) {
+        if (source == null) {
+            return defaultValue;
+        }
+
+        Map<String, R> map = new LinkedHashMap<>();
+        for (Entry<String, T> ent : source.entrySet()) {
+            map.put(ent.getKey(), mapFunc.apply(ent.getValue()));
+        }
+
+        return map;
+    }
+
+    /**
+     * Convenience method to apply a mapping function to all of the values of a map, generating a new map.
+     *
+     * @param source map whose values are to be mapped, or {@code null}
+     * @param mapFunc mapping function
+     * @return a new map, containing mappings of all of the items in the original map, or {@code null} if the source is
+     *         {@code null}
+     */
+    public static <T, R> Map<String, R> mapMap(Map<String, T> source, Function<T, R> mapFunc) {
+        return mapMap(source, mapFunc, null);
+    }
+
+    /**
+     * Makes a copy of an object using the copy constructor from the object's class.
+     *
+     * @param source object to be copied
+     * @return a copy of the source, or {@code null} if the source is {@code null}
+     * @throws PfModelRuntimeException if the object cannot be copied
+     */
+    public static <T> T makeCopy(T source) {
+        if (source == null) {
+            return null;
+        }
+
+        try {
+            @SuppressWarnings("unchecked")
+            Class<? extends T> clazz = (Class<? extends T>) source.getClass();
+
+            return clazz.getConstructor(clazz).newInstance(source);
+
+        } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException
+                | RuntimeException e) {
+            throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR,
+                    "error copying concept key class: " + source.getClass().getName(), e);
+        }
+    }
 }