package br.uff.ic.dyevc.model;
//~--- non-JDK imports --------------------------------------------------------
import br.uff.ic.dyevc.exception.RepositoryReferencedException;
import br.uff.ic.dyevc.exception.ServiceException;
import br.uff.ic.dyevc.persistence.TopologyDAO;
import br.uff.ic.dyevc.utils.PreferencesManager;
import br.uff.ic.dyevc.utils.StringUtils;
//~--- JDK imports ------------------------------------------------------------
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.swing.table.AbstractTableModel;
/**
* Models a list of monitored repositories as an AbstractListModel
*
* @author Cristiano
*/
public final class MonitoredRepositories extends AbstractTableModel {
private static final long serialVersionUID = -7567721142354738718L;
private static final List<MonitoredRepository> monitoredRepositories =
Collections.synchronizedList(new ArrayList<MonitoredRepository>());
private static final List<MonitoredRepository> markedForDeletion =
Collections.synchronizedList(new ArrayList<MonitoredRepository>());
private static MonitoredRepositories instance = null;
/** Field description */
public static final String MONITORED_PROJECTS = "monitoredProjects";
public static synchronized MonitoredRepositories getInstance() {
if (instance == null) {
instance = new MonitoredRepositories();
PreferencesManager.getInstance().loadMonitoredRepositories();
}
return instance;
}
/**
* Get the value of monitoredProjects
*
* @return the value of monitoredProjects
*/
public static List<MonitoredRepository> getMarkedForDeletion() {
return markedForDeletion;
}
/**
* Get the value of monitoredProjects
*
* @return the value of monitoredProjects
*/
public static List<MonitoredRepository> getMonitoredProjects() {
return monitoredRepositories;
}
/**
* Get an instance of a monitored repository by name
*
* @param id Name of the desired monitored repository
*
* @return the required monitored repository
*/
public static MonitoredRepository getMonitoredProjectById(String id) {
for (MonitoredRepository monitoredRepository : monitoredRepositories) {
if (monitoredRepository.getId().equals(id)) {
return monitoredRepository;
}
}
return null;
}
/**
* Get an instance of a monitored repository by clone address
*
* @param cloneAddress Clone address of the desired monitored repository
* @return the required monitored repository
*/
public static MonitoredRepository getMonitoredProjectByPath(String cloneAddress) {
for (MonitoredRepository monitoredRepository : monitoredRepositories) {
if (monitoredRepository.getNormalizedCloneAddress().equals(StringUtils.normalizePath(cloneAddress))) {
return monitoredRepository;
}
}
return null;
}
/**
* Add an instance of a monitored repository
*
* @param repository the instance to be added
*/
public synchronized void addMonitoredRepository(MonitoredRepository repository) {
int index = -1;
for (MonitoredRepository rep : monitoredRepositories) {
if (rep.getId().equals(repository.getId())) {
index = monitoredRepositories.indexOf(rep);
break;
}
}
if (index >= 0) {
monitoredRepositories.set(index, repository);
fireTableRowsUpdated(index, index);
} else {
if (repository.isMarkedForDeletion()) {
markedForDeletion.add(repository);
} else {
index = monitoredRepositories.size();
monitoredRepositories.add(repository);
fireTableRowsInserted(index, index);
}
}
}
/**
* Stops monitoring a repository and remove it from the database. If it is
* still referenced, then only marks it for deletion. The TopologyMonitor
* will later verify if it can be removed
*
* @param repository the repository to be removed
*
* @return true, if the repository existed and false otherwise
* @throws RepositoryReferencedException when there are references to this
* repositories
* @throws ServiceException when it is not possible to access the underlying
* database
*/
public synchronized boolean removeMonitoredRepository(MonitoredRepository repository)
throws RepositoryReferencedException, ServiceException {
int index = monitoredRepositories.indexOf(repository);
boolean rv = false;
if (index >= 0) {
TopologyDAO dao = new TopologyDAO();
try {
Date lastChanged = dao.deleteRepository(repository.getSystemName(), repository.getId(), true);
repository.setLastChanged(lastChanged);
} catch (RepositoryReferencedException rre) {
monitoredRepositories.remove(repository);
repository.setMarkedForDeletion(true);
markedForDeletion.add(repository);
PreferencesManager.getInstance().persistRepositories();
fireTableRowsDeleted(index, index);
throw rre;
}
rv = monitoredRepositories.remove(repository);
PreferencesManager.getInstance().persistRepositories();
fireTableRowsDeleted(index, index);
}
return rv;
}
/**
* Remove an instance of a monitored repository previously marked for
* deletion that is not referenced anymore. If the repository is still still
* referenced, then throws an exception.
*
* @param repository the repository to be removed
*
* @return true, if the instance existed and false otherwise
* @throws br.uff.ic.dyevc.exception.RepositoryReferencedException
* @throws br.uff.ic.dyevc.exception.ServiceException
*/
public synchronized boolean removeMarkedForDeletion(MonitoredRepository repository)
throws RepositoryReferencedException, ServiceException {
int index = markedForDeletion.indexOf(repository);
boolean rv = false;
if (index >= 0) {
TopologyDAO dao = new TopologyDAO();
try {
Date lastChanged = dao.deleteRepository(repository.getSystemName(), repository.getId(), true);
repository.setLastChanged(lastChanged);
} catch (RepositoryReferencedException rre) {
throw rre;
}
rv = markedForDeletion.remove(repository);
PreferencesManager.getInstance().persistRepositories();
fireTableRowsDeleted(index, index);
}
return rv;
}
/**
* Closes the connection established in each of the monitored repositories.
*/
public synchronized void closeRepositories() {
for (MonitoredRepository rep : monitoredRepositories) {
rep.close();
}
}
@Override
public int getRowCount() {
return monitoredRepositories.size();
}
@Override
public int getColumnCount() {
return 5;
}
@Override
public String getColumnName(int column) {
String result = null;
switch (column) {
case 0 :
result = "Status";
break;
case 1 :
result = "System Name";
break;
case 2 :
result = "Clone Name";
break;
case 3 :
result = "ID";
break;
case 4 :
result = "Clone Path";
break;
}
return result;
}
@Override
public Class getColumnClass(int columnIndex) {
Class result;
switch (columnIndex) {
case 0 :
result = MonitoredRepository.class;
break;
default :
result = String.class;
}
return result;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
MonitoredRepository rep = monitoredRepositories.get(rowIndex);
Object result = null;
switch (columnIndex) {
case 0 :
result = rep;
break;
case 1 :
result = rep.getSystemName();
break;
case 2 :
result = rep.getName();
break;
case 3 :
result = rep.getId();
break;
case 4 :
result = rep.getCloneAddress();
break;
}
return result;
}
}