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