/******************************************************************************* * Copyright (c) 2011, 2014 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.equinox.coordinator; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; import org.eclipse.osgi.util.NLS; import org.osgi.service.coordinator.Coordination; import org.osgi.service.coordinator.CoordinationException; import org.osgi.service.log.LogService; public class CoordinationWeakReference extends WeakReference<CoordinationReferent> { private static final ReferenceQueue<CoordinationReferent> referenceQueue = new ReferenceQueue<CoordinationReferent>(); public static void processOrphanedCoordinations() { CoordinationWeakReference r; while ((r = (CoordinationWeakReference)referenceQueue.poll()) != null) { CoordinationImpl c = r.getCoordination(); if (!c.isEnding()) { try { c.fail(Coordination.ORPHANED); } catch (Exception e) { c.getLogService().log(LogService.LOG_WARNING, NLS.bind(Messages.OrphanedCoordinationError, c.getName(), c.getId()), e); } finally { try { c.end(); } catch (CoordinationException e) { // This is expected since we already failed the coordination... if (!Coordination.ORPHANED.equals(e.getCause())) // ...but only if the cause is ORPHANED. c.getLogService().log(LogService.LOG_DEBUG, NLS.bind(Messages.OrphanedCoordinationError, c.getName(), c.getId()), e); } catch (Exception e) { c.getLogService().log(LogService.LOG_WARNING, NLS.bind(Messages.OrphanedCoordinationError, c.getName(), c.getId()), e); } } } } } private final CoordinationImpl coordination; public CoordinationWeakReference(CoordinationReferent referent, CoordinationImpl coordination) { super(referent, referenceQueue); if (coordination == null) throw new NullPointerException(); this.coordination = coordination; } public CoordinationImpl getCoordination() { return coordination; } }