001: /*
002: * $Id: ScriptCopier.java,v 1.2 2002/02/15 23:44:28 skavish Exp $
003: *
004: * ===========================================================================
005: *
006: * The JGenerator Software License, Version 1.0
007: *
008: * Copyright (c) 2000 Dmitry Skavish (skavish@usa.net). All rights reserved.
009: *
010: * Redistribution and use in source and binary forms, with or without
011: * modification, are permitted provided that the following conditions are met:
012: *
013: * 1. Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * 2. Redistributions in binary form must reproduce the above copyright
017: * notice, this list of conditions and the following disclaimer in
018: * the documentation and/or other materials provided with the
019: * distribution.
020: *
021: * 3. The end-user documentation included with the redistribution, if
022: * any, must include the following acknowlegement:
023: * "This product includes software developed by Dmitry Skavish
024: * (skavish@usa.net, http://www.flashgap.com/)."
025: * Alternately, this acknowlegement may appear in the software itself,
026: * if and wherever such third-party acknowlegements normally appear.
027: *
028: * 4. The name "The JGenerator" must not be used to endorse or promote
029: * products derived from this software without prior written permission.
030: * For written permission, please contact skavish@usa.net.
031: *
032: * 5. Products derived from this software may not be called "The JGenerator"
033: * nor may "The JGenerator" appear in their names without prior written
034: * permission of Dmitry Skavish.
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL DMITRY SKAVISH OR THE OTHER
040: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: *
049: */
050:
051: package org.openlaszlo.iv.flash.util;
052:
053: import java.io.*;
054: import java.util.*;
055: import org.openlaszlo.iv.flash.api.*;
056:
057: /**
058: * This class helps in copying of flash objects.
059: * <P>
060: * It remembers all copied objects and makes sure
061: * that an object will not be copied twice.
062: * All flash objects can be constant or not. Constant object is such
063: * an object which is invariant to generator processing, for example if an
064: * object represents some text and this text does not contain generator
065: * variable, then this object is constant, otherwise it is considered
066: * to be non-constant.<BR>
067: * So when an object is to be copied it's checked whether it's a constant
068: * or not. If the object is constant it's not copied, but rather it's reference
069: * is used. If the object is not a constant then it is copied using the same guidelines,
070: * i.e. if the object contains non-constant object, they will not be copied.
071: *
072: * @author Dmitry Skavish
073: */
074: public final class ScriptCopier {
075:
076: private Hashtable hashTable = new Hashtable();
077:
078: public ScriptCopier() {
079: }
080:
081: /**
082: * Copies the specified object.
083: * <P>
084: * Returns copy of the specified object or the object itself
085: * depending on whether the object is constant or not.
086: * Objects are not copied twice, i.e. all copied objects are
087: * remembered and on second request "remembered" object will be
088: * returned.
089: *
090: * @param def object to be copied
091: * @return the object's copy
092: */
093: public FlashDef copy(FlashDef def) {
094: if (def == null)
095: return null;
096: if (def.isConstant())
097: return def;
098: FlashDef myDef = (FlashDef) hashTable.get(def);
099: if (myDef != null)
100: return myDef;
101: myDef = (FlashDef) def.getCopy(this );
102: hashTable.put(def, myDef);
103: return myDef;
104: }
105:
106: /**
107: * Returns remembered copy of this object or null.
108: *
109: * @param def object remembered copy of which is requested
110: * @return remembered copy of the object or null
111: */
112: public FlashDef get(FlashDef def) {
113: if (def == null)
114: return null;
115: FlashDef myDef = (FlashDef) hashTable.get(def);
116: if (myDef == null)
117: return def;
118: return myDef;
119: }
120:
121: }
|