/* * 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 * with the License. You may obtain a copy of the License at * * 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.isis.core.metamodel.facets; import java.util.AbstractList; import java.util.AbstractSet; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import org.apache.isis.core.metamodel.adapter.ObjectAdapter; import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager; import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet; import org.apache.isis.core.metamodel.spec.ObjectSpecification; public final class CollectionUtils { private CollectionUtils() { } public static Object[] getCollectionAsObjectArray(final Object option, final ObjectSpecification spec, final AdapterManager adapterMap) { final ObjectAdapter collection = adapterMap.adapterFor(option); final CollectionFacet facet = CollectionFacet.Utils.getCollectionFacetFromSpec(collection); final Object[] optionArray = new Object[facet.size(collection)]; int j = 0; for (final ObjectAdapter nextElement : facet.iterable(collection)) { optionArray[j++] = nextElement != null? nextElement.getObject(): null; } return optionArray; } /** * Copies the iterable into the specified type. */ public static Object copyOf(final Iterable<Object> iterable, final Class<?> requiredType) { if(iterable == null) { throw new IllegalArgumentException("Iterable must be provided"); } if(requiredType == null) { throw new IllegalArgumentException("RequiredType must be provided"); } // specific list implementations if (CopyOnWriteArrayList.class == requiredType) { return Lists.newCopyOnWriteArrayList(iterable); } if (LinkedList.class == requiredType) { return Lists.newLinkedList(iterable); } if (ArrayList.class == requiredType) { return Lists.newArrayList(iterable); } if (AbstractList.class == requiredType) { return Lists.newArrayList(iterable); } // specific set implementations if (CopyOnWriteArraySet.class == requiredType) { return Sets.newCopyOnWriteArraySet(iterable); } if (LinkedHashSet.class == requiredType) { return Sets.newLinkedHashSet(iterable); } if (HashSet.class == requiredType) { return Sets.newHashSet(iterable); } if (TreeSet.class == requiredType) { Iterable rawIterable = iterable; return Sets.newTreeSet(rawIterable); } if (AbstractSet.class == requiredType) { return Sets.newLinkedHashSet(iterable); } // interfaces if (List.class == requiredType) { return Lists.newArrayList(iterable); } if (SortedSet.class == requiredType) { Iterable rawIterable = iterable; return Sets.newTreeSet(rawIterable); } if (Set.class == requiredType) { return Sets.newLinkedHashSet(iterable); } if (Collection.class == requiredType) { return Lists.newArrayList(iterable); } // array if (requiredType.isArray()) { Class<?> componentType = requiredType.getComponentType(); Iterable rawIterable = iterable; return Iterables.toArray(rawIterable, componentType); } // not recognized return null; } }