blob: 12580cf431fea70341f6176cc37824f6531a7049 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2008 Tasktop Technologies and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tasktop Technologies - initial API and implementation
* Eugene Kuleshov - improvements
*******************************************************************************/
package org.eclipse.mylyn.tasks.core;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.core.runtime.Status;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
import org.eclipse.mylyn.commons.net.AuthenticationType;
import org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants;
import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
import org.eclipse.mylyn.internal.tasks.core.RepositoryPerson;
/**
* Note that task repositories use Strings for storing time stamps because using Date objects led to the following
* problems:
* <ul>
* <li>Often we are unable to get the time zone of the repository so interpreting the date string correctly doesn't
* work.</li>
* <li>Even if we do know the time zone information the local clock may be wrong. This can cause lost incoming when
* asking the repository for all changes since date X.</li>
* <li>The solution we have come up with thus far is not to interpret the date as a DATE object but rather simply use
* the date string given to us by the repository itself.</li>
* </ul>
*
* @author Mik Kersten
* @author Rob Elves
* @author Eugene Kuleshov
* @author Steffen Pingel
* @since 2.0
* @noextend This class is not intended to be subclassed by clients.
*/
@SuppressWarnings("deprecation")
public final class TaskRepository extends PlatformObject {
public static final String DEFAULT_CHARACTER_ENCODING = "UTF-8"; //$NON-NLS-1$
private static final String USERNAME = ".username"; //$NON-NLS-1$
private static final String PASSWORD = ".password"; //$NON-NLS-1$
private static final String SAVE_PASSWORD = ".savePassword"; //$NON-NLS-1$
private static final String ENABLED = ".enabled"; //$NON-NLS-1$
private static final String AUTH_REPOSITORY = "org.eclipse.mylyn.tasklist.repositories"; //$NON-NLS-1$
// transient
private IStatus errorStatus = null;
/**
* @deprecated use {@link #setCredentials(AuthenticationType, AuthenticationCredentials, boolean)} to access
* credentials
*/
@Deprecated
public static final String AUTH_PASSWORD = AUTH_REPOSITORY + PASSWORD;
/**
* @deprecated use {@link #setCredentials(AuthenticationType, AuthenticationCredentials, boolean)} to access
* credentials
*/
@Deprecated
public static final String AUTH_USERNAME = AUTH_REPOSITORY + USERNAME;
@Deprecated
public static final String ANONYMOUS_LOGIN = "org.eclipse.mylyn.tasklist.repositories.anonymous"; //$NON-NLS-1$
private static final String AUTH_HTTP = "org.eclipse.mylyn.tasklist.repositories.httpauth"; //$NON-NLS-1$
/**
* @deprecated use {@link #setCredentials(AuthenticationType, AuthenticationCredentials, boolean)} to access
* credentials
*/
@Deprecated
public static final String AUTH_HTTP_PASSWORD = AUTH_HTTP + PASSWORD;
/**
* @deprecated use {@link #setCredentials(AuthenticationType, AuthenticationCredentials, boolean)} to access
* credentials
*/
@Deprecated
public static final String AUTH_HTTP_USERNAME = AUTH_HTTP + USERNAME;
public static final String NO_VERSION_SPECIFIED = "unknown"; //$NON-NLS-1$
private static final String AUTH_SCHEME = "Basic"; //$NON-NLS-1$
private static final String AUTH_REALM = ""; //$NON-NLS-1$
private static final URL DEFAULT_URL;
private static final String PROPERTY_CONFIG_TIMESTAMP = "org.eclipse.mylyn.tasklist.repositories.configuration.timestamp"; //$NON-NLS-1$
public static final String PROXY_USEDEFAULT = "org.eclipse.mylyn.tasklist.repositories.proxy.usedefault"; //$NON-NLS-1$
public static final String PROXY_HOSTNAME = "org.eclipse.mylyn.tasklist.repositories.proxy.hostname"; //$NON-NLS-1$
public static final String PROXY_PORT = "org.eclipse.mylyn.tasklist.repositories.proxy.port"; //$NON-NLS-1$
private static final String AUTH_PROXY = "org.eclipse.mylyn.tasklist.repositories.proxy"; //$NON-NLS-1$
/**
* @deprecated use {@link #setCredentials(AuthenticationType, AuthenticationCredentials, boolean)} to access
* credentials
*/
@Deprecated
public static final String PROXY_USERNAME = AUTH_PROXY + USERNAME;
/**
* @deprecated use {@link #setCredentials(AuthenticationType, AuthenticationCredentials, boolean)} to access
* credentials
*/
@Deprecated
public static final String PROXY_PASSWORD = AUTH_PROXY + PASSWORD;
public static final String OFFLINE = "org.eclipse.mylyn.tasklist.repositories.offline"; //$NON-NLS-1$
// HACK: Lock used to work around race condition in
// Platform.add/get/flushAuthorizationInfo()
private static final Object LOCK = new Object();
private final Set<PropertyChangeListener> propertyChangeListeners = new HashSet<PropertyChangeListener>();
// HACK: private credentials for headless operation
private static Map<String, Map<String, String>> credentials = new HashMap<String, Map<String, String>>();
static {
URL url = null;
try {
url = new URL("http://eclipse.org/mylyn"); //$NON-NLS-1$
} catch (Exception ex) {
// TODO ?
}
DEFAULT_URL = url;
}
private static String getKeyPrefix(AuthenticationType type) {
switch (type) {
case HTTP:
return AUTH_HTTP;
case PROXY:
return AUTH_PROXY;
case REPOSITORY:
return AUTH_REPOSITORY;
}
throw new IllegalArgumentException("Unknown authentication type: " + type); //$NON-NLS-1$
}
private boolean isCachedUserName;
private String cachedUserName;
private final Map<String, String> properties = new LinkedHashMap<String, String>();
/**
* Stores properties that are not persisted. Note that this map is currently cleared when flushCredentials() is
* invoked.
*/
private final Map<String, String> transientProperties = new HashMap<String, String>();
/*
* TODO: should be externalized and added to extension point, see bug 183606
*/
private boolean isBugRepository = false;
private transient volatile boolean updating;
public TaskRepository(String connectorKind, String repositoryUrl) {
this(connectorKind, repositoryUrl, NO_VERSION_SPECIFIED);
}
/**
* @deprecated use {@link #setProperty(String, String)} instead of passing a map
*/
@Deprecated
public TaskRepository(String kind, String serverUrl, Map<String, String> properties) {
setProperty(IRepositoryConstants.PROPERTY_CONNECTOR_KIND, kind);
setProperty(IRepositoryConstants.PROPERTY_URL, serverUrl);
this.properties.putAll(properties);
// use platform proxy by default (headless will need to set this to false)
this.setProperty(TaskRepository.PROXY_USEDEFAULT, new Boolean(true).toString());
}
/**
* for testing purposes sets repository time zone to local default time zone sets character encoding to
* DEFAULT_CHARACTER_ENCODING
*/
@Deprecated
public TaskRepository(String kind, String serverUrl, String version) {
this(kind, serverUrl, version, DEFAULT_CHARACTER_ENCODING, TimeZone.getDefault().getID());
}
@Deprecated
public TaskRepository(String connectorKind, String repositoryUrl, String version, String encoding, String timeZoneId) {
Assert.isNotNull(connectorKind);
Assert.isNotNull(repositoryUrl);
setProperty(IRepositoryConstants.PROPERTY_CONNECTOR_KIND, connectorKind);
setProperty(IRepositoryConstants.PROPERTY_URL, repositoryUrl);
setProperty(IRepositoryConstants.PROPERTY_VERSION, version);
setProperty(IRepositoryConstants.PROPERTY_ENCODING, encoding);
setProperty(IRepositoryConstants.PROPERTY_TIMEZONE, timeZoneId);
// use platform proxy by default (headless will need to set this to false)
this.setProperty(TaskRepository.PROXY_USEDEFAULT, new Boolean(true).toString());
// for backwards compatibility to versions prior to 2.2
this.setProperty(AUTH_REPOSITORY + SAVE_PASSWORD, String.valueOf(true));
this.setProperty(AUTH_HTTP + SAVE_PASSWORD, String.valueOf(true));
this.setProperty(AUTH_PROXY + SAVE_PASSWORD, String.valueOf(true));
}
// TODO e3.4 move to new api
private void addAuthInfo(Map<String, String> map) {
synchronized (LOCK) {
try {
if (Platform.isRunning()) {
// write the map to the keyring
try {
Platform.addAuthorizationInfo(new URL(getRepositoryUrl()), AUTH_REALM, AUTH_SCHEME, map);
} catch (MalformedURLException ex) {
Platform.addAuthorizationInfo(DEFAULT_URL, getRepositoryUrl(), AUTH_SCHEME, map);
}
} else {
Map<String, String> headlessCreds = getAuthInfo();
headlessCreds.putAll(map);
}
} catch (CoreException e) {
StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
"Could not set authorization credentials", e)); //$NON-NLS-1$
}
}
}
public void clearCredentials() {
}
@Override
public boolean equals(Object object) {
if (object == this) {
return true;
}
if (object instanceof TaskRepository) {
TaskRepository repository = (TaskRepository) object;
return getConnectorKind().equals(repository.getConnectorKind())
&& getRepositoryUrl().equals(repository.getRepositoryUrl());
}
return false;
}
// TODO e3.4 move to new api
public void flushAuthenticationCredentials() {
// legacy support for versions prior to 2.2 that did not set the enable flag
setProperty(getKeyPrefix(AuthenticationType.HTTP) + ENABLED, null);
setProperty(getKeyPrefix(AuthenticationType.PROXY) + ENABLED, null);
setProperty(getKeyPrefix(AuthenticationType.REPOSITORY) + ENABLED, null);
synchronized (LOCK) {
isCachedUserName = false;
transientProperties.clear();
try {
if (Platform.isRunning()) {
try {
Platform.flushAuthorizationInfo(new URL(getRepositoryUrl()), AUTH_REALM, AUTH_SCHEME);
} catch (MalformedURLException ex) {
Platform.flushAuthorizationInfo(DEFAULT_URL, getRepositoryUrl(), AUTH_SCHEME);
}
} else {
Map<String, String> headlessCreds = getAuthInfo();
headlessCreds.clear();
}
} catch (CoreException e) {
// FIXME propagate exception?
StatusHandler.fail(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
"Could not flush authorization credentials", e)); //$NON-NLS-1$
}
}
}
// TODO e3.4 move to new api
@SuppressWarnings( { "unchecked" })
private Map<String, String> getAuthInfo() {
synchronized (LOCK) {
if (Platform.isRunning()) {
try {
return Platform.getAuthorizationInfo(new URL(getRepositoryUrl()), AUTH_REALM, AUTH_SCHEME);
} catch (MalformedURLException ex) {
return Platform.getAuthorizationInfo(DEFAULT_URL, getRepositoryUrl(), AUTH_SCHEME);
} catch (Exception e) {
StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
"Could not retrieve authorization credentials", e)); //$NON-NLS-1$
}
} else {
Map<String, String> headlessCreds = credentials.get(getRepositoryUrl());
if (headlessCreds == null) {
headlessCreds = new HashMap<String, String>();
credentials.put(getRepositoryUrl(), headlessCreds);
}
return headlessCreds;
}
return null;
}
}
private String getAuthInfo(String property) {
Map<String, String> map = getAuthInfo();
return map == null ? null : map.get(property);
}
public String getCharacterEncoding() {
final String encoding = properties.get(IRepositoryConstants.PROPERTY_ENCODING);
return encoding == null || "".equals(encoding) ? DEFAULT_CHARACTER_ENCODING : encoding; //$NON-NLS-1$
}
/**
* Get the last refresh date as initialized {@link Date} object, null if not set<br />
*
* @return {@link Date} configuration date, null if not set
*/
public Date getConfigurationDate() {
Date configDate = null;
String value = this.getProperty(PROPERTY_CONFIG_TIMESTAMP);
try {
configDate = new Date(Long.valueOf(value).longValue());
} catch (Exception e) {
}
return configDate;
}
/**
* @return "<unknown>" if kind is unknown
*/
public String getConnectorKind() {
String kind = properties.get(IRepositoryConstants.PROPERTY_CONNECTOR_KIND);
if (kind != null) {
return kind;
} else {
return IRepositoryConstants.KIND_UNKNOWN;
}
}
/**
* Returns the credentials for an authentication type.
*
* @param authType
* the type of authentication
* @return null, if no credentials are set for <code>authType</code>
* @since 3.0
*/
public synchronized AuthenticationCredentials getCredentials(AuthenticationType authType) {
String key = getKeyPrefix(authType);
String enabled = getProperty(key + ENABLED);
if (enabled == null || "true".equals(enabled)) { //$NON-NLS-1$
String userName = getAuthInfo(key + USERNAME);
String password;
String savePassword = getProperty(key + SAVE_PASSWORD);
if (savePassword != null && "true".equals(savePassword)) { //$NON-NLS-1$
password = getAuthInfo(key + PASSWORD);
} else {
password = transientProperties.get(key + PASSWORD);
}
if (userName == null) {
userName = ""; //$NON-NLS-1$
}
if (password == null) {
password = ""; //$NON-NLS-1$
}
if (enabled == null && userName.length() == 0) {
// API30: legacy support for versions prior to 2.2 that did not set the enable flag, remove for 3.0
return null;
}
return new AuthenticationCredentials(userName, password);
} else {
return null;
}
}
/**
* @deprecated use {@link #getCredentials(AuthenticationType)} instead
*/
@Deprecated
public String getHttpPassword() {
return getPassword(AuthenticationType.HTTP);
}
/**
* @deprecated use {@link #getCredentials(AuthenticationType)} instead
*/
@Deprecated
public String getHttpUser() {
return getUserName(AuthenticationType.HTTP);
}
/**
* @deprecated use {@link #getCredentials(AuthenticationType)} instead
*/
@Deprecated
public String getPassword() {
return getPassword(AuthenticationType.REPOSITORY);
}
/**
* Legacy support for < 2.2. Remove in 2.3.
*/
private String getPassword(AuthenticationType authType) {
AuthenticationCredentials credentials = getCredentials(authType);
return (credentials != null) ? credentials.getPassword() : null;
}
public Map<String, String> getProperties() {
return new LinkedHashMap<String, String>(this.properties);
}
public String getProperty(String name) {
return this.properties.get(name);
}
// /**
// * @deprecated use {@link TaskRepositoryLocation#getProxyForHost(String, String)} instead
// */
// @Deprecated
// public Proxy getProxy() {
// Proxy proxy = Proxy.NO_PROXY;
// if (isDefaultProxyEnabled()) {
// proxy = WebClientUtil.getPlatformProxy(getRepositoryUrl());
// } else {
//
// String proxyHost = getProperty(PROXY_HOSTNAME);
// String proxyPort = getProperty(PROXY_PORT);
// String proxyUsername = "";
// String proxyPassword = "";
// if (proxyHost != null && proxyHost.length() > 0) {
// proxyUsername = getProxyUsername();
// proxyPassword = getProxyPassword();
// }
// proxy = WebClientUtil.getProxy(proxyHost, proxyPort, proxyUsername, proxyPassword);
// }
// return proxy;
// }
/**
* @deprecated use {@link #getCredentials(AuthenticationType)} instead
*/
@Deprecated
public String getProxyPassword() {
return getPassword(AuthenticationType.PROXY);
}
/**
* @deprecated use {@link #getCredentials(AuthenticationType)} instead
*/
@Deprecated
public String getProxyUsername() {
return getUserName(AuthenticationType.PROXY);
}
/**
* @return the URL if the label property is not set
*/
public String getRepositoryLabel() {
String label = properties.get(IRepositoryConstants.PROPERTY_LABEL);
if (label != null && label.length() > 0) {
return label;
} else {
return getRepositoryUrl();
}
}
/**
* @since 3.0
*/
public boolean getSavePassword(AuthenticationType authType) {
String value = getProperty(getKeyPrefix(authType) + SAVE_PASSWORD);
return value != null && "true".equals(value); //$NON-NLS-1$
}
public String getSynchronizationTimeStamp() {
return this.properties.get(IRepositoryConstants.PROPERTY_SYNCTIMESTAMP);
}
public String getTimeZoneId() {
final String timeZoneId = properties.get(IRepositoryConstants.PROPERTY_TIMEZONE);
return timeZoneId == null || "".equals(timeZoneId) ? TimeZone.getDefault().getID() : timeZoneId; //$NON-NLS-1$
}
public String getUrl() {
return getRepositoryUrl();
}
/**
* @since 3.0
*/
public String getRepositoryUrl() {
return properties.get(IRepositoryConstants.PROPERTY_URL);
}
/**
* The username is cached since it needs to be retrieved frequently (e.g. for Task List decoration).
*/
public String getUserName() {
// NOTE: if anonymous, user name is "" string so we won't go to keyring
if (!isCachedUserName) {
cachedUserName = getUserName(AuthenticationType.REPOSITORY);
isCachedUserName = true;
}
return cachedUserName;
}
/**
* Legacy support for < 2.2. Remove in 2.3.
*/
private String getUserName(AuthenticationType authType) {
AuthenticationCredentials credentials = getCredentials(authType);
return (credentials != null) ? credentials.getUserName() : null;
}
public String getVersion() {
final String version = properties.get(IRepositoryConstants.PROPERTY_VERSION);
return version == null || "".equals(version) ? NO_VERSION_SPECIFIED : version; //$NON-NLS-1$
}
/**
* @deprecated use #getCredentials(AuthenticationType) instead
*/
@Deprecated
public boolean hasCredentials() {
String username = getUserName();
String password = getPassword();
return username != null && username.length() > 0 && password != null && password.length() > 0;
}
@Override
public int hashCode() {
return getRepositoryUrl().hashCode() * 31 + getConnectorKind().hashCode();
}
public boolean hasProperty(String name) {
String value = getProperty(name);
return value != null && value.trim().length() > 0;
}
/**
* @deprecated #getCredentials(AuthenticationType) instead
*/
@Deprecated
public boolean isAnonymous() {
return getProperty(ANONYMOUS_LOGIN) == null || "true".equals(getProperty(ANONYMOUS_LOGIN)); //$NON-NLS-1$
}
public boolean isBugRepository() {
return isBugRepository;
}
/**
* Use platform proxy settings
*/
public boolean isDefaultProxyEnabled() {
return "true".equals(getProperty(PROXY_USEDEFAULT)); //$NON-NLS-1$
}
public boolean isOffline() {
return getProperty(OFFLINE) != null && "true".equals(getProperty(OFFLINE)); //$NON-NLS-1$
}
public void removeProperty(String key) {
this.properties.remove(key);
}
/**
* @deprecated use {@link #setCredentials(AuthenticationType, AuthenticationCredentials, boolean)} instead
*/
@Deprecated
public void setAuthenticationCredentials(String username, String password) {
setCredentials(AuthenticationType.REPOSITORY, username, password);
}
public void setBugRepository(boolean isBugRepository) {
this.isBugRepository = isBugRepository;
}
public void setCharacterEncoding(String characterEncoding) {
properties.put(IRepositoryConstants.PROPERTY_ENCODING, characterEncoding == null ? DEFAULT_CHARACTER_ENCODING
: characterEncoding);
}
/**
* Set the Configuration date to the {@link Date} indicated.
*
* @param configuration
* date {@link {@link Date}
*/
final public void setConfigurationDate(final Date date) {
this.setProperty(PROPERTY_CONFIG_TIMESTAMP, String.valueOf(date.getTime()));
// should persist here, but that can only be done by the TaskRepositoryManager
// However this is also included when persisting ordinary sync time
}
/**
* Sets the credentials for <code>authType</code>.
*
* @param authType
* the type of authentication
* @param credentials
* the credentials, if null, the credentials for <code>authType</code> will be flushed
* @param savePassword
* if true, the password will be persisted in the platform key ring; otherwise it will be stored in
* memory only
* @since 3.0
*/
public synchronized void setCredentials(AuthenticationType authType, AuthenticationCredentials credentials,
boolean savePassword) {
String key = getKeyPrefix(authType);
setProperty(key + SAVE_PASSWORD, String.valueOf(savePassword));
if (credentials == null) {
setProperty(key + ENABLED, String.valueOf(false));
transientProperties.remove(key + PASSWORD);
setCredentialsInternal("", "", key + USERNAME, key + PASSWORD); //$NON-NLS-1$ //$NON-NLS-2$
} else {
setProperty(key + ENABLED, String.valueOf(true));
if (savePassword) {
setCredentialsInternal(credentials.getUserName(), credentials.getPassword(), key + USERNAME, key
+ PASSWORD);
transientProperties.remove(key + PASSWORD);
} else {
setCredentialsInternal(credentials.getUserName(), "", key + USERNAME, key + PASSWORD); //$NON-NLS-1$
transientProperties.put(key + PASSWORD, credentials.getPassword());
}
}
if (authType == AuthenticationType.REPOSITORY) {
if (credentials == null) {
this.cachedUserName = null;
this.isCachedUserName = false;
} else {
this.cachedUserName = credentials.getUserName();
this.isCachedUserName = true;
}
}
}
/**
* Legacy support for < 2.2. Remove in 2.3.
*/
private void setCredentials(AuthenticationType type, String username, String password) {
if (username == null) {
setCredentials(type, null, true);
} else {
setCredentials(type, new AuthenticationCredentials(username, password), true);
}
}
private void setCredentialsInternal(String username, String password, String userProperty, String passwordProperty) {
Map<String, String> map = getAuthInfo();
if (map == null) {
map = new HashMap<String, String>();
}
if (username != null) {
map.put(userProperty, username);
}
if (password != null) {
map.put(passwordProperty, password);
}
addAuthInfo(map);
}
/**
* @deprecated use esetCredentials(AuthenticationType, AuthenticationCredentials, boolean)
*/
@Deprecated
public void setHttpAuthenticationCredentials(String username, String password) {
setCredentials(AuthenticationType.HTTP, username, password);
}
public void setOffline(boolean offline) {
properties.put(OFFLINE, String.valueOf(offline));
}
/**
* @deprecated use {@link #setCredentials(AuthenticationType, AuthenticationCredentials, boolean)} instead
*/
@Deprecated
public void setProxyAuthenticationCredentials(String username, String password) {
setCredentials(AuthenticationType.PROXY, username, password);
}
public void setRepositoryLabel(String repositoryLabel) {
setProperty(IRepositoryConstants.PROPERTY_LABEL, repositoryLabel);
}
/**
* ONLY for use by IRepositoryConstants. To set the sync time call IRepositoryConstants.setSyncTime(repository,
* date);
*/
public void setSynchronizationTimeStamp(String syncTime) {
setProperty(IRepositoryConstants.PROPERTY_SYNCTIMESTAMP, syncTime);
}
public void setProperty(String key, String newValue) {
String oldValue = this.properties.get(key);
if ((oldValue != null && !oldValue.equals(newValue)) || (oldValue == null && newValue != null)) {
this.properties.put(key, newValue);
notifyChangeListeners(key, oldValue, newValue);
}
}
private void notifyChangeListeners(String key, String old, String value) {
PropertyChangeEvent event = new PropertyChangeEvent(this, key, old, value);
for (PropertyChangeListener listener : propertyChangeListeners) {
listener.propertyChange(event);
}
}
public void setTimeZoneId(String timeZoneId) {
setProperty(IRepositoryConstants.PROPERTY_TIMEZONE, timeZoneId == null ? TimeZone.getDefault().getID()
: timeZoneId);
}
/**
* @deprecated Use {@link #setRepositoryUrl(String)} instead
*/
@Deprecated
public void setUrl(String newUrl) {
setRepositoryUrl(newUrl);
}
/**
* @since 3.0
*/
public void setRepositoryUrl(String repositoryUrl) {
Assert.isNotNull(repositoryUrl);
properties.put(IRepositoryConstants.PROPERTY_URL, repositoryUrl);
}
public void setVersion(String ver) {
properties.put(IRepositoryConstants.PROPERTY_VERSION, ver == null ? NO_VERSION_SPECIFIED : ver);
}
@Override
public String toString() {
return getRepositoryUrl();
}
/**
* @since 3.0
*/
public boolean isUpdating() {
return updating;
}
/**
* @since 3.0
*/
public void setUpdating(boolean updating) {
this.updating = updating;
}
/**
* @since 3.0
*/
public IRepositoryPerson createPerson(String personId) {
return new RepositoryPerson(this, personId);
}
/**
* @since 3.0
*/
public IStatus getStatus() {
return errorStatus;
}
/**
* @since 3.0
*/
public void setStatus(IStatus errorStatus) {
this.errorStatus = errorStatus;
}
/**
* @since 3.0
*/
public void addChangeListener(PropertyChangeListener listener) {
propertyChangeListeners.add(listener);
}
/**
* @since 3.0
*/
public void removeChangeListener(PropertyChangeListener listener) {
propertyChangeListeners.remove(listener);
}
/**
* @since 3.1
*/
public void setDefaultProxyEnabled(boolean useDefaultProxy) {
setProperty(TaskRepository.PROXY_USEDEFAULT, String.valueOf(useDefaultProxy));
}
}