/*
 * JBoss, Home of Professional Open Source.
 * Copyright 2016, Red Hat, Inc., and individual contributors
 * as indicated by the @author tags. See the copyright.txt file in the
 * distribution for a full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */

package org.wildfly.clustering.marshalling.spi.util;

import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Collection;
import java.util.function.Function;

import org.wildfly.clustering.marshalling.Externalizer;

/**
 * @author Paul Ferraro
 */
public class SingletonCollectionExternalizer<T extends Collection<Object>> implements Externalizer<T> {

    private final Function<Object, T> factory;

    public SingletonCollectionExternalizer(Function<Object, T> factory) {
        this.factory = factory;
    }

    @Override
    public void writeObject(ObjectOutput output, T collection) throws IOException {
        output.writeObject(collection.iterator().next());
    }

    @Override
    public T readObject(ObjectInput input) throws IOException, ClassNotFoundException {
        return this.factory.apply(input.readObject());
    }

    @SuppressWarnings("unchecked")
    @Override
    public Class<T> getTargetClass() {
        return (Class<T>) this.factory.apply(null).getClass();
    }
}

@@ -1075,93 +1075,8 @@
 l;%0A%0A
-import java.io.IOException;%0Aimport java.io.ObjectInput;%0Aimport java.io.ObjectOutput;%0A
 impo
@@ -1179,16 +1179,26 @@
 halling.
+spi.Object
 External
@@ -1208,16 +1208,59 @@
 r;%0A%0A/**%0A
+ * Externalizer for singleton collections.%0A
  * @auth
@@ -1358,19 +1358,22 @@
 t%3E%3E 
-implement
+extend
 s 
+Object
 Exte
@@ -1395,51 +1395,38 @@
     
-private final Function%3CObject, T%3E factory;%0A
+@SuppressWarnings(%22unchecked%22)
 %0A   
@@ -1508,202 +1508,192 @@
     
-this.factory = factory;%0A    %7D%0A%0A    @Override%0A    public void writeObject(ObjectOutput output, T collection) throws IOException %7B%0A        output.writeObject(collection.iterator().next());
+super((Class%3CT%3E) factory.apply(null).getClass(), factory, new Accessor%3C%3E());%0A    %7D%0A%0A    public static class Accessor%3CT extends Collection%3CObject%3E%3E implements Function%3CT, Object%3E %7B
 %0A    
-%7D%0A%0A
     
@@ -1694,32 +1694,36 @@
       @Override%0A
+    
     public T rea
@@ -1721,85 +1721,41 @@
 lic 
-T readObject(ObjectInput input) throws IOException, ClassNotFoundExcep
+Object apply(T collec
 tion
+)
  %7B%0A
+    
     
@@ -1769,205 +1769,47 @@
 urn 
-this.factory.apply(input.readObject());%0A    %7D%0A%0A    @SuppressWarnings(%22unchecked%22)%0A    @Override%0A    public Class%3CT%3E getTargetClass() %7B%0A        return (Class%3CT%3E) this.factory.apply(null).getClass();
+collection.iterator().next();%0A        %7D
 %0A   

Reimplement using ObjectExternalizer.