/*
 * 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.
 */
package org.apache.maven.wagon.resource;

import org.apache.maven.wagon.WagonConstants;

/**
 * Describes resources which can be downloaded from the repository
 * or uploaded to repository.
 * <p/>
 * This class contains minimal set of informations, which
 * are needed to reuse wagon in maven 1.
 *
 * @author <a href="michal@codehaus.org">Michal Maczka</a>
 *
 */
public class Resource {
    private String name;

    private long lastModified;

    private long contentLength = WagonConstants.UNKNOWN_LENGTH;

    public Resource() {}

    public Resource(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    /**
     * Returns the value of the last-modified header field.
     * The result is the number of milliseconds since January 1, 1970 GMT.
     *
     * @return the date the resource  was last modified, or WagonConstants.UNKNOWN_LENGTH
     *         if not known.
     */
    public long getLastModified() {
        return lastModified;
    }

    public void setLastModified(long lastModified) {
        this.lastModified = lastModified;
    }

    public long getContentLength() {
        return contentLength;
    }

    public void setContentLength(long contentLength) {
        this.contentLength = contentLength;
    }

    public String toString() {
        return name;
    }

    public String inspect() {
        return name + "[len = " + contentLength + "; mod = " + lastModified + "]";
    }

    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + (int) (contentLength ^ (contentLength >>> 32));
        result = prime * result + (int) (lastModified ^ (lastModified >>> 32));
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Resource other = (Resource) obj;
        if (contentLength != other.contentLength) {
            return false;
        }
        if (lastModified != other.lastModified) {
            return false;
        }
        if (name == null) {
            if (other.name != null) {
                return false;
            }
        } else if (!name.equals(other.name)) {
            return false;
        }
        return true;
    }
}
