001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: * $Header:$
018: */
019: package org.apache.beehive.netui.pageflow.internal;
020:
021: import org.apache.beehive.netui.pageflow.PageFlowManagedObject;
022: import org.apache.beehive.netui.pageflow.internal.annotationreader.ProcessedAnnotation;
023: import org.apache.beehive.netui.util.logging.Logger;
024:
025: import java.lang.reflect.Field;
026: import java.lang.reflect.Modifier;
027: import java.util.ArrayList;
028: import java.util.HashSet;
029: import java.util.List;
030:
031: public class CachedSharedFlowRefInfo {
032: private static final Logger LOG = Logger
033: .getInstance(CachedSharedFlowRefInfo.class);
034:
035: public static class SharedFlowFieldInfo {
036: public Field field;
037: public String sharedFlowName;
038: }
039:
040: /**
041: * The SharedFlowController-initialized member fields -- may or may not be present.
042: */
043: private SharedFlowFieldInfo[] _sharedFlowMemberFields;
044:
045: protected void initSharedFlowFields(AnnotationReader annReader,
046: Class clazz) {
047: if (annReader == null) {
048: LOG
049: .error("Null AnnotationReader for checking shared flow ref annotations");
050: return;
051: }
052: if (clazz == null) {
053: LOG
054: .error("Null class for checking shared flow ref annotations");
055: return;
056: }
057:
058: //
059: // Go through this class and all superclasses, looking for shared fields.
060: // Make sure that a superclass control field never replaces a subclass
061: // control field (this is what the 'fieldNames' HashSet is for).
062: // Note that the annnotation reader doesn't change per-class.
063: // Inherited annotated elements are all read.
064: //
065: HashSet fieldNames = new HashSet();
066: List/*< SharedFlowFieldInfo >*/sharedFlowFields = null;
067: do {
068: Field[] fields = clazz.getDeclaredFields();
069: for (int i = 0; i < fields.length; i++) {
070: Field field = fields[i];
071: String fieldName = field.getName();
072: ProcessedAnnotation sharedFlowFieldAnn = annReader
073: .getJpfAnnotation(field, "SharedFlowField");
074: if (!fieldNames.contains(fieldName)) {
075: if (sharedFlowFieldAnn != null) {
076: if (!Modifier.isPublic(field.getModifiers())) {
077: field.setAccessible(true);
078: }
079: if (sharedFlowFields == null) {
080: sharedFlowFields = new ArrayList/*< SharedFlowFieldInfo >*/();
081: }
082: SharedFlowFieldInfo info = new SharedFlowFieldInfo();
083: info.field = field;
084: info.sharedFlowName = AnnotationReader
085: .getStringAttribute(sharedFlowFieldAnn,
086: "name");
087: sharedFlowFields.add(info);
088: fieldNames.add(fieldName);
089: } else if (field.getName().equals(
090: InternalConstants.GLOBALAPP_MEMBER_NAME)) {
091: // Legacy behavior: initialize a field called 'globalApp' with the Global.app instance.
092: if (!Modifier.isPublic(field.getModifiers())) {
093: field.setAccessible(true);
094: }
095: if (sharedFlowFields == null) {
096: sharedFlowFields = new ArrayList/*< SharedFlowFieldInfo >*/();
097: }
098: SharedFlowFieldInfo info = new SharedFlowFieldInfo();
099: info.field = field;
100: info.sharedFlowName = null;
101: sharedFlowFields.add(info);
102: fieldNames.add(fieldName);
103: }
104: }
105: }
106: clazz = clazz.getSuperclass();
107: } while (clazz != null
108: && !PageFlowManagedObject.class.equals(clazz)
109: && PageFlowManagedObject.class.isAssignableFrom(clazz));
110:
111: if (sharedFlowFields != null) {
112: _sharedFlowMemberFields = (SharedFlowFieldInfo[]) sharedFlowFields
113: .toArray(new SharedFlowFieldInfo[sharedFlowFields
114: .size()]);
115: }
116: }
117:
118: public SharedFlowFieldInfo[] getSharedFlowMemberFields() {
119: return _sharedFlowMemberFields;
120: }
121: }
|