/*
 * Copyright 2013 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 com.gitblit.Constants.AccessPermission;
import com.gitblit.Constants.Transport;

/**
 * Represents a git repository url and it's associated access permission for the
 * current user.
 *
 * @author James Moger
 *
 */
public class RepositoryUrl implements Serializable {

	private static final long serialVersionUID = 1L;

	public final Transport transport;
	public final String url;
	public final AccessPermission permission;

	public RepositoryUrl(String url, AccessPermission permission) {
		this.transport = Transport.fromUrl(url);
		this.url = url;
		this.permission = permission;
	}

	public boolean isExternal() {
		return permission == null;
	}

	@Override
	public String toString() {
		return url;
	}
}