blob: 92b363490660a31ee98bc85f645f375c49e0e6e4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2015 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Tasktop Technologies - initial API and implementation
* Eugene Kuleshov - improvements
* BREDEX GmbH - fix for bug 295050
*******************************************************************************/
package org.eclipse.mylyn.tasks.core;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
import java.util.concurrent.ConcurrentHashMap;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
import org.eclipse.mylyn.commons.net.AuthenticationType;
import org.eclipse.mylyn.commons.repositories.core.ILocationService;
import org.eclipse.mylyn.commons.repositories.core.auth.ICredentialsStore;
import org.eclipse.mylyn.internal.commons.repositories.core.InMemoryCredentialsStore;
import org.eclipse.mylyn.internal.commons.repositories.core.LocationService;
import org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants;
import org.eclipse.mylyn.internal.tasks.core.RepositoryPerson;
import com.google.common.base.Objects;
/**
* 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
*/
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$
private static final String AUTH_CERT = "org.eclipse.mylyn.tasklist.repositories.certauth"; //$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 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$
/**
* Category for repositories that manage tasks.
*
* @see #setCategory(String)
* @since 3.9
*/
public static final String CATEGORY_TASKS = "org.eclipse.mylyn.category.tasks"; //$NON-NLS-1$
/**
* Category for repositories that manage bugs.
*
* @see #setCategory(String)
* @since 3.9
*/
public static final String CATEGORY_BUGS = "org.eclipse.mylyn.category.bugs"; //$NON-NLS-1$
/**
* Category for repositories that manage builds.
*
* @see #setCategory(String)
* @since 3.9
*/
public static final String CATEGORY_BUILD = "org.eclipse.mylyn.category.build"; //$NON-NLS-1$
/**
* Category for repositories that manage reviews.
*
* @see #setCategory(String)
* @since 3.9
*/
public static final String CATEGORY_REVIEW = "org.eclipse.mylyn.category.review"; //$NON-NLS-1$
private final Set<PropertyChangeListener> propertyChangeListeners = new HashSet<PropertyChangeListener>();
private static String CREATED_FROM_TEMPLATE = "org.eclipse.mylyn.tasklist.repositories.template"; //$NON-NLS-1$
private static String getKeyPrefix(AuthenticationType type) {
switch (type) {
case HTTP:
return AUTH_HTTP;
case CERTIFICATE:
return AUTH_CERT;
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 ConcurrentHashMap<String, String>();
/*
* TODO: should be externalized and added to extension point, see bug 183606
*/
private boolean isBugRepository = false;
private transient volatile boolean updating;
private boolean shouldPersistCredentials = true;
private final ILocationService service = LocationService.getDefault();
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)
setBooleanProperty(TaskRepository.PROXY_USEDEFAULT, true);
// for backwards compatibility to versions prior to 2.2
setBooleanProperty(AUTH_REPOSITORY + SAVE_PASSWORD, true);
setBooleanProperty(AUTH_HTTP + SAVE_PASSWORD, true);
setBooleanProperty(AUTH_PROXY + SAVE_PASSWORD, true);
}
private ICredentialsStore getCredentialsStore() {
if (!shouldPersistCredentials()) {
// use a different ID so that we use a different in memory store than that used as a cache by the secure store
return InMemoryCredentialsStore.getStore("headless::" + getRepositoryUrl()); //$NON-NLS-1$
}
return getService().getCredentialsStore(getRepositoryUrl());
}
private void addAuthInfo(String username, String password, String userProperty, String passwordProperty) {
ICredentialsStore credentialsStore = getCredentialsStore();
if (userProperty.equals(getKeyPrefix(AuthenticationType.REPOSITORY) + USERNAME)) {
this.setProperty(userProperty, username);
} else {
String oldUserValue = credentialsStore.get(userProperty, ""); //$NON-NLS-1$
credentialsStore.put(userProperty, username, false);
if (!Objects.equal(oldUserValue, username)) {
notifyChangeListeners(userProperty, oldUserValue, username);
}
}
String oldPasswordValue = credentialsStore.get(passwordProperty, ""); //$NON-NLS-1$
credentialsStore.put(passwordProperty, password, true);
if (!Objects.equal(oldPasswordValue, password)) {
notifyChangeListeners(passwordProperty, "", ""); //$NON-NLS-1$ //$NON-NLS-2$
}
}
/**
* @deprecated use {@code flushAuthenticationCredentials()}
*/
@Deprecated
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;
}
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);
transientProperties.clear();
isCachedUserName = false;
getCredentialsStore().clear();
this.setProperty(AuthenticationType.REPOSITORY + USERNAME, ""); //$NON-NLS-1$
}
private String getAuthInfo(String property) {
if (property.equals(getKeyPrefix(AuthenticationType.REPOSITORY) + USERNAME)) {
return getProperty(property);
}
return getCredentialsStore().get(property, null);
}
/**
* Returns {@code} if credentials persisted in the platform keystore.
*
* @since 3.10
* @see #setShouldPersistCredentials(boolean)
*/
public boolean shouldPersistCredentials() {
return shouldPersistCredentials;
}
/**
* Toggles the flag for persisting credentials. If {@code shouldPersistCredentials} is {@code false} credentials
* will not be persisted in the platform keystore.
* <p>
* This flag does not have any effect if not running in an OSGi environment.
*
* @since 3.10
* @see #shouldPersistCredentials()
*/
public void setShouldPersistCredentials(boolean shouldPersistCredentials) {
this.shouldPersistCredentials = shouldPersistCredentials;
}
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 AuthenticationCredentials getCredentials(AuthenticationType authType) {
String key = getKeyPrefix(authType);
if (getBooleanProperty(key + ENABLED)) {
String userName = getAuthInfo(key + USERNAME);
String password;
if (getBooleanProperty(key + SAVE_PASSWORD)) {
password = getAuthInfo(key + PASSWORD);
} else {
password = transientProperties.get(key + PASSWORD);
}
if (userName == null) {
userName = ""; //$NON-NLS-1$
}
if (password == null) {
password = ""; //$NON-NLS-1$
}
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);
}
private boolean getBooleanProperty(String name) {
return Boolean.parseBoolean(getProperty(name));
}
/**
* @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) {
// do not open secure store for username to avoid prompting user for password during initialization
cachedUserName = getProperty(getKeyPrefix(AuthenticationType.REPOSITORY) + USERNAME);
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 getConnectorKind().hashCode();
}
public boolean hasProperty(String name) {
String value = getProperty(name);
return value != null && value.trim().length() > 0;
}
/**
* @deprecated #getCredentials(AuthenticationType) == null instead
*/
@Deprecated
public boolean isAnonymous() {
return getProperty(ANONYMOUS_LOGIN) == null || "true".equals(getProperty(ANONYMOUS_LOGIN)); //$NON-NLS-1$
}
public boolean isBugRepository() {
return isBugRepository;
}
/**
* Returns true, if platform proxy settings should be used.
*/
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 void setCredentials(AuthenticationType authType, AuthenticationCredentials credentials, boolean savePassword) {
String key = getKeyPrefix(authType);
setBooleanProperty(key + SAVE_PASSWORD, savePassword);
if (credentials == null) {
setBooleanProperty(key + ENABLED, false);
transientProperties.remove(key + PASSWORD);
addAuthInfo(null, null, key + USERNAME, key + PASSWORD);
} else {
setBooleanProperty(key + ENABLED, true);
if (savePassword) {
addAuthInfo(credentials.getUserName(), credentials.getPassword(), key + USERNAME, key + PASSWORD);
transientProperties.remove(key + PASSWORD);
} else {
addAuthInfo(credentials.getUserName(), null, key + USERNAME, key + PASSWORD);
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);
}
}
/**
* @deprecated use esetCredentials(AuthenticationType, AuthenticationCredentials, boolean)
*/
@Deprecated
public void setHttpAuthenticationCredentials(String username, String password) {
setCredentials(AuthenticationType.HTTP, username, password);
}
public void setOffline(boolean offline) {
setBooleanProperty(OFFLINE, 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) {
Assert.isLegal(!key.matches(".*\\s.*")); //$NON-NLS-1$
String oldValue = this.properties.get(key);
if ((oldValue != null && !oldValue.equals(newValue)) || (oldValue == null && newValue != null)) {
this.properties.put(key.intern(), (newValue != null) ? newValue.intern() : null);
notifyChangeListeners(key, oldValue, newValue);
}
}
private void setBooleanProperty(String key, boolean newValue) {
setProperty(key, Boolean.toString(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.intern());
}
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) {
setBooleanProperty(TaskRepository.PROXY_USEDEFAULT, useDefaultProxy);
}
/**
* If this repository was automatically created from a template <code>value</code> should be set to true.
*
* @since 3.5
* @see #isCreatedFromTemplate()
*/
public void setCreatedFromTemplate(boolean value) {
setBooleanProperty(TaskRepository.CREATED_FROM_TEMPLATE, value);
}
/**
* Returns true, if this repository was automatically created from a template.
*
* @since 3.5
* @see #setCreatedFromTemplate(boolean)
*/
public boolean isCreatedFromTemplate() {
return "true".equals(getProperty(CREATED_FROM_TEMPLATE)); //$NON-NLS-1$
}
/**
* @since 3.9
*/
public String getCategory() {
return getProperty(IRepositoryConstants.PROPERTY_CATEGORY);
}
/**
* @since 3.9
*/
public void setCategory(String category) {
setProperty(IRepositoryConstants.PROPERTY_CATEGORY, category);
}
private ILocationService getService() {
return service;
}
}