/*
 * Copyright (c) 2005, 2020 Oracle and/or its affiliates. All rights reserved.
 * Copyright (c) 2005, 2015 SAP. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     SAP - initial API and implementation
package org.eclipse.persistence.testing.framework.wdf.server;

import java.io.Serializable;

import org.junit.runner.notification.Failure;

/**
 * Serializable version of org.junit.runner.notification.Failure.
 */
public class SerializableFailure implements Serializable {

    private static final long serialVersionUID = 1L;
    private final SerializableDescription description;
    private final Throwable thrownException;

    private SerializableFailure(SerializableDescription theDescription, Throwable throwable) {
        description = theDescription;
        thrownException = throwable;
    }

    /**
     * Create a SerializableFailure object from an org.junit.runner.notification.Failure object.
     * @param the failure object to be converted
     * @return a SerializableFailure object converted from an org.junit.runner.notification.Failure object
     */
    public static SerializableFailure create(Failure failure) {
        return new SerializableFailure(SerializableDescription.create(failure.getDescription()),failure.getException());
    }

    /**
     * Restore an org.junit.runner.notification.Failure object from this SerializableFailure object.
     * @return the restored org.junit.runner.notification.Failure object
     */
    public Failure restore() {
        return new Failure(description.restore(), thrownException);
    }

}
