/* * $RCSfile: SyncBaseCondition.java,v $ * * Copyright 1990-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */ package com.sun.perseus.model; import java.util.Vector; /** * An <code>SyncBaseCondition</code> generates a <code>TimeInstance</code> * everytime the SyncBase <code>TimedElementSupport</code> generates a new * interval (i.e., each time its <code>newInterval</code> method is * called by the <code>TypedElement</code>. A <code>SyncBaseCondition</code> * is a time dependent of it's sync base <code>TimedElementSupport</code> * * @version $Id: SyncBaseCondition.java,v 1.3 2006/04/21 06:39:09 st125089 Exp $ */ public final class SyncBaseCondition extends TimeCondition implements TimeDependent, IDRef { /** * The SyncBase identifier */ String syncBaseId; /** * SyncBase <code>TimedElementSupport</code> */ TimedElementSupport syncBase; /** * True if this condition is on the syncBase's begin. */ boolean isBeginSync; /** * Offset from the synch base */ long offset; /** * @param timedElementNode the associated <code>TimedElementNode</code>. * Should not be null. * @param isBegin defines whether this condition is for a begin list. * @param syncBaseId identifier of the <code>TimedElementSupport</code> this * condition is synchronized on. Should not be null. * @param isBeginSync true if this condition is on the syncBase's begin * condition. False if this condition is on the * syncBase's end condition. * @param offset offset from the sync base. This means that time instances * synchronized on the syncBase begin or end time are offset by * this amount. */ public SyncBaseCondition(final TimedElementNode timedElementNode, final boolean isBegin, final String syncBaseId, final boolean isBeginSync, final long offset) { super(timedElementNode.timedElementSupport, isBegin); if (syncBaseId == null) { throw new NullPointerException(); } this.syncBaseId = syncBaseId; this.isBeginSync = isBeginSync; this.offset = offset; timedElementNode.ownerDocument.resolveIDRef(this, syncBaseId); } /** * <code>IDRef</code> implementation. * * @param ref the resolved reference (mapped from the syncBase * id passed to the constructor. */ public void resolveTo(final ElementNode ref) { if (!(ref instanceof TimedElementNode)) { // The condition is synchronized on an element which does // not have timing. Do nothing, this is _not_ an error. return; } syncBase = ((TimedElementNode) ref).timedElementSupport; if (isBeginSync) { if (syncBase.beginDependents == null) { syncBase.beginDependents = new Vector(1); } syncBase.beginDependents.addElement(this); } else { if (syncBase.endDependents == null) { syncBase.endDependents = new Vector(1); } syncBase.endDependents.addElement(this); } } /** * Returns the id that is referenced by this <code>IDRef</code>. * * @return the id being referenced. */ public String getIdRef() { return syncBaseId; } /** * Called by the associated sync base when it creates a new * current <code>TimeInterval</code>. Whenever this happens, a * new IntervalTimeInstance is added for the sync base's begin or end * interval time (depending on isBeginSync), to the timedElement's * begin or end instance list (depending on isBegin). * * @param syncBase the element which just generated a new interval. */ public void onNewInterval(final TimedElementSupport syncBase) { // IntervalTimeInstances are _not_ cleared on reset new IntervalTimeInstance(timedElement, syncBase, offset, false, isBegin, isBeginSync); } /** * Converts this <code>SyncBaseCondition</code> to a String trait. * * @return a string describing this <code>TimeCondition</code> */ protected String toStringTrait() { StringBuffer sb = new StringBuffer(); sb.append(syncBaseId); sb.append('.'); if (isBeginSync) { sb.append("begin"); } else { sb.append("end"); } if (offset != 0) { if (offset > 0) { sb.append('+'); } sb.append(offset / 1000f); sb.append('s'); } return sb.toString(); } }