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 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 |
// This Source Code is in the Public Domain per: http://unlicense.org package org.litesoft.bo.views; import java.io.*; import org.litesoft.commonfoundation.typeutils.*; import java.util.*; import org.litesoft.bo.*; import org.litesoft.bo.change.*; import org.litesoft.commonfoundation.typeutils.Objects; public abstract class ViewObject<VO extends IViewObject<VO>> extends AbstractChangeTrackingObject implements IViewObject<VO>, VoNames, Comparable<VO>, Serializable { private static long sLastNewID = 0; private static synchronized long getNextNewID() { return ++sLastNewID; } private transient VoMetaData<VO> mVoMetaData; private TransactionSet mTransactionSet; private Long mNewID; private Long mRecordVersion; protected ViewObject( VoMetaData<VO> pVoMetaData ) { mVoMetaData = pVoMetaData; } protected ViewObject( VoMetaData<VO> pVoMetaData, boolean pNew, TransactionSet pTransactionSet ) { super( (pTransactionSet != null), pNew ); Objects.assertNotNull( "VoMetaData", mVoMetaData = pVoMetaData ); if ( null == (mTransactionSet = pTransactionSet) ) { if ( pNew ) { throw new IllegalStateException( "New ViewObjects MUST be in a TransactionSet" ); } } mNewID = pNew ? getNextNewID() : null; } // BoAccessor... public final BoMetaData getBoMetaData() { return mVoMetaData; } @SuppressWarnings({"unchecked"}) public final <T> T getAttributeValue( String pAttributeName ) throws NoSuchElementException { return (T) LLgetAttributeValue( getVoAttribute( pAttributeName ) ); } public final void setAttributeValue( String pAttributeName, Object pValue ) throws NoSuchElementException, AttributeIllegalArgumentException { LLsetAttributeValue( getVoAttribute( pAttributeName ), pValue ); } // IChangeTrackingObject... @Override public void initialize() { super.initialize(); if ( mTransactionSet != null ) { mTransactionSet.add( this ); } } // IViewObject... public void committed( Object pID ) { if ( isNew() ) { if ( pID == null ) { throw new IllegalStateException( "No ID for the Inserted 'Instance' for: " + toString() ); } forceSetAttributeValue( "ID", pID ); LLunNew(); } mTransactionSet = null; } public void removeExistingFromTransactionSet() { if ( isNew() ) { throw new IllegalStateException( "May NOT Remove from the TransactionSet a New: " + toString() ); } if ( mTransactionSet != null ) { mTransactionSet.remove( this ); mTransactionSet = null; } } @Override protected void LLunNew() { mCachedObjectURL = null; mNewID = null; super.LLunNew(); } public final Long getNewID() { return mNewID; } public final void setNewID( Long pNewID ) { VoAttribute<VO> zAttribute = getVoAttribute( aNewID ); if ( verifyMutabilityOnChange( zAttribute, getNewID(), pNewID = zAttribute.normalize( pNewID, true ) ) ) { mNewID = pNewID; } } public final Long getRecordVersion() { return mRecordVersion; } public final void setRecordVersion( Long pRecordVersion ) { if ( isInitialized() ) { throw new UnsupportedOperationException( "Attempt to change a RecordVersion post Initialization: " + toString() ); } mRecordVersion = pRecordVersion; } public final VoMetaData getVoMetaData() { return mVoMetaData; } public final TransactionSet getTransactionSet() { return mTransactionSet; } public final String getObjectName() { return mVoMetaData.getObjectName(); } private ObjectURL mCachedObjectURL = null; public final synchronized ObjectURL getObjectURL() { if ( mCachedObjectURL == null ) { mCachedObjectURL = new ObjectURL( getObjectName(), mVoMetaData.createObjectUniqueKey( this ), getURLxtra() ); } return mCachedObjectURL; } protected String getURLxtra() { return ""; } public String getDisplayValue() { String format = Strings.noEmpty( mVoMetaData.getDisplayValueFormat() ); if ( format == null ) { return "Display Value: " + getObjectURL(); } int from = 0; StringBuilder sb = new StringBuilder(); for ( int at; -1 != (at = format.indexOf( "${", from )); from = at + 1 ) { if ( at != from ) { sb.append( format.substring( from, at ) ); } int end = format.indexOf( '}', at + 2 ); if ( end == -1 ) { from = at; break; } String attr = format.substring( at + 2, end ); at = end; try { Object value = getAttributeValue( attr ); if ( value != null ) { sb.append( value ); } } catch ( NoSuchElementException e ) { sb.append( "${" ).append( attr ).append( '}' ); } } return sb.append( format.substring( from ) ).toString(); } /** * Copy this IViewObject into the provided Transaction Set. * * @param pTransactionSet if null may fail if 'this' is New * * @return copy of this */ public final VO copyInto( TransactionSet pTransactionSet ) throws UnsupportedOperationException { VO them = mVoMetaData.createViewObject( this.isNew(), pTransactionSet ); them.setRecordVersion( this.getRecordVersion() ); ((ViewObject) them).populateFrom( this ); them.initialize(); return them; } // Comparable... public int compareTo( VO them ) { return this.getDisplayValue().compareTo( them.getDisplayValue() ); } // Object... public final boolean equals( ViewObject pThem ) { return (this == pThem) || ((pThem != null) && this.getObjectURL().equals( pThem.getObjectURL() )); } public final boolean equals( Object o ) { return (this == o) || ((o instanceof ViewObject) && equals( (ViewObject) o )); } public final int hashCode() { return getObjectURL().hashCode(); } public final String toString() { return getDisplayValue(); } protected final VoAttribute<VO> getVoAttribute( String pAttributeName ) { return mVoMetaData.getVoAttribute( pAttributeName ); } @Deprecated protected final boolean verifyMutabilityOnChange( String pAttributeName, Object pNewValue ) throws UnsupportedOperationException { VoAttribute<VO> zAttribute = getVoAttribute( pAttributeName ); return verifyMutabilityOnChange( zAttribute, LLgetAttributeValue( zAttribute ), pNewValue ); } @SuppressWarnings({"unchecked"}) private Object LLgetAttributeValue( VoAttribute<VO> pAttribute ) { return pAttribute.getAttributeValue( (VO) this ); } @SuppressWarnings({"unchecked"}) private void LLsetAttributeValue( VoAttribute<VO> pAttribute, Object pValue ) { pAttribute.setAttributeValue( (VO) this, pValue ); } } |
Commits for litesoft/trunk/Java/core/Anywhere/src/org/litesoft/bo/views/ViewObject.java
Revision | Author | Commited | Message |
---|---|---|---|
947 Diff | GeorgeS | Fri 06 Jun, 2014 23:36:56 +0000 | Correct Spelling of package! |
939 Diff | GeorgeS | Mon 02 Jun, 2014 21:30:31 +0000 | Extracting commonfoundation |
917 Diff | GeorgeS | Sun 08 Dec, 2013 20:49:56 +0000 | 1.7 prep & VersionedStaticContentFilter upgrade to new “/ver” model! |
804 Diff | GeorgeS | Wed 15 Aug, 2012 12:48:51 +0000 | |
801 Diff | GeorgeS | Wed 15 Aug, 2012 03:59:02 +0000 | |
223 Diff | GeorgeS | Fri 20 May, 2011 19:25:35 +0000 | |
151 Diff | GeorgeS | Thu 17 Mar, 2011 04:16:22 +0000 | |
49 Diff | GeorgeS | Mon 12 Apr, 2010 02:59:10 +0000 | License Text |
2 | GeorgeS | Sun 07 Feb, 2010 12:50:58 +0000 |