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}