001: /*
002: * Copyright 2005 Joe Walker
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.directwebremoting.extend;
017:
018: import java.util.IdentityHashMap;
019: import java.util.Map;
020:
021: /**
022: * We need to keep track of stuff while we are converting on the way out to
023: * prevent recursion.
024: * This class helps track the conversion process.
025: * @author Joe Walker [joe at getahead dot ltd dot uk]
026: */
027: public final class OutboundContext {
028: /**
029: * Contexts need to know if they are producing JSON output
030: * @param jsonMode Are we producing JSON output?
031: */
032: public OutboundContext(boolean jsonMode) {
033: this .jsonMode = jsonMode;
034: }
035:
036: /**
037: * Have we already converted an object?
038: * @param object The object to check
039: * @return How it was converted last time or null if we've not seen it before
040: */
041: public OutboundVariable get(Object object) {
042: return map.get(object);
043: }
044:
045: /**
046: * @param object We have converted a new object, remember it
047: * @param ss How the object was converted
048: */
049: public void put(Object object, OutboundVariable ss) {
050: map.put(object, ss);
051: }
052:
053: /**
054: * Create a new variable name to keep everything we declare separate
055: * @return A new unique variable name
056: */
057: public String getNextVariableName() {
058: String varName = OUTBOUND_VARIABLE_PREFIX + nextVarIndex;
059: nextVarIndex++;
060:
061: return varName;
062: }
063:
064: /**
065: * Things work out if they are doubly referenced during the conversion
066: * process, and can't be sure how to create output until that phase is done.
067: * This method declares that we are done conversion, and now is a good time
068: * to calculate how to generate output
069: */
070: public void prepareForOutput() {
071: for (OutboundVariable variable : map.values()) {
072: variable.prepareAssignCode();
073: }
074:
075: for (OutboundVariable variable : map.values()) {
076: variable.prepareBuildDeclareCodes();
077: }
078: }
079:
080: /**
081: * @return Are we in JSON mode where everything is inline?
082: */
083: public boolean isJsonMode() {
084: return jsonMode;
085: }
086:
087: /* (non-Javadoc)
088: * @see java.lang.Object#toString()
089: */
090: @Override
091: public String toString() {
092: return map.toString();
093: }
094:
095: /**
096: * The prefix for outbound variable names the we generate
097: */
098: private static final String OUTBOUND_VARIABLE_PREFIX = "s";
099:
100: /**
101: * The map of objects to how we converted them last time
102: */
103: private final Map<Object, OutboundVariable> map = new IdentityHashMap<Object, OutboundVariable>();
104:
105: /**
106: * What index do we tack on the next variable name that we generate
107: */
108: private int nextVarIndex = 0;
109:
110: /**
111: * Are we in JSON mode where everything is inline?
112: */
113: private boolean jsonMode = true;
114: }
|