001/**
002 *   GRANITE DATA SERVICES
003 *   Copyright (C) 2006-2013 GRANITE DATA SERVICES S.A.S.
004 *
005 *   This file is part of the Granite Data Services Platform.
006 *
007 *   Granite Data Services is free software; you can redistribute it and/or
008 *   modify it under the terms of the GNU Lesser General Public
009 *   License as published by the Free Software Foundation; either
010 *   version 2.1 of the License, or (at your option) any later version.
011 *
012 *   Granite Data Services is distributed in the hope that it will be useful,
013 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
014 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
015 *   General Public License for more details.
016 *
017 *   You should have received a copy of the GNU Lesser General Public
018 *   License along with this library; if not, write to the Free Software
019 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
020 *   USA, or see <http://www.gnu.org/licenses/>.
021 */
022package org.granite.messaging.persistence;
023
024import java.io.Externalizable;
025import java.io.IOException;
026import java.io.ObjectInput;
027import java.io.ObjectOutput;
028import java.util.Collection;
029
030/**
031 * @author Franck WOLFF
032 */
033public abstract class AbstractExternalizablePersistentCollection implements Externalizable {
034
035    private static final long serialVersionUID = 1L;
036    
037    private static final Object[] OBJECT_0 = new Object[0]; 
038
039    protected boolean initialized;
040    protected String metadata;
041    protected boolean dirty;
042    protected Object[] content;
043
044    public AbstractExternalizablePersistentCollection() {
045        this(OBJECT_0, true, false);
046    }
047    
048    public AbstractExternalizablePersistentCollection(Object[] content, boolean initialized, boolean dirty) {
049        this.content = content;
050        this.initialized = initialized;
051        this.dirty = dirty;
052    }
053
054        public boolean isInitialized() {
055        return initialized;
056    }
057    protected void setInitialized(boolean initialized) {
058        this.initialized = initialized;
059    }
060
061    public String getMetadata() {
062                return metadata;
063        }
064
065        public void setMetadata(String metadata) {
066                this.metadata = metadata;
067        }
068
069        public boolean isDirty() {
070        return dirty;
071    }
072    public void setDirty(boolean dirty) {
073                this.dirty = dirty;
074        }
075
076    public Object[] getContent() {
077                return content;
078        }
079        public void setContent(Object[] content) {
080                this.content = content;
081        }
082
083        public void writeExternal(ObjectOutput out) throws IOException {
084        out.writeObject(Boolean.valueOf(initialized));
085        out.writeObject(metadata);
086        if (initialized) {
087            out.writeObject(Boolean.valueOf(dirty));
088            out.writeObject(content);
089        }
090    }
091
092    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
093        initialized = ((Boolean)in.readObject()).booleanValue();
094        metadata = (String)in.readObject();
095        if (initialized) {
096            dirty = ((Boolean)in.readObject()).booleanValue();
097            
098            Object o = in.readObject();
099            if (o != null) {
100                    if (o instanceof Collection<?>)
101                        content = ((Collection<?>)o).toArray();
102                    else if (o.getClass().isArray())
103                        content = (Object[])o;
104                    else
105                        content = new Object[]{o}; // should never happened...
106            }
107        }
108    }
109}