blob: 1a9bdce5a44f93238ba8e8f084e0a84bd3dc4512 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* VMware Inc. - initial contribution
*******************************************************************************/
package org.eclipse.virgo.nano.management.deployer;
import javax.management.ListenerNotFoundException;
import javax.management.MBeanNotificationInfo;
import javax.management.Notification;
import javax.management.NotificationBroadcaster;
import javax.management.NotificationBroadcasterSupport;
import javax.management.NotificationFilter;
import javax.management.NotificationListener;
import org.eclipse.virgo.nano.deployer.api.RecoveryMonitor;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
/**
* Monitors the process of the deployer recovery process.
* <p/>
*
* <strong>Concurrent Semantics</strong><br />
*
* Threadsafe.
*
*/
public class StandardRecoveryMonitor implements NotificationBroadcaster, RecoveryMonitor, EventHandler {
private static final String TOPIC_RECOVERY_COMPLETED = "org/eclipse/virgo/kernel/deployer/recovery/COMPLETED";
private final NotificationBroadcasterSupport broadcasterSupport = new NotificationBroadcasterSupport();
private final Object monitor = new Object();
private boolean recoveryComplete = false;
/**
* {@inheritDoc}
*/
public boolean isRecoveryComplete() {
synchronized (this.monitor) {
return this.recoveryComplete;
}
}
private void signalRecoveryComplete() {
boolean sendNotification = false;
synchronized (this.monitor) {
if (!this.recoveryComplete) {
this.recoveryComplete = true;
sendNotification = true;
}
}
if (sendNotification) {
this.broadcasterSupport.sendNotification(new Notification(NOTIFICATION_TYPE, this, 1));
}
}
/**
* {@inheritDoc}
*/
public void addNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) throws IllegalArgumentException {
this.broadcasterSupport.addNotificationListener(listener, filter, handback);
}
/**
* {@inheritDoc}
*/
public MBeanNotificationInfo[] getNotificationInfo() {
return new MBeanNotificationInfo[] { new MBeanNotificationInfo(new String[] { NOTIFICATION_TYPE }, Notification.class.getName(),
"Deployer Recovery Complete Notification.") };
}
/**
* {@inheritDoc}
*/
public void removeNotificationListener(NotificationListener listener) throws ListenerNotFoundException {
this.broadcasterSupport.removeNotificationListener(listener);
}
/**
* {@inheritDoc}
*/
public void handleEvent(Event event) {
if (TOPIC_RECOVERY_COMPLETED.equals(event.getTopic())) {
signalRecoveryComplete();
}
}
}