| /******************************************************************************* |
| * Copyright (c) 2015, 2016 Raymond Augé and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Raymond Augé - bug fixes and enhancements |
| ******************************************************************************/ |
| |
| package org.eclipse.equinox.http.servlet.internal.util; |
| |
| import java.lang.reflect.Array; |
| import java.util.*; |
| import org.eclipse.equinox.http.servlet.dto.ExtendedFailedServletDTO; |
| import org.eclipse.equinox.http.servlet.dto.ExtendedServletDTO; |
| import org.osgi.dto.DTO; |
| import org.osgi.service.http.runtime.dto.*; |
| |
| /** |
| * @author Raymond Augé |
| */ |
| public class DTOUtil { |
| |
| public static ErrorPageDTO clone(ErrorPageDTO original) { |
| ErrorPageDTO clone = new ErrorPageDTO(); |
| |
| clone.asyncSupported = copy(original.asyncSupported); |
| clone.errorCodes = copy(original.errorCodes); |
| clone.exceptions = copy(original.exceptions); |
| clone.initParams = copyStringMap(original.initParams); |
| clone.name = copy(original.name); |
| clone.serviceId = copy(original.serviceId); |
| clone.servletContextId = copy(original.servletContextId); |
| clone.servletInfo = copy(original.servletInfo); |
| |
| return clone; |
| } |
| |
| public static FailedFilterDTO clone(FailedFilterDTO original) { |
| FailedFilterDTO clone = new FailedFilterDTO(); |
| |
| clone.asyncSupported = copy(original.asyncSupported); |
| clone.dispatcher = copy(original.dispatcher); |
| clone.failureReason = copy(original.failureReason); |
| clone.initParams = copyStringMap(original.initParams); |
| clone.name = copy(original.name); |
| clone.patterns = copy(original.patterns); |
| clone.regexs = copy(original.regexs); |
| clone.serviceId = copy(original.serviceId); |
| clone.servletContextId = copy(original.servletContextId); |
| clone.servletNames = copy(original.servletNames); |
| |
| return clone; |
| } |
| |
| public static FailedListenerDTO clone(FailedListenerDTO original) { |
| FailedListenerDTO clone = new FailedListenerDTO(); |
| |
| clone.failureReason = copy(original.failureReason); |
| clone.serviceId = copy(original.serviceId); |
| clone.servletContextId = copy(original.servletContextId); |
| clone.types = copy(original.types); |
| |
| return clone; |
| } |
| |
| public static FailedResourceDTO clone(FailedResourceDTO original) { |
| FailedResourceDTO clone = new FailedResourceDTO(); |
| |
| clone.failureReason = copy(original.failureReason); |
| clone.patterns = copy(original.patterns); |
| clone.prefix = copy(original.prefix); |
| clone.serviceId = copy(original.serviceId); |
| clone.servletContextId = copy(original.servletContextId); |
| |
| return clone; |
| } |
| |
| public static FailedServletContextDTO clone(FailedServletContextDTO original) { |
| FailedServletContextDTO clone = new FailedServletContextDTO(); |
| |
| clone.attributes = copyGenericMap(original.attributes); |
| clone.contextPath = copy(original.contextPath); |
| clone.errorPageDTOs = copy(original.errorPageDTOs); |
| clone.failureReason = copy(original.failureReason); |
| clone.filterDTOs = copy(original.filterDTOs); |
| clone.initParams = copyStringMap(original.initParams); |
| clone.listenerDTOs = copy(original.listenerDTOs); |
| clone.name = copy(original.name); |
| clone.resourceDTOs = copy(original.resourceDTOs); |
| clone.serviceId = copy(original.serviceId); |
| clone.servletDTOs = copy(original.servletDTOs); |
| |
| return clone; |
| } |
| |
| public static ExtendedFailedServletDTO clone(ExtendedFailedServletDTO original) { |
| ExtendedFailedServletDTO clone = new ExtendedFailedServletDTO(); |
| |
| clone.asyncSupported = copy(original.asyncSupported); |
| clone.failureReason = copy(original.failureReason); |
| clone.initParams = copyStringMap(clone.initParams); |
| clone.multipartEnabled = copy(original.multipartEnabled); |
| clone.multipartFileSizeThreshold = copy(original.multipartFileSizeThreshold); |
| clone.multipartLocation = copy(original.multipartLocation); |
| clone.multipartMaxFileSize = copy(original.multipartMaxFileSize); |
| clone.multipartMaxRequestSize = copy(original.multipartMaxRequestSize); |
| clone.name = copy(original.name); |
| clone.patterns = copy(original.patterns); |
| clone.serviceId = copy(original.serviceId); |
| clone.servletContextId = copy(original.servletContextId); |
| clone.servletInfo = copy(original.servletInfo); |
| |
| return clone; |
| } |
| |
| public static FilterDTO clone(FilterDTO original) { |
| FilterDTO clone = new FilterDTO(); |
| |
| clone.asyncSupported = copy(original.asyncSupported); |
| clone.dispatcher = copy(original.dispatcher); |
| clone.initParams = copyStringMap(original.initParams); |
| clone.name = copy(original.name); |
| clone.patterns = copy(original.patterns); |
| clone.regexs = copy(original.regexs); |
| clone.serviceId = copy(original.serviceId); |
| clone.servletContextId = copy(original.servletContextId); |
| clone.servletNames = copy(original.servletNames); |
| |
| return clone; |
| } |
| |
| public static ListenerDTO clone(ListenerDTO original) { |
| ListenerDTO clone = new ListenerDTO(); |
| |
| clone.serviceId = copy(original.serviceId); |
| clone.servletContextId = copy(original.servletContextId); |
| clone.types = copy(original.types); |
| |
| return clone; |
| } |
| |
| public static ResourceDTO clone(ResourceDTO original) { |
| ResourceDTO clone = new ResourceDTO(); |
| |
| clone.patterns = copy(original.patterns); |
| clone.prefix = copy(original.prefix); |
| clone.serviceId = copy(original.serviceId); |
| clone.servletContextId = copy(original.servletContextId); |
| |
| return clone; |
| } |
| |
| public static ExtendedServletDTO clone(ExtendedServletDTO original) { |
| ExtendedServletDTO clone = new ExtendedServletDTO(); |
| |
| clone.asyncSupported = copy(original.asyncSupported); |
| clone.initParams = copyStringMap(original.initParams); |
| clone.multipartEnabled = copy(original.multipartEnabled); |
| clone.multipartFileSizeThreshold = copy(original.multipartFileSizeThreshold); |
| clone.multipartLocation = copy(original.multipartLocation); |
| clone.multipartMaxFileSize = copy(original.multipartMaxFileSize); |
| clone.multipartMaxRequestSize = copy(original.multipartMaxRequestSize); |
| clone.name = copy(original.name); |
| clone.patterns = copy(original.patterns); |
| clone.serviceId = copy(original.serviceId); |
| clone.servletContextId = copy(original.servletContextId); |
| clone.servletInfo = copy(original.servletInfo); |
| |
| return clone; |
| } |
| |
| private static long[] copy(long[] array) { |
| if (array == null) { |
| return null; |
| } |
| if (array.length == 0) { |
| return array; |
| } |
| return Arrays.copyOf(array, array.length); |
| } |
| |
| |
| private static String[] copy(String[] array) { |
| if (array == null) { |
| return null; |
| } |
| if (array.length == 0) { |
| return array; |
| } |
| return Arrays.copyOf(array, array.length); |
| } |
| |
| private static <T> T[] copy(T[] array) { |
| if (array == null) { |
| return null; |
| } |
| if (array.length == 0) { |
| return array; |
| } |
| return Arrays.copyOf(array, array.length); |
| } |
| |
| private static int copy(int value) { |
| return value; |
| } |
| |
| private static long copy(long value) { |
| return value; |
| } |
| |
| private static boolean copy(boolean value) { |
| return value; |
| } |
| |
| private static String copy(String value) { |
| return value; |
| } |
| |
| private static Map<String, String> copyStringMap(Map<String, String> initParams) { |
| return new HashMap<String, String>(initParams); |
| } |
| |
| public static <V> Map<String, Object> copyGenericMap(Map<String, V> value) { |
| if (value == null) { |
| return null; |
| } |
| if (value.isEmpty()) { |
| return Collections.emptyMap(); |
| } |
| HashMap<String, Object> result = new HashMap<String, Object>(); |
| for (Map.Entry<String, V> entry : value.entrySet()) { |
| result.put(entry.getKey(), mapValue(entry.getValue())); |
| } |
| return result; |
| } |
| |
| public static Object mapValue(Object v) { |
| if ((v == null) |
| || v instanceof Number |
| || v instanceof Boolean |
| || v instanceof Character |
| || v instanceof String |
| || v instanceof DTO) { |
| return v; |
| } |
| if (v instanceof Map) { |
| Map<?, ?> m = (Map<?, ?>) v; |
| Map<Object, Object> map = newMap(m.size()); |
| for (Map.Entry<?, ?> e : m.entrySet()) { |
| map.put(mapValue(e.getKey()), mapValue(e.getValue())); |
| } |
| return map; |
| } |
| if (v instanceof List) { |
| List<?> c = (List<?>) v; |
| List<Object> list = newList(c.size()); |
| for (Object o : c) { |
| list.add(mapValue(o)); |
| } |
| return list; |
| } |
| if (v instanceof Set) { |
| Set<?> c = (Set<?>) v; |
| Set<Object> set = newSet(c.size()); |
| for (Object o : c) { |
| set.add(mapValue(o)); |
| } |
| return set; |
| } |
| if (v.getClass().isArray()) { |
| final int length = Array.getLength(v); |
| final Class<?> componentType = mapComponentType(v.getClass().getComponentType()); |
| Object array = Array.newInstance(componentType, length); |
| for (int i = 0; i < length; i++) { |
| Array.set(array, i, mapValue(Array.get(v, i))); |
| } |
| return array; |
| } |
| return String.valueOf(v); |
| } |
| |
| private static Class<?> mapComponentType(Class<?> componentType) { |
| if (componentType.isPrimitive() |
| || componentType.isArray() |
| || Object.class.equals(componentType) |
| || Number.class.isAssignableFrom(componentType) |
| || Boolean.class.isAssignableFrom(componentType) |
| || Character.class.isAssignableFrom(componentType) |
| || String.class.isAssignableFrom(componentType) |
| || DTO.class.isAssignableFrom(componentType)) { |
| return componentType; |
| } |
| if (Map.class.isAssignableFrom(componentType)) { |
| return Map.class; |
| } |
| if (List.class.isAssignableFrom(componentType)) { |
| return List.class; |
| } |
| if (Set.class.isAssignableFrom(componentType)) { |
| return Set.class; |
| } |
| return String.class; |
| } |
| |
| private static <E> List<E> newList(int size) { |
| return new ArrayList<E>(size); |
| } |
| |
| private static <E> Set<E> newSet(int size) { |
| return new HashSet<E>(size); |
| } |
| |
| private static <K, V> Map<K, V> newMap(int size) { |
| return new HashMap<K, V>(size); |
| } |
| } |