package org.incha.core;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.incha.ui.JSwingRipplesApplication;
/**
* Stores information about the Java Projects and methods for their listeners.
*/
public class JavaProjectsModel {
private static final Log log = LogFactory.getLog(JavaProjectsModel.class);
private static final JavaProjectsModel instance = loadModel();
/**
* Project property name.
*/
public static final String PROJECTS = "projects";
/**
* Property change support.
*/
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
/**
* List of projects.
*/
private final List<JavaProject> projects = new LinkedList<JavaProject>();
/**
* Default constructor.
*/
protected JavaProjectsModel() {
super();
}
/**
* @param prg new project.
*/
public void addProject(final JavaProject prg) {
final JavaProject equals = getProjectByName(prg.getName());
if (equals == null) {
final List<JavaProject> old = new ArrayList<JavaProject>(projects);
projects.add(prg);
firePropertyChange(PROJECTS, old, projects);
}
}
/**
* @param project project to delete.
*/
public void deleteProject(final JavaProject project) {
final JavaProject equals = getProjectByName(project.getName());
if (equals != null) {
final List<JavaProject> old = new ArrayList<JavaProject>(projects);
projects.remove(project);
firePropertyChange(PROJECTS, old, projects);
}
}
/**
* @param name project name.
* @return project by given name.
*/
public JavaProject getProjectByName(final String name) {
for (final JavaProject p : projects) {
if (name.equals(p.getName())) {
return p;
}
}
return null;
}
/**
* @param property property name.
* @param oldValue old property value.
* @param newValue new property value.
*/
protected void firePropertyChange(
final String property, final List<JavaProject> oldValue, final List<JavaProject> newValue) {
pcs.firePropertyChange(property, oldValue, newValue);
}
/**
* @param l property change listener.
*/
public void addPropertyChangeListener(final PropertyChangeListener l) {
pcs.addPropertyChangeListener(l);
}
/**
* @param l property change listener.
*/
public void removePropertyChangeListener(final PropertyChangeListener l) {
pcs.removePropertyChangeListener(l);
}
/**
* @return java projects list.
*/
public List<JavaProject> getProjects() {
return projects;
}
/**
* @param selectedItem
*/
public JavaProject getProject(final String selectedItem) {
for (final JavaProject prg : projects) {
if (prg.getName().equals(selectedItem)) {
return prg;
}
}
return null;
}
/**
* @return
*/
public static JavaProjectsModel getInstance() {
return instance;
}
/**
* Load model from file.
* @return model.
*/
private static JavaProjectsModel loadModel() {
JavaProjectsModel model = new JavaProjectsModel();
final File file = getModelFile();
if (file.exists()) {
try {
final Reader r = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
try {
model = new ModelSerializer().parse(r);
} finally {
r.close();
}
} catch (final Exception e) {
log.error("Failed to parse application file", e);
}
}
return model;
}
/**
* @return
*/
public static File getModelFile() {
return new File(JSwingRipplesApplication.getHome(), "application.xml");
}
}