001/*
002 * JGrapes Event Driven Framework
003 * Copyright (C) 2016-2018 Michael N. Lipp
004 * 
005 * This program is free software; you can redistribute it and/or modify it 
006 * under the terms of the GNU Affero General Public License as published by 
007 * the Free Software Foundation; either version 3 of the License, or 
008 * (at your option) any later version.
009 * 
010 * This program is distributed in the hope that it will be useful, but 
011 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
012 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License 
013 * for more details.
014 * 
015 * You should have received a copy of the GNU Affero General Public License along 
016 * with this program; if not, see <http://www.gnu.org/licenses/>.
017 */
018
019package org.jgrapes.io.events;
020
021import java.io.IOException;
022import java.util.Optional;
023import org.jgrapes.core.Event;
024
025// TODO: Auto-generated Javadoc
026/**
027 * This event signals that an I/O subchannel will no longer be used.
028 * Components that have allocated resources for that channel should
029 * release them in response to receiving this event.
030 *
031 * @param <T> Result type. Usually {@link Void}, but certain kinds
032 * of I/O channels have additional information associated with their
033 * closing.
034 */
035public class Closed<T> extends Event<T> {
036
037    private Throwable error;
038
039    /**
040     * Creates a new event that signals a close in response to
041     * an error (usually an {@link IOException}.
042     *
043     * @param error the error
044     */
045    public Closed(Throwable error) {
046        this.error = error;
047    }
048
049    /**
050     * Creates a new event that signals a regular close.
051     */
052    public Closed() {
053        this(null);
054    }
055
056    /**
057     * Returns the cause of the {@link Closed} event in case of error.
058     *
059     * @return the optional failure
060     */
061    public Optional<Throwable> error() {
062        return Optional.ofNullable(error);
063    }
064}