package org.incha.ui; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.incha.core.JavaProjectsModel; import org.incha.core.JavaProject; import org.incha.core.ModelSerializer; import org.incha.utils.CollectionUtils; public class ModelSaver implements PropertyChangeListener { /** * Logger. */ private static final Log log = LogFactory.getLog(ModelSaver.class); /** * Model. */ private final JavaProjectsModel model; /** * File to save model. */ private final File file; private PropertyChangeListener buildPathLitener = new PropertyChangeListener() { @Override public void propertyChange(final PropertyChangeEvent evt) { save(); } }; /** * @param model model to save. * @param f target file. */ public ModelSaver(final JavaProjectsModel model, final File f) { super(); this.model = model; this.file = f; model.addPropertyChangeListener(this); //synchronize state for (final JavaProject p : model.getProjects()) { p.getBuildPath().addPropertyChangeListener(buildPathLitener); } } /* (non-Javadoc) * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent) */ @SuppressWarnings("unchecked") @Override public void propertyChange(final PropertyChangeEvent evt) { CollectionUtils.synchronize( (List<JavaProject>) evt.getOldValue(), (List<JavaProject>) evt.getNewValue(), new CollectionUtils.SynchHandler<JavaProject>() { /* (non-Javadoc) * @see org.incha.utils.CollectionUtils.SynchHandler#itemAdded(java.lang.Object) */ @Override public void itemAdded(final JavaProject item) { projectAdded(item); } /* (non-Javadoc) * @see org.incha.utils.CollectionUtils.SynchHandler#itemDeleted(java.lang.Object) */ @Override public void itemDeleted(final JavaProject item) { projectDeleted(item); } }); } /** * @param item */ protected void projectDeleted(final JavaProject item) { item.getBuildPath().removePropertyChangeListener(buildPathLitener); save(); } /** * @param item */ protected void projectAdded(final JavaProject item) { item.getBuildPath().addPropertyChangeListener(buildPathLitener); save(); } /** * Starts save application thread. */ private void save() { log.info("Save application"); new Thread("Save application thread") { @Override public void run() { doSave(); }; }.start(); } /** * Saves the application. */ public synchronized void doSave() { try { final Writer wr = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))); try { new ModelSerializer().save(model, wr); } finally { wr.close(); } } catch (final Exception e) { log.error("Failed to save model", e); } } }