litesoft
@ 947
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
// This Source Code is in the Public Domain per: http://unlicense.org package org.litesoft.aokeyhole.objects.support; import java.util.*; public class MetaDataOwnerManager<Owner extends MetaDataOwner,Owned extends AbstractNamedMetaData<Owner>> { private Owner mOurOwner; private Map<String, Owned> mOwned = new HashMap<String, Owned>(); private Owned mUnNamed = null; public MetaDataOwnerManager( Owner pOurOwner ) { mOurOwner = pOurOwner; } public int getOwnedCount() { return mOwned.size(); } public void add( Owned pToBeOwned ) { // System.out.println( "" + this + ".add: " + pToBeOwned ); String name = pToBeOwned.getName(); if ( name == null ) { mUnNamed = pToBeOwned; } else { Object prev = mOwned.put( name, pToBeOwned ); if ( prev != null ) { throw new IllegalStateException( "add w/ dup name: " + name ); } } pToBeOwned.setOwner( mOurOwner ); } public boolean remove( Owned pCurrentlyOwned ) { // System.out.println( "" + this + ".remove: " + pCurrentlyOwned ); String name = pCurrentlyOwned.getName(); if ( name == null ) { throw new IllegalStateException( "remove w/ No name" ); } Object prev = mOwned.remove( name ); if ( prev == null ) { return false; } if ( prev != pCurrentlyOwned ) { throw new IllegalStateException( "remove '" + pCurrentlyOwned + "', but removed dup: " + prev ); } pCurrentlyOwned.setOwner( null ); mOurOwner.changed(); return true; } public boolean isUsedOwnedName( String pNewName ) { return mOwned.containsKey( pNewName ); } public void reKey( Owned pOwnedToBeReKeyed, String pNewName ) { if ( mOurOwner != pOwnedToBeReKeyed.getOwner() ) { throw new IllegalStateException( "reKey Failed not properly Owned" ); } String pOldName = pOwnedToBeReKeyed.getName(); if ( pOldName == null ) { if ( pOwnedToBeReKeyed != mUnNamed ) { throw new IllegalStateException( "reKey Failed from UnNamed" ); } } else { Object curO = mOwned.remove( pOldName ); if ( curO != pOwnedToBeReKeyed ) { throw new IllegalStateException( "reKey Failed from: " + pOldName ); } } Object newO = mOwned.put( pNewName, pOwnedToBeReKeyed ); if ( newO != null ) { throw new IllegalStateException( "reKey Failed to: " + pNewName ); } mOurOwner.changed(); } public Collection<Owned> getEntries() { return mOwned.values(); } public Owned getEntry( String pName ) { return (pName == null) ? mUnNamed : mOwned.get( pName ); } public boolean available( String pName ) { return !mOwned.containsKey( pName ); } /** * @return null or Error */ public String validatePersistable() { for ( Owned md : getEntries() ) { String error = md.validatePersistable(); if ( error != null ) { return error; } } return null; } public void setRehydrated() { for ( Owned md : getEntries() ) { md.setRehydrated(); } } public void clearChangeIndicators() { for ( Owned md : getEntries() ) { md.clearChangeIndicators(); } } @Override public String toString() { return mOurOwner.toString(); } } |