Subversion Repository Public Repository

litesoft

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
package org.litesoft.bo.views;

import org.litesoft.bo.*;
import org.litesoft.bo.change.*;
import org.litesoft.core.util.*;

import java.io.*;
import java.util.*;

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 );
        UtilsCommon.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( mVoMetaData.getVoAttribute( pAttributeName ) );
    }

    public final void setAttributeValue( String pAttributeName, Object pValue )
            throws NoSuchElementException, AttributeIllegalArgumentException
    {
        LLsetAttributeValue( mVoMetaData.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 )
    {
        if ( verifyMutabilityOnChange( aNewID, pNewID ) )
        {
            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 = UtilsCommon.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 boolean verifyMutabilityOnChange( String pAttributeName, Object pNewValue )
            throws UnsupportedOperationException
    {
        VoAttribute<VO> zAttribute = mVoMetaData.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

Diff revisions: vs.
Revision Author Commited Message
2 GeorgeS picture GeorgeS Sun 07 Feb, 2010 12:50:58 +0000