From 0587daa2260c86dfb96eb776a89d6bf4f64bea99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Fri, 4 Dec 2009 17:15:01 +0100 Subject: [PATCH] ItEr37S18CUCalculoCaminhoCriticoItEr36S20: Adding class PreAndPostNotReentrantActionsWrapper --- .../PreAndPostNotReentrantActionsWrapper.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 ganttzk/src/main/java/org/zkoss/ganttz/util/PreAndPostNotReentrantActionsWrapper.java diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/util/PreAndPostNotReentrantActionsWrapper.java b/ganttzk/src/main/java/org/zkoss/ganttz/util/PreAndPostNotReentrantActionsWrapper.java new file mode 100644 index 000000000..7d3f530f7 --- /dev/null +++ b/ganttzk/src/main/java/org/zkoss/ganttz/util/PreAndPostNotReentrantActionsWrapper.java @@ -0,0 +1,64 @@ +/* + * This file is part of ###PROJECT_NAME### + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.zkoss.ganttz.util; + +import org.apache.commons.lang.Validate; + +/** + * @author Óscar González Fernández + */ +public abstract class PreAndPostNotReentrantActionsWrapper { + + public interface IAction { + public void doAction(); + } + + private final ThreadLocal inside = new ThreadLocal() { + @Override + protected Boolean initialValue() { + return false; + } + }; + + public void doAction(IAction action) { + Validate.notNull(action); + if (inside.get()) { + action.doAction(); + } else { + executeWithPreAndPostActions(action); + } + } + + private void executeWithPreAndPostActions(IAction action) { + preAction(); + inside.set(true); + try { + action.doAction(); + } finally { + inside.set(false); + postAction(); + } + } + + protected abstract void postAction(); + + protected abstract void preAction(); + +}