blob: 5667c9f06a5048bcb33caba0943ae0c59eafb99d [file] [log] [blame]
/*******************************************************************************
* 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);
}
}