package br.uff.ic.dyevc.model;
//~--- non-JDK imports --------------------------------------------------------
import br.uff.ic.dyevc.application.IConstants;
import br.uff.ic.dyevc.beans.ApplicationSettingsBean;
import br.uff.ic.dyevc.exception.VCSException;
import br.uff.ic.dyevc.tools.vcs.git.GitConnector;
import br.uff.ic.dyevc.utils.PreferencesManager;
import br.uff.ic.dyevc.utils.StringUtils;
//~--- JDK imports ------------------------------------------------------------
import java.beans.*;
import java.io.Serializable;
import java.util.Date;
/**
* Models a monitored repository. A monitored repository is a repository
* configured to be monitored from time to time.
*
* @author Cristiano
*/
public class MonitoredRepository implements Serializable {
/**
* How the attribute "name" is called
*/
public static final String NAME = "name";
/**
* How the attribute "systemName" is called
*/
public static final String SYSTEM_NAME = "systemName";
/**
* How the attribute "cloneAddress" is called
*/
public static final String PROP_CLONEADDRESS = "cloneAddress";
private PropertyChangeSupport propertySupport;
private static final long serialVersionUID = -8604175800390199323L;
/**
* Name of the system (global known name of the repository).
*/
private String systemName;
/**
* Name of the clone.
*/
private String name;
/**
* Identification of the repository.
*/
private String id;
/**
* Address where the monitored repository is located.
*/
private String cloneAddress;
/**
* Clone address in normalized form (no double or leading backslashes)
*/
private String normalizedCloneAddress;
/**
* Status of the monitored repository.
*
* @see RepositoryStatus
*/
private RepositoryStatus repStatus;
/**
* Status of the monitored repository.
*
* @see RepositoryStatus
*/
private boolean markedForDeletion;
/**
* Connection with the working clone for this monitored repository
*/
private GitConnector workingCloneConnection;
/**
* Connection with the clone for this monitored repository
*/
private GitConnector cloneConnection;
/**
* Last date/time this repository was changed in database
*/
private Date lastChanged;
/**
* Get the value of normalizedCloneAddress
*
* @return the value of normalizedCloneAddress
*/
public String getNormalizedCloneAddress() {
return normalizedCloneAddress;
}
/**
* Get the value of cloneAddress
*
* @return the value of cloneAddress
*/
public String getCloneAddress() {
return cloneAddress;
}
/**
* Get the path to working clone
*
* @return the path to working clone
*/
public String getWorkingCloneAddress() {
ApplicationSettingsBean settings = PreferencesManager.getInstance().loadPreferences();
String pathTemp = settings.getWorkingPath() + IConstants.DIR_SEPARATOR + getId();
return pathTemp;
}
/**
* Set the value of cloneAddress
*
* @param cloneAddress new value of cloneAddress
*/
public void setCloneAddress(String cloneAddress) {
String oldCloneAddress = this.cloneAddress;
this.cloneAddress = cloneAddress;
this.normalizedCloneAddress = StringUtils.normalizePath(cloneAddress);
propertySupport.firePropertyChange(PROP_CLONEADDRESS, oldCloneAddress, cloneAddress);
}
/**
* Constructs an object of this type.
*
* @param id
*/
public MonitoredRepository(String id) {
this.name = "";
this.systemName = "";
this.cloneAddress = "";
this.id = id;
this.repStatus = new RepositoryStatus("");
this.markedForDeletion = false;
propertySupport = new PropertyChangeSupport(this);
}
public String getName() {
return name;
}
public void setName(String value) {
String oldValue = name;
name = value;
propertySupport.firePropertyChange(NAME, oldValue, name);
}
public String getSystemName() {
return systemName;
}
public void setSystemName(String value) {
String oldValue = systemName;
systemName = value;
propertySupport.firePropertyChange(SYSTEM_NAME, oldValue, systemName);
}
public boolean hasSystemName() {
return ((systemName != null) &&!systemName.equals("") &&!systemName.equals("no name"));
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertySupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertySupport.removePropertyChangeListener(listener);
}
@Override
public String toString() {
return new StringBuilder("Repository{systemName=").append(systemName).append(", name=").append(name).append(
", id=").append(id).append(", cloneAddress=").append(cloneAddress).append("}").toString();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public RepositoryStatus getRepStatus() {
return repStatus;
}
public void setRepStatus(RepositoryStatus repStatus) {
this.repStatus = repStatus;
}
/**
* Gets the git connector for this monitored repository
*
* @return the git connector for this monitored repository
* @throws VCSException
*/
public synchronized GitConnector getConnection() throws VCSException {
if (cloneConnection == null) {
cloneConnection = new GitConnector(this.cloneAddress, this.id);
}
return cloneConnection;
}
/**
* Gets the git connection for the working clone of this monitored
* repository
*
* @return the git connector for the working clone of this monitored
* repository
* @throws VCSException
*/
public synchronized GitConnector getWorkingCloneConnection() throws VCSException {
if (workingCloneConnection == null) {
workingCloneConnection = new GitConnector(this.getWorkingCloneAddress(), this.id);
}
return workingCloneConnection;
}
/**
* Sets the git connection for the working clone of this monitored
* repository. If a connection is already set, then close it before setting
* the new one.
*
* @param connection the connection to be set
* @throws VCSException
*/
public synchronized void setWorkingCloneConnection(GitConnector connection) throws VCSException {
if (this.workingCloneConnection != null) {
this.workingCloneConnection.close();
}
this.workingCloneConnection = connection;
}
public boolean isMarkedForDeletion() {
return markedForDeletion;
}
public void setMarkedForDeletion(boolean markedForDeletion) {
this.markedForDeletion = markedForDeletion;
}
public Date getLastChanged() {
return lastChanged;
}
public void setLastChanged(Date lastChanged) {
this.lastChanged = lastChanged;
}
/**
* Close connection established with the working clone If a connection is
* not established for a particular monitored, does nothing.
*/
public void close() {
if (workingCloneConnection != null) {
workingCloneConnection.close();
}
}
}