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/**
022 * SpaceListener that copies entries written under one key to another key
023 * (optionally in a different space) with a configurable lease timeout.
024 */
025@SuppressWarnings("unchecked")
026public class SpaceTap implements SpaceListener {
027    LocalSpace ssp;
028    LocalSpace dsp;
029    Object key;
030    Object tapKey;
031    long tapTimeout;
032
033    /**
034     * Constructs a tap that copies within a single space.
035     *
036     * @param sp space
037     * @param key key to monitor
038     * @param tapKey key to use when copying
039     * @param tapTimeout copy timeout in millis
040     */
041    public SpaceTap (LocalSpace sp, Object key, Object tapKey, long tapTimeout) {
042        this (sp, sp, key, tapKey, tapTimeout);
043    }
044    /**
045     * Constructs a tap that copies between two spaces.
046     *
047     * @param ssp source space
048     * @param dsp destination space
049     * @param key key to monitor
050     * @param tapKey key to use when copying
051     * @param tapTimeout copy timeout in millis
052     */
053    public SpaceTap (LocalSpace ssp, LocalSpace dsp, Object key, Object tapKey, long tapTimeout) {
054        super();
055        this.ssp = ssp;
056        this.dsp = dsp;
057        this.key = key;
058        this.tapKey = tapKey;
059        this.tapTimeout = tapTimeout;
060        if (key.equals (tapKey) && ssp == dsp)
061            throw new IllegalArgumentException ("Possible deadlock - key equals tap-key within same space");
062        ssp.addListener (key, this);
063    }
064    public void notify (Object key, Object value) {
065        dsp.out (tapKey, value, tapTimeout);
066    }
067   
068    /** Detaches this tap from its source space and clears the reference. */
069    public void close() {
070        if (ssp != null) {
071            ssp.removeListener (key, this);
072            ssp = null;
073        }
074    }
075}
076