/* * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.services.jcr.ext.backup.impl; import org.exoplatform.services.jcr.core.ManageableRepository; import org.exoplatform.services.jcr.ext.backup.BackupConfig; import org.exoplatform.services.jcr.ext.backup.BackupJob; import org.exoplatform.services.jcr.ext.backup.BackupJobListener; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URL; import java.util.Calendar; import java.util.LinkedHashSet; import java.util.Set; /** * Created by The eXo Platform SAS * * Date: 05.02.2008 * * @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a> * @version $Id: AbstrackBackupJob.java 760 2008-02-07 15:08:07Z pnedonosko $ */ public abstract class AbstractBackupJob implements BackupJob { protected volatile int state; protected int id; protected BackupConfig config; protected ManageableRepository repository; protected String workspaceName; protected Calendar timeStamp; protected URL url; private Set<BackupJobListener> listeners = new LinkedHashSet<BackupJobListener>(); class NotifyThread extends Thread { protected final BackupJobListener[] listeners; protected final BackupJob job; NotifyThread(BackupJobListener[] listeners, BackupJob job) { super("NotifyThread"); super.setDaemon(true); // The Java Virtual Machine exits when the only threads running are all // daemon threads. this.listeners = listeners; this.job = job; } @Override public void run() { for (BackupJobListener l : listeners) { l.onStateChanged(job); } } } class ErrorNotifyThread extends NotifyThread { private final Throwable error; private final String message; ErrorNotifyThread(BackupJobListener[] listeners, BackupJob job, String message, Throwable error) { super(listeners, job); setName("ErrorNotifyThread"); this.error = error; this.message = message; } @Override public void run() { for (BackupJobListener l : listeners) { l.onError(job, message, error); } } } public AbstractBackupJob() { this.state = STARTING; } /** * This method is called by run() and resume() Backup implementation knows how to create new * storage * * @return URL of new storage */ protected abstract URL createStorage() throws FileNotFoundException, IOException; /** * @see org.exoplatform.services.jcr.ext.backup.BackupJob#getStorageURL() */ public final URL getStorageURL() { return url; } public final int getState() { return state; } public final int getId() { return id; } public void addListener(BackupJobListener listener) { if (listener != null) synchronized (listeners) { listeners.add(listener); } } public void removeListener(BackupJobListener listener) { if (listener != null) synchronized (listeners) { listeners.remove(listener); } } /** * Notify all listeners about the job state changed */ protected void notifyListeners() { synchronized (listeners) { Thread notifier = new NotifyThread(listeners.toArray(new BackupJobListener[listeners.size()]), this); notifier.start(); } } /** * Notify all listeners about an error * * @param error * - Throwable instance */ protected void notifyError(String message, Throwable error) { synchronized (listeners) { Thread notifier = new ErrorNotifyThread(listeners.toArray(new BackupJobListener[listeners.size()]), this, message, error); notifier.start(); } } }