001    /*
002     * Copyright (C) 2012 eXo Platform SAS.
003     *
004     * This is free software; you can redistribute it and/or modify it
005     * under the terms of the GNU Lesser General Public License as
006     * published by the Free Software Foundation; either version 2.1 of
007     * the License, or (at your option) any later version.
008     *
009     * This software is distributed in the hope that it will be useful,
010     * but WITHOUT ANY WARRANTY; without even the implied warranty of
011     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012     * Lesser General Public License for more details.
013     *
014     * You should have received a copy of the GNU Lesser General Public
015     * License along with this software; if not, write to the Free
016     * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
017     * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
018     */
019    
020    package org.crsh.util;
021    
022    import java.util.concurrent.Callable;
023    
024    /**
025     * An helper for chaining statements to execute.
026     */
027    public abstract class Statement {
028    
029      /** . */
030      private Statement next;
031    
032      protected abstract void run() throws Throwable;
033    
034      public Statement with(final Runnable runnable) {
035        return with(new Statement() {
036          @Override
037          protected void run() throws Throwable {
038            runnable.run();
039          }
040        });
041      }
042    
043      public Statement with(final Callable<?> callable) {
044        return with(new Statement() {
045          @Override
046          protected void run() throws Throwable {
047            callable.call();
048          }
049        });
050      }
051    
052      public Statement with(Statement callback) {
053        if (next != null) {
054          next.with(callback);
055        } else {
056          next = callback;
057        }
058        return this;
059      }
060    
061      public void all() {
062        try {
063          run();
064        }
065        catch (Throwable ignore) {
066        }
067        if (next != null) {
068          next.all();
069        }
070      }
071    }