001/*
002 * jPOS Project [http://jpos.org]
003 * Copyright (C) 2000-2026 jPOS Software SRL
004 *
005 * This program is free software: you can redistribute it and/or modify
006 * it under the terms of the GNU Affero General Public License as
007 * published by the Free Software Foundation, either version 3 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
013 * GNU Affero General Public License for more details.
014 *
015 * You should have received a copy of the GNU Affero General Public License
016 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
017 */
018
019package org.jpos.space;
020
021@SuppressWarnings("unchecked")
022public class SpaceTap implements SpaceListener {
023    LocalSpace ssp;
024    LocalSpace dsp;
025    Object key;
026    Object tapKey;
027    long tapTimeout;
028
029    /**
030     * @param sp space
031     * @param key key to monitor
032     * @param tapKey key to use when copying 
033     * @param tapTimeout copy timeout in millis
034     */
035    public SpaceTap (LocalSpace sp, Object key, Object tapKey, long tapTimeout) {
036        this (sp, sp, key, tapKey, tapTimeout);
037    }
038    /**
039     * @param ssp source space
040     * @param dsp destination space
041     * @param key key to monitor
042     * @param tapKey key to use when copying 
043     * @param tapTimeout copy timeout in millis
044     */
045    public SpaceTap (LocalSpace ssp, LocalSpace dsp, Object key, Object tapKey, long tapTimeout) {
046        super();
047        this.ssp = ssp;
048        this.dsp = dsp;
049        this.key = key;
050        this.tapKey = tapKey;
051        this.tapTimeout = tapTimeout;
052        if (key.equals (tapKey) && ssp == dsp)
053            throw new IllegalArgumentException ("Possible deadlock - key equals tap-key within same space");
054        ssp.addListener (key, this);
055    }
056    public void notify (Object key, Object value) {
057        dsp.out (tapKey, value, tapTimeout);
058    }
059   
060    public void close() {
061        if (ssp != null) {
062            ssp.removeListener (key, this);
063            ssp = null;
064        }
065    }
066}
067