blob: cbdd4da790d901e5a4ce02de63513deaeae91b58 [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com>
* Copyright (C) 2010, Mathias Kinzler <mathias.kinzler@sap.com>
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.egit.ui.internal.components;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.jgit.transport.RemoteConfig;
import org.eclipse.jgit.transport.URIish;
/**
* Data class representing selection of remote repository made by user.
* Selection is either a URI or a remote repository configuration.
* <p>
* Each immutable instance has at least one of two class fields (URI, remote
* config) set to null. null value indicates that it has illegal value or this
* form of repository selection is not selected.
*/
public class RepositorySelection {
private URIish uri;
private RemoteConfig config;
static final RepositorySelection INVALID_SELECTION = new RepositorySelection(
null, null);
/**
* @param uri
* the new specified URI. null if the new URI is invalid or user
* chosen to specify repository as remote config instead of URI.
* @param config
* the new remote config. null if user chosen to specify
* repository as URI.
*/
public RepositorySelection(final URIish uri, final RemoteConfig config) {
if (config != null && uri != null)
throw new IllegalArgumentException(
"URI and config cannot be set at the same time."); //$NON-NLS-1$
this.config = config;
this.uri = uri;
}
/**
* Return the selected URI.
* <p>
* If pushMode is <code>true</code> and a remote configuration was selected,
* this will try to return a push URI from that configuration, otherwise a
* URI; if no configuration was selected, the URI entered in the URI field
* will be returned.<br>
* If pushMode is <code>false</code> and a remote configuration was
* selected, this will try to return a URI from that configuration,
* otherwise <code>null</code> will be returned; if no configuration was
* selected, the URI entered in the URI field will be returned
*
* @param pushMode
* the push mode
* @return the selected URI, or <code>null</code> if there is no valid
* selection
*/
public URIish getURI(boolean pushMode) {
if (isConfigSelected())
if (pushMode) {
if (config.getPushURIs().size() > 0)
return config.getPushURIs().get(0);
else if (config.getURIs().size() > 0)
return config.getURIs().get(0);
else
return null;
} else {
if (config.getURIs().size() > 0)
return config.getURIs().get(0);
else if (config.getPushURIs().size() > 0)
return config.getPushURIs().get(0);
else
return null;
}
return uri;
}
/**
* @return the selected URI, <code>null</code> if a configuration was
* selected
*/
public URIish getURI() {
if (isConfigSelected())
return null;
return uri;
}
/**
* @return list of all push URIs - either the one specified as custom URI or
* all push URIs of the selected configuration; if not push URIs
* were specified, the first URI is returned
*/
public List<URIish> getPushURIs() {
if (isURISelected())
return Collections.singletonList(uri);
if (isConfigSelected()) {
List<URIish> pushUris = new ArrayList<>();
pushUris.addAll(config.getPushURIs());
if (pushUris.isEmpty())
pushUris.add(config.getURIs().get(0));
return pushUris;
}
return null;
}
/**
* @return the selected remote configuration. null if user chosen to select
* repository as URI.
*/
public RemoteConfig getConfig() {
return config;
}
/**
* @return selected remote configuration name or null if selection is not a
* remote configuration.
*/
public String getConfigName() {
if (isConfigSelected())
return config.getName();
return null;
}
/**
* @return true if selection contains valid URI or remote config, false if
* there is no valid selection.
*/
public boolean isValidSelection() {
return uri != null || config != null;
}
/**
* @return true if user selected valid URI, false if user selected invalid
* URI or remote config.
*/
public boolean isURISelected() {
return uri != null;
}
/**
* @return true if user selected remote configuration, false if user
* selected (invalid or valid) URI.
*/
public boolean isConfigSelected() {
return config != null;
}
@Override
public boolean equals(final Object obj) {
if (obj == this)
return true;
if (obj instanceof RepositorySelection) {
final RepositorySelection other = (RepositorySelection) obj;
if (uri == null ^ other.uri == null)
return false;
if (uri != null && !uri.equals(other.uri))
return false;
if (config != other.config)
return false;
return true;
} else
return false;
}
@Override
public int hashCode() {
if (uri != null)
return uri.hashCode();
else if (config != null)
return config.hashCode();
return 31;
}
}