001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026: package com.sun.perseus.model;
027:
028: import java.util.Vector;
029:
030: /**
031: * An <code>SyncBaseCondition</code> generates a <code>TimeInstance</code>
032: * everytime the SyncBase <code>TimedElementSupport</code> generates a new
033: * interval (i.e., each time its <code>newInterval</code> method is
034: * called by the <code>TypedElement</code>. A <code>SyncBaseCondition</code>
035: * is a time dependent of it's sync base <code>TimedElementSupport</code>
036: *
037: * @version $Id: SyncBaseCondition.java,v 1.3 2006/04/21 06:39:09 st125089 Exp $
038: */
039: public final class SyncBaseCondition extends TimeCondition implements
040: TimeDependent, IDRef {
041: /**
042: * The SyncBase identifier
043: */
044: String syncBaseId;
045:
046: /**
047: * SyncBase <code>TimedElementSupport</code>
048: */
049: TimedElementSupport syncBase;
050:
051: /**
052: * True if this condition is on the syncBase's begin.
053: */
054: boolean isBeginSync;
055:
056: /**
057: * Offset from the synch base
058: */
059: long offset;
060:
061: /**
062: * @param timedElementNode the associated <code>TimedElementNode</code>.
063: * Should not be null.
064: * @param isBegin defines whether this condition is for a begin list.
065: * @param syncBaseId identifier of the <code>TimedElementSupport</code> this
066: * condition is synchronized on. Should not be null.
067: * @param isBeginSync true if this condition is on the syncBase's begin
068: * condition. False if this condition is on the
069: * syncBase's end condition.
070: * @param offset offset from the sync base. This means that time instances
071: * synchronized on the syncBase begin or end time are offset by
072: * this amount.
073: */
074: public SyncBaseCondition(final TimedElementNode timedElementNode,
075: final boolean isBegin, final String syncBaseId,
076: final boolean isBeginSync, final long offset) {
077: super (timedElementNode.timedElementSupport, isBegin);
078:
079: if (syncBaseId == null) {
080: throw new NullPointerException();
081: }
082:
083: this .syncBaseId = syncBaseId;
084: this .isBeginSync = isBeginSync;
085: this .offset = offset;
086:
087: timedElementNode.ownerDocument.resolveIDRef(this , syncBaseId);
088: }
089:
090: /**
091: * <code>IDRef</code> implementation.
092: *
093: * @param ref the resolved reference (mapped from the syncBase
094: * id passed to the constructor.
095: */
096: public void resolveTo(final ElementNode ref) {
097: if (!(ref instanceof TimedElementNode)) {
098: // The condition is synchronized on an element which does
099: // not have timing. Do nothing, this is _not_ an error.
100: return;
101: }
102:
103: syncBase = ((TimedElementNode) ref).timedElementSupport;
104:
105: if (isBeginSync) {
106: if (syncBase.beginDependents == null) {
107: syncBase.beginDependents = new Vector(1);
108: }
109: syncBase.beginDependents.addElement(this );
110: } else {
111: if (syncBase.endDependents == null) {
112: syncBase.endDependents = new Vector(1);
113: }
114: syncBase.endDependents.addElement(this );
115: }
116: }
117:
118: /**
119: * Called by the associated sync base when it creates a new
120: * current <code>TimeInterval</code>. Whenever this happens, a
121: * new IntervalTimeInstance is added for the sync base's begin or end
122: * interval time (depending on isBeginSync), to the timedElement's
123: * begin or end instance list (depending on isBegin).
124: *
125: * @param syncBase the element which just generated a new interval.
126: */
127: public void onNewInterval(final TimedElementSupport syncBase) {
128: // IntervalTimeInstances are _not_ cleared on reset
129: new IntervalTimeInstance(timedElement, syncBase, offset, false,
130: isBegin, isBeginSync);
131: }
132:
133: /**
134: * Converts this <code>SyncBaseCondition</code> to a String trait.
135: *
136: * @return a string describing this <code>TimeCondition</code>
137: */
138: protected String toStringTrait() {
139: StringBuffer sb = new StringBuffer();
140: sb.append(syncBaseId);
141: sb.append('.');
142: if (isBeginSync) {
143: sb.append("begin");
144: } else {
145: sb.append("end");
146: }
147:
148: if (offset != 0) {
149: if (offset > 0) {
150: sb.append('+');
151: }
152: sb.append(offset / 1000f);
153: sb.append('s');
154: }
155:
156: return sb.toString();
157: }
158:
159: }
|