package org.apache.archiva.redback.rest.api.model;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import javax.xml.bind.annotation.XmlRootElement;
import java.time.OffsetDateTime;

/**
 * @author Martin Stockhammer <martin_s@apache.org>
 */
@XmlRootElement(name="pingResult")
public class PingResult
{
    boolean success;
    OffsetDateTime requestTime;

    public PingResult() {
        this.requestTime = OffsetDateTime.now( );
    }

    public PingResult( boolean success ) {
        this.success = success;
        this.requestTime = OffsetDateTime.now( );
    }

    public boolean isSuccess( )
    {
        return success;
    }

    public void setSuccess( boolean success )
    {
        this.success = success;
    }

    public OffsetDateTime getRequestTime( )
    {
        return requestTime;
    }

    public void setRequestTime( OffsetDateTime requestTime )
    {
        this.requestTime = requestTime;
    }
}
