blob: e833c1cb8b510df4fefac5d2e1247eb62f3d19be [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2010 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.p2.repository.spi;
import java.net.URI;
import java.util.Map;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.equinox.internal.p2.core.helpers.OrderedProperties;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.repository.IRepository;
/**
* AbstractRepository defines common properties that may be provided by various kinds
* of repositories.
* <p>
* Clients may extend this class.
* </p>
* @param <T> the type of object that can be queried for in this repository
* @since 2.0
*/
public abstract class AbstractRepository<T> extends PlatformObject implements IRepository<T> {
private final IProvisioningAgent agent;
private String description;
private transient URI location;
private String name;
private Map<String, String> properties = new OrderedProperties();
private String provider;
private String type;
private String version;
/**
* Creates a new repository with the given attributes.
*
* @param agent the provisioning agent to be used by this repository
* @param name the repository name
* @param type the repository type
* @param version the repository version
* @param location the repository location
* @param description the repository description
* @param provider the repository provider
* @param properties the repository properties
*/
protected AbstractRepository(IProvisioningAgent agent, String name, String type, String version, URI location, String description, String provider, Map<String, String> properties) {
this.agent = agent;
this.name = name;
this.type = type;
this.version = version;
this.location = location;
this.description = description == null ? "" : description; //$NON-NLS-1$
this.provider = provider == null ? "" : provider; //$NON-NLS-1$
if (properties != null)
this.properties.putAll(properties);
}
/**
* Asserts that this repository is modifiable, throwing a runtime exception if
* it is not. This is suitable for use by subclasses when an attempt is made
* to write to a repository.
*/
protected void assertModifiable() {
if (!isModifiable())
throw new UnsupportedOperationException("Repository not modifiable: " + location); //$NON-NLS-1$
}
/**
* Returns a brief description of the repository.
* @return the description of the repository.
*/
public synchronized String getDescription() {
return description;
}
/**
* Returns the location of this repository.
* TODO: Should we use URL or URI? URL requires a protocol handler
* to be installed in Java. Can the URL have any protocol?
* @return the URL of the repository.
*/
public synchronized URI getLocation() {
return location;
}
/**
* Returns the name of the repository.
* @return the name of the repository.
*/
public synchronized String getName() {
return name;
}
/**
* Returns a read-only collection of the properties of the repository.
* @return the properties of this repository.
*/
public synchronized Map<String, String> getProperties() {
return OrderedProperties.unmodifiableProperties(properties);
}
/**
* {@inheritDoc}
*/
public String getProperty(String key) {
return properties.get(key);
}
/**
* Returns the name of the provider of the repository.
* @return the provider of this repository.
*/
public synchronized String getProvider() {
return provider;
}
/**
* Returns the provisioning agent used by this repository
*
* @return the provisioning agent
*/
public IProvisioningAgent getProvisioningAgent() {
return agent;
}
/**
* Returns a string representing the type of the repository.
* @return the type of the repository.
*/
public synchronized String getType() {
return type;
}
/**
* Returns a string representing the version for the repository type.
* @return the version of the type of the repository.
*/
public synchronized String getVersion() {
return version;
}
/**
* {@inheritDoc}
*/
public boolean isModifiable() {
return false;
}
/**
* Sets the description of this repository
*
* @param description the repository description
*/
public synchronized void setDescription(String description) {
this.description = description;
}
/**
* Sets the name of this repository
*
* @param value the repository name
*/
public synchronized void setName(String value) {
this.name = value;
}
/**
* {@inheritDoc}
*/
public synchronized String setProperty(String key, String value) {
assertModifiable();
if (key.equals(IRepository.PROP_NAME)) {
String oldName = getName();
setName(value);
return oldName;
}
return (value == null ? properties.remove(key) : properties.put(key, value));
}
/**
* Sets the provider of this repository
*
* @param provider the repository provider
*/
public synchronized void setProvider(String provider) {
this.provider = provider;
}
/**
* Sets the type of this repository
*
* @param type the repository type
*/
protected synchronized void setType(String type) {
this.type = type;
}
/**
* Sets the location of this repository
*
* @param location the repository location
*/
protected synchronized void setLocation(URI location) {
this.location = location;
}
/**
* Sets the version of this repository
*
* @param version the repository version
*/
protected synchronized void setVersion(String version) {
this.version = version;
}
/**
* Sets the properties of this repository
*
* @param properties the repository provider
*/
protected synchronized void setProperties(Map<String, String> properties) {
this.properties = properties;
}
}