/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.toolkit.core.internal;
import java.util.List;
import org.apache.commons.logging.LogFactory;
import de.rcenvironment.toolkit.core.api.ImmutableServiceRegistry;
import de.rcenvironment.toolkit.core.api.Toolkit;
/**
* Default {@link Toolkit} implementation.
*
* @author Robert Mischke
*/
final class ToolkitImpl implements Toolkit {
private final ImmutableServiceRegistry serviceRegistry;
private final List<Runnable> shutdownHooks;
private boolean shutdownTriggered = false;
ToolkitImpl(ImmutableServiceRegistry serviceRegistry, List<Runnable> shutdownHooks) {
this.serviceRegistry = serviceRegistry;
this.shutdownHooks = shutdownHooks;
}
@Override
public ImmutableServiceRegistry getServiceRegistry() {
return serviceRegistry;
}
@Override
public <T> T getService(Class<T> serviceClass) {
return serviceRegistry.getService(serviceClass);
}
@Override
public void shutdown() {
synchronized (this) {
if (shutdownTriggered) {
throw new IllegalStateException("Received more than one shutdown() call");
}
shutdownTriggered = true;
}
for (Runnable shutdownHook : shutdownHooks) {
try {
shutdownHook.run();
} catch (RuntimeException e) {
LogFactory.getLog(getClass()).error("Error executing shutdown hook", e);
}
}
ToolkitInstanceTracker.getInstance().markDisposed(this);
}
}