001package co.codewizards.cloudstore.ls.core.invoke;
002
003import static java.util.Objects.*;
004
005import java.io.IOException;
006import java.io.ObjectInputStream;
007import java.io.ObjectOutputStream;
008import java.io.ObjectStreamException;
009import java.io.Serializable;
010import java.util.Collections;
011import java.util.IdentityHashMap;
012import java.util.Map;
013
014import co.codewizards.cloudstore.core.ls.NoObjectRef;
015
016public class ObjectGraphContainer implements Serializable {
017        private static final long serialVersionUID = 1L;
018
019        private Object root;
020
021        @NoObjectRef(inheritToObjectGraphChildren = false)
022        private IdentityHashMap<Object, ForceNonTransientContainer> transientFieldOwnerObject2ForceNonTransientContainer = new IdentityHashMap<Object, ForceNonTransientContainer>();
023
024        public ObjectGraphContainer(final Object root) {
025                this.root = requireNonNull(root, "root");
026        }
027
028        public Object getRoot() {
029                return root;
030        }
031
032        public void putForceNonTransientContainer(final ForceNonTransientContainer forceNonTransientContainer) {
033                requireNonNull(forceNonTransientContainer, "forceNonTransientContainer");
034                transientFieldOwnerObject2ForceNonTransientContainer.put(forceNonTransientContainer.getTransientFieldOwnerObject(), forceNonTransientContainer);
035        }
036
037        private void writeObject(ObjectOutputStream out) throws IOException {
038                out.writeObject(root);
039                out.writeObject(transientFieldOwnerObject2ForceNonTransientContainer);
040        }
041
042        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
043                root = in.readObject();
044
045                @SuppressWarnings("unchecked")
046                final IdentityHashMap<Object, ForceNonTransientContainer> m = (IdentityHashMap<Object, ForceNonTransientContainer>) in.readObject();
047                transientFieldOwnerObject2ForceNonTransientContainer = m;
048        }
049
050        @SuppressWarnings("unused") // seems, Eclipse does not (yet) know this (new?!) serialization method
051        private void readObjectNoData() throws ObjectStreamException {
052                throw new UnsupportedOperationException("WTF?!");
053        }
054
055        public Map<Object, ForceNonTransientContainer> getTransientFieldOwnerObject2ForceNonTransientContainer() {
056                return Collections.unmodifiableMap(transientFieldOwnerObject2ForceNonTransientContainer);
057        }
058}