tikhomirov@148: /* tikhomirov@423: * Copyright (c) 2011-2012 TMate Software Ltd tikhomirov@148: * tikhomirov@148: * This program is free software; you can redistribute it and/or modify tikhomirov@148: * it under the terms of the GNU General Public License as published by tikhomirov@148: * the Free Software Foundation; version 2 of the License. tikhomirov@148: * tikhomirov@148: * This program is distributed in the hope that it will be useful, tikhomirov@148: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@148: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@148: * GNU General Public License for more details. tikhomirov@148: * tikhomirov@148: * For information on how to redistribute this software under tikhomirov@148: * the terms of a license other than GNU General Public License tikhomirov@148: * contact TMate Software at support@hg4j.com tikhomirov@148: */ tikhomirov@148: package org.tmatesoft.hg.util; tikhomirov@148: tikhomirov@148: /** tikhomirov@148: * Mix-in for objects that support cancellation. tikhomirov@148: * tikhomirov@148: * @author Artem Tikhomirov tikhomirov@148: * @author TMate Software Ltd. tikhomirov@148: */ tikhomirov@148: public interface CancelSupport { tikhomirov@148: tikhomirov@148: /** tikhomirov@148: * This method is invoked to check if target had been brought to canceled state. Shall silently return if target is tikhomirov@148: * in regular state. tikhomirov@148: * @throws CancelledException when target internal state has been changed to canceled. tikhomirov@148: */ tikhomirov@148: void checkCancelled() throws CancelledException; tikhomirov@148: tikhomirov@148: tikhomirov@148: // Yeah, this factory class looks silly now, but perhaps in the future I'll need wrappers for other cancellation sources? tikhomirov@148: // just don't want to have general Utils class with methods like get() below tikhomirov@148: static class Factory { tikhomirov@148: tikhomirov@148: /** tikhomirov@148: * Obtain non-null cancel support object. tikhomirov@148: * tikhomirov@215: * @param target any object (or null) that might have cancel support. For null, returns an instance than never cancels. tikhomirov@148: * @return target if it's capable checking cancellation status or no-op implementation that never cancels. tikhomirov@148: */ tikhomirov@148: public static CancelSupport get(Object target) { tikhomirov@312: CancelSupport cs = get(target, null); tikhomirov@312: if (cs != null) { tikhomirov@312: return cs; tikhomirov@312: } tikhomirov@423: class NoCancel implements CancelSupport { tikhomirov@312: public void checkCancelled() { tikhomirov@312: } tikhomirov@312: }; tikhomirov@423: return new NoCancel(); tikhomirov@312: } tikhomirov@312: tikhomirov@312: public static CancelSupport get(Object target, CancelSupport defaultValue) { tikhomirov@356: return Adaptable.Factory.getAdapter(target, CancelSupport.class, defaultValue); tikhomirov@148: } tikhomirov@148: } tikhomirov@215: tikhomirov@215: interface Target { tikhomirov@215: T set(CancelSupport cs); tikhomirov@215: } tikhomirov@148: }