/*
 * Copyright 2011 gitblit.com.
 *
 * Licensed 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 com.gitblit.models;

import java.io.Serializable;
import java.util.Date;
import java.util.Map;

import com.gitblit.Constants.FederationToken;

/**
 * Represents a proposal from a Gitblit instance to pull its repositories.
 */
public class FederationProposal implements Serializable {

	private static final long serialVersionUID = 1L;

	public Date received;

	public String name;

	public String url;

	public FederationToken tokenType;

	public String token;

	public Map<String, RepositoryModel> repositories;

	/**
	 * The constructor for a federation proposal.
	 * 
	 * @param url
	 *            the url of the source Gitblit instance
	 * @param tokenType
	 *            the type of token from the source Gitblit instance
	 * @param token
	 *            the federation token from the source Gitblit instance
	 * @param repositories
	 *            the map of repositories to be pulled from the source Gitblit
	 *            instance keyed by the repository clone url
	 */
	public FederationProposal(String url, FederationToken tokenType, String token,
			Map<String, RepositoryModel> repositories) {
		this.received = new Date();
		this.url = url;
		this.tokenType = tokenType;
		this.token = token;
		this.repositories = repositories;
		try {
			// determine server name and set that as the proposal name
			name = url.substring(url.indexOf("//") + 2);
			if (name.contains("/")) {
				name = name.substring(0, name.indexOf('/'));
			}
			name = name.replace(".", "");
		} catch (Exception e) {
			name = Long.toHexString(System.currentTimeMillis());
		}
	}

	@Override
	public String toString() {
		return "Federation Proposal (" + url + ")";
	}
}
