001/* 002 GRANITE DATA SERVICES 003 Copyright (C) 2011 GRANITE DATA SERVICES S.A.S. 004 005 This file is part of Granite Data Services. 006 007 Granite Data Services is free software; you can redistribute it and/or modify 008 it under the terms of the GNU Library General Public License as published by 009 the Free Software Foundation; either version 2 of the License, or (at your 010 option) any later version. 011 012 Granite Data Services is distributed in the hope that it will be useful, but 013 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 014 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License 015 for more details. 016 017 You should have received a copy of the GNU Library General Public License 018 along with this library; if not, see <http://www.gnu.org/licenses/>. 019*/ 020 021package org.granite.messaging.persistence; 022 023import java.lang.reflect.ParameterizedType; 024import java.lang.reflect.Type; 025import java.util.Comparator; 026import java.util.HashSet; 027import java.util.Set; 028import java.util.SortedSet; 029import java.util.TreeSet; 030 031import org.granite.config.GraniteConfig; 032import org.granite.context.GraniteContext; 033import org.granite.messaging.amf.io.convert.Converters; 034import org.granite.util.TypeUtil; 035 036/** 037 * @author Franck WOLFF 038 */ 039public class ExternalizablePersistentSet extends AbstractExternalizablePersistentCollection { 040 041 private static final long serialVersionUID = 1L; 042 043 public ExternalizablePersistentSet() { 044 } 045 046 public ExternalizablePersistentSet(Set<?> content, boolean initialized, boolean dirty) { 047 super(null, initialized, dirty); 048 setContentFromSet(content); 049 } 050 051 public ExternalizablePersistentSet(Object[] content, boolean initialized, boolean dirty) { 052 super(content, initialized, dirty); 053 } 054 055 public Set<?> getContentAsSet(Type target) { 056 return getContentAsSet(target, null); 057 } 058 059 @SuppressWarnings({ "unchecked", "rawtypes" }) 060 public Set<?> getContentAsSet(Type target, Comparator comparator) { 061 Set set = null; 062 if (content != null) { 063 if (SortedSet.class.isAssignableFrom(TypeUtil.classOfType(target))) { 064 if (comparator != null) 065 set = new TreeSet(comparator); 066 else 067 set = new TreeSet(); 068 } 069 else 070 set = new HashSet(content.length); 071 072 GraniteConfig config = GraniteContext.getCurrentInstance().getGraniteConfig(); 073 Converters converters = config.getConverters(); 074 Type[] typeArguments = null; 075 if (target instanceof ParameterizedType) 076 typeArguments = ((ParameterizedType)target).getActualTypeArguments(); 077 078 for (Object o : content) { 079 if (typeArguments != null) 080 set.add(converters.convert(o, typeArguments[0])); 081 else 082 set.add(o); 083 } 084 } 085 return set; 086 } 087 088 public void setContentFromSet(Set<?> set) { 089 content = (set != null ? set.toArray() : null); 090 } 091}