KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > tapestry > enhance > AbstractPropertyWorker


1 // Copyright 2004, 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.enhance;
16
17 import java.util.Iterator JavaDoc;
18
19 import org.apache.hivemind.ErrorLog;
20 import org.apache.tapestry.IComponent;
21 import org.apache.tapestry.event.PageDetachListener;
22 import org.apache.tapestry.spec.IComponentSpecification;
23
24 /**
25  * No, this class isn't abstract ... this worker locates abstract properties in the base component
26  * class and provides a concrete implementation for them in the enhanced class.
27  *
28  * @author Howard M. Lewis Ship
29  * @since 4.0
30  */

31 public class AbstractPropertyWorker implements EnhancementWorker
32 {
33     private ErrorLog _errorLog;
34
35     public void performEnhancement(EnhancementOperation op, IComponentSpecification spec)
36     {
37         Iterator JavaDoc i = op.findUnclaimedAbstractProperties().iterator();
38
39         while (i.hasNext())
40         {
41             String JavaDoc name = (String JavaDoc) i.next();
42
43             try
44             {
45                 createProperty(op, name);
46             }
47             catch (Exception JavaDoc ex)
48             {
49                 _errorLog.error(
50                         EnhanceMessages.errorAddingProperty(name, op.getBaseClass(), ex),
51                         spec.getLocation(),
52                         ex);
53             }
54         }
55     }
56
57     private void createProperty(EnhancementOperation op, String JavaDoc name)
58     {
59         // This won't be null because its always for existing properties.
60

61         Class JavaDoc propertyType = op.getPropertyType(name);
62
63         String JavaDoc fieldName = "_$" + name;
64         String JavaDoc defaultFieldName = fieldName + "$defaultValue";
65
66         op.addField(fieldName, propertyType);
67         op.addField(defaultFieldName, propertyType);
68
69         EnhanceUtils.createSimpleAccessor(op, fieldName, name, propertyType);
70         EnhanceUtils.createSimpleMutator(op, fieldName, name, propertyType);
71
72         // Copy the real attribute into the default attribute inside finish load
73
// (allowing a default value to be set inside finishLoad()).
74

75         op.extendMethodImplementation(
76                 IComponent.class,
77                 EnhanceUtils.FINISH_LOAD_SIGNATURE,
78                 defaultFieldName + " = " + fieldName + ";");
79
80         // On page detach, restore the attribute to its default value.
81

82         op.extendMethodImplementation(
83                 PageDetachListener.class,
84                 EnhanceUtils.PAGE_DETACHED_SIGNATURE,
85                 fieldName + " = " + defaultFieldName + ";");
86
87         // This is not all that necessary, but is proper.
88

89         op.claimProperty(name);
90     }
91
92     public void setErrorLog(ErrorLog errorLog)
93     {
94         _errorLog = errorLog;
95     }
96 }
Popular Tags