/******************************************************************************* * Copyright (c) 2012-2013 EclipseSource Muenchen GmbH 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: * Otto von Wesendonk, Edgar Mueller - initial API and implementation ******************************************************************************/ package org.eclipse.emf.emfstore.internal.common; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.eclipse.emf.emfstore.internal.common.api.APIDelegate; import org.eclipse.emf.emfstore.internal.common.api.InternalAPIDelegator; /** * Convenience class for mapping internal and external types contained in lists onto each other. * * @author ovonwesen * @author emueller * @author eneufeld */ public final class APIUtil { private APIUtil() { } /** * Copies the given list. * * @param toCopy * the list to be copied * @return the copied list * * @param <T> the type of the instances the list is holding */ public static <T> List<T> copy(List<T> toCopy) { if (toCopy == null) { return null; } final ArrayList<T> result = new ArrayList<T>(toCopy.size()); for (final T element : toCopy) { result.add(element); } return result; } /** * Maps a list of a given API type to its internal API counterpart by copying and mapping the entities. * * @param toCopy * the list to be copied and mapped to the internal API type * @return the copied list with its elements mapped to their internal API type * * @param <INT> the internal API mapping to an API implementation class * @param <API> the type of the API interface * @param <IMPL> the type of the API implementation class */ public static <IMPL extends InternalAPIDelegator<API, INT>, INT extends APIDelegate<API>, API> List<INT> toInternal(List<API> toCopy) { if (toCopy == null) { return null; } final ArrayList<INT> result = new ArrayList<INT>(toCopy.size()); for (final API element : toCopy) { @SuppressWarnings("unchecked") final IMPL i = (IMPL) element; result.add(i.toInternalAPI()); } return result; } /** * Maps a list of a given internal API type to its external API counterpart by copying and mapping the entities. * * @param cls * the desired internal API type * @param toCopy * the list to be copied and mapped to the external API type * @return the copied list with its elements mapped to their external API type * * @param <DESIRED> the internal API type * @param <INT> the internal API mapping to an API implementation class * @param <API> the type of the API interface * @param <IMPL> the type of the API implementation class */ public static <IMPL extends InternalAPIDelegator<API, INT>, INT extends APIDelegate<API>, API, DESIRED> List<INT> toInternal(Class<DESIRED> cls, List<API> toCopy) { if (toCopy == null) { return null; } final ArrayList<INT> result = new ArrayList<INT>(toCopy.size()); for (final API element : toCopy) { @SuppressWarnings("unchecked") final IMPL i = (IMPL) element; result.add(i.toInternalAPI()); } return result; } /** * Maps a list of a given internal API type to its external API counterpart by copying and mapping the entities. * * @param toCopy * the list to be copied and mapped to the external API type * @return the copied list with its elements mapped to their external API type * * @param <INT> the internal API mapping to an API implementation class * @param <API> the type of the API interface * @param <IMPL> the type of the API implementation class */ public static <IMPL extends InternalAPIDelegator<API, INT>, INT extends APIDelegate<API>, API> List<API> toExternal(List<INT> toCopy) { if (toCopy == null) { return null; } final ArrayList<API> result = new ArrayList<API>(toCopy.size()); for (final INT element : toCopy) { result.add(element.toAPI()); } return result; } /** * Maps a set of a given internal API type to its external API counterpart by copying and mapping the entities. * * @param toCopy * the set to be copied and mapped to the external API type * @return the copied set with its elements mapped to their external API type * * @param <INT> the internal API mapping to an API implementation class * @param <API> the type of the API interface * @param <IMPL> the type of the API implementation class */ public static <IMPL extends InternalAPIDelegator<API, INT>, INT extends APIDelegate<API>, API> Set<API> toExternal(Set<INT> toCopy) { if (toCopy == null) { return null; } final LinkedHashSet<API> result = new LinkedHashSet<API>(toCopy.size()); for (final INT element : toCopy) { result.add(element.toAPI()); } return result; } /** * Maps a list of a given internal type to its corresponding API type by copying it. * * @param apiClass * the desired API type * @param toCopy * the list to be copied * @return the copied list with its elements mapped to their API type * * @param <T> the internal API mapping to an API implementation class * @param <V> the type of the API interface * @param <U> the type of the API implementation class */ // e.g. // T = Usersession // U = ESUsersessionImpl // V = ESUsersession public static <T extends APIDelegate<U>, V, U extends V> List<V> mapToAPI(Class<V> apiClass, List<T> toCopy) { if (toCopy == null) { return null; } final ArrayList<V> result = new ArrayList<V>(toCopy.size()); for (final T element : toCopy) { result.add(element.toAPI()); } return result; } /** * Maps a list of a given external API type to its corresponding internal type by copying it. * * @param apiClass * the desired API type * @param toCopy * the list to be copied * @return the copied list with its elements mapped to their API type * * @param <T> the internal API mapping to an API implementation class * @param <V> the type of the API interface * @param <U> the type of the API implementation class */ // e.g. // T = Usersession // U = ESUsersessionImpl // V = ESUsersession @SuppressWarnings("unchecked") public static <V, U extends InternalAPIDelegator<U, T>, T extends APIDelegate<U>> List<T> mapToInternalAPI( Class<T> apiClass, List<V> toCopy) { if (toCopy == null) { return null; } final ArrayList<T> result = new ArrayList<T>(toCopy.size()); for (final V element : toCopy) { result.add(((U) element).toInternalAPI()); } return result; } /** * Maps a set of a given API type to its internal API counterpart by copying and mapping the entities. * * @param toCopy * the set to be copied and mapped to the internal API type * @return the copied set with its elements mapped to their internal API type * * @param <INT> the internal API mapping to an API implementation class * @param <API> the type of the API interface * @param <IMPL> the type of the API implementation class */ public static <IMPL extends InternalAPIDelegator<API, INT>, INT extends APIDelegate<API>, API> Set<INT> toInternal(Set<API> toCopy) { if (toCopy == null) { return null; } final Set<INT> result = new LinkedHashSet<INT>(toCopy.size()); for (final API element : toCopy) { @SuppressWarnings("unchecked") final IMPL i = (IMPL) element; result.add(i.toInternalAPI()); } return result; } /** * Maps an given API type to its internal API counterpart. * * @param apiClass * the desired API type * @param element * the type to be mapped * @return the internal API type * * @param <T> the internal API mapping to an API implementation class * @param <V> the type of the API interface * @param <U> the type of the API implementation class */ @SuppressWarnings("unchecked") public static <V, U extends InternalAPIDelegator<U, T>, T extends APIDelegate<U>> T toInternal( Class<T> apiClass, V element) { if (element == null) { return null; } return ((U) element).toInternalAPI(); } }