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.io.Externalizable;
024import java.io.IOException;
025import java.io.ObjectInput;
026import java.io.ObjectOutput;
027import java.util.Collection;
028
029/**
030 * @author Franck WOLFF
031 */
032public abstract class AbstractExternalizablePersistentCollection implements Externalizable {
033
034    private static final long serialVersionUID = 1L;
035    
036    private static final Object[] OBJECT_0 = new Object[0]; 
037
038    protected boolean initialized;
039    protected String metadata;
040    protected boolean dirty;
041    protected Object[] content;
042
043    public AbstractExternalizablePersistentCollection() {
044        this(OBJECT_0, true, false);
045    }
046    
047    public AbstractExternalizablePersistentCollection(Object[] content, boolean initialized, boolean dirty) {
048        this.content = content;
049        this.initialized = initialized;
050        this.dirty = dirty;
051    }
052
053        public boolean isInitialized() {
054        return initialized;
055    }
056    protected void setInitialized(boolean initialized) {
057        this.initialized = initialized;
058    }
059
060    public String getMetadata() {
061                return metadata;
062        }
063
064        public void setMetadata(String metadata) {
065                this.metadata = metadata;
066        }
067
068        public boolean isDirty() {
069        return dirty;
070    }
071    public void setDirty(boolean dirty) {
072                this.dirty = dirty;
073        }
074
075    public Object[] getContent() {
076                return content;
077        }
078        public void setContent(Object[] content) {
079                this.content = content;
080        }
081
082        public void writeExternal(ObjectOutput out) throws IOException {
083        out.writeObject(Boolean.valueOf(initialized));
084        out.writeObject(metadata);
085        if (initialized) {
086            out.writeObject(Boolean.valueOf(dirty));
087            out.writeObject(content);
088        }
089    }
090
091    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
092        initialized = ((Boolean)in.readObject()).booleanValue();
093        metadata = (String)in.readObject();
094        if (initialized) {
095            dirty = ((Boolean)in.readObject()).booleanValue();
096            
097            Object o = in.readObject();
098            if (o != null) {
099                    if (o instanceof Collection<?>)
100                        content = ((Collection<?>)o).toArray();
101                    else if (o.getClass().isArray())
102                        content = (Object[])o;
103                    else
104                        content = new Object[]{o}; // should never happened...
105            }
106        }
107    }
108}