KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > tapestry > record > PersistentPropertyData


1 // Copyright 2005 The Apache Software Foundation
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
// http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14

15 package org.apache.tapestry.record;
16
17 import java.util.ArrayList JavaDoc;
18 import java.util.HashMap JavaDoc;
19 import java.util.Iterator JavaDoc;
20 import java.util.List JavaDoc;
21 import java.util.Map JavaDoc;
22
23 import org.apache.hivemind.util.Defense;
24
25 /**
26  * Stores persistent property changes concerning a single page. The data may be stored as an encoded
27  * string and the PPD can turn between encoded and object form.
28  *
29  * @author Howard M. Lewis Ship
30  * @since 4.0
31  */

32 public class PersistentPropertyData
33 {
34     /**
35      * Keyed on {@link org.apache.tapestry.record.ChangeKey}, values are new objects.
36      */

37
38     private Map JavaDoc _changes;
39
40     private String JavaDoc _encoded;
41
42     private final PersistentPropertyDataEncoder _encoder;
43
44     /**
45      * Creates a new data using the specified encoder. The set of page changes is initially empty.
46      */

47
48     public PersistentPropertyData(PersistentPropertyDataEncoder encoder)
49     {
50         Defense.notNull(encoder, "encoder");
51
52         _encoder = encoder;
53         _changes = new HashMap JavaDoc();
54     }
55
56     public String JavaDoc getEncoded()
57     {
58         if (_encoded == null)
59             _encoded = encode();
60
61         return _encoded;
62     }
63
64     public List JavaDoc getPageChanges()
65     {
66         if (_changes == null)
67         {
68             List JavaDoc pageChanges = _encoder.decodePageChanges(_encoded);
69
70             _changes = decode(pageChanges);
71
72             return pageChanges;
73         }
74
75         return createPageChangeList();
76     }
77
78     public void store(String JavaDoc componentPath, String JavaDoc propertyName, Object JavaDoc newValue)
79     {
80         Defense.notNull(propertyName, "propertyName");
81
82         if (_changes == null)
83             _changes = decode(_encoder.decodePageChanges(_encoded));
84
85         ChangeKey key = new ChangeKey(componentPath, propertyName);
86
87         _changes.put(key, newValue);
88
89         // With the new (or changed) value, the encoded string is no
90
// longer valid.
91

92         _encoded = null;
93     }
94
95     public void storeEncoded(String JavaDoc encoded)
96     {
97         Defense.notNull(encoded, "encoded");
98
99         _encoded = encoded;
100
101         // The decoded data is no longer valid now.
102

103         _changes = null;
104     }
105
106     private List JavaDoc createPageChangeList()
107     {
108         List JavaDoc result = new ArrayList JavaDoc();
109
110         Iterator JavaDoc i = _changes.entrySet().iterator();
111
112         while (i.hasNext())
113         {
114             Map.Entry JavaDoc me = (Map.Entry JavaDoc) i.next();
115
116             ChangeKey changeKey = (ChangeKey) me.getKey();
117             Object JavaDoc value = me.getValue();
118
119             PropertyChange change = new PropertyChangeImpl(changeKey.getComponentPath(), changeKey
120                     .getPropertyName(), value);
121             
122             result.add(change);
123         }
124
125         return result;
126     }
127
128     private String JavaDoc encode()
129     {
130         List JavaDoc changes = createPageChangeList();
131
132         return _encoder.encodePageChanges(changes);
133     }
134
135     private Map JavaDoc decode(List JavaDoc pageChanges)
136     {
137         Map JavaDoc result = new HashMap JavaDoc();
138
139         Iterator JavaDoc i = pageChanges.iterator();
140         while (i.hasNext())
141         {
142             PropertyChange pc = (PropertyChange) i.next();
143
144             String JavaDoc propertyName = pc.getPropertyName();
145             String JavaDoc componentPath = pc.getComponentPath();
146
147             ChangeKey key = new ChangeKey(componentPath, propertyName);
148
149             result.put(key, pc.getNewValue());
150         }
151
152         return result;
153     }
154 }
Popular Tags