/*******************************************************************************
* Copyright (c) 2008, 2014 Stuart McCulloch
* 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:
* Stuart McCulloch - initial API and implementation
*******************************************************************************/
package org.eclipse.sisu.peaberry.internal;
import java.util.Map;
import org.eclipse.sisu.peaberry.AttributeFilter;
import org.eclipse.sisu.peaberry.ServiceRegistry;
import org.eclipse.sisu.peaberry.ServiceWatcher;
import org.eclipse.sisu.peaberry.builders.DecoratedServiceBuilder;
import org.eclipse.sisu.peaberry.builders.ExportProvider;
import org.eclipse.sisu.peaberry.builders.ImportDecorator;
import org.eclipse.sisu.peaberry.builders.ProxyProvider;
import com.google.inject.Key;
/**
* Default {@link DecoratedServiceBuilder} implementation.
*
* @author mcculls@gmail.com (Stuart McCulloch)
*/
@SuppressWarnings("PMD.TooManyMethods")
public final class ServiceBuilderImpl<T>
implements DecoratedServiceBuilder<T> {
// current builder state (can be cloned)
private final ServiceSettings<T> settings;
public ServiceBuilderImpl(final Key<T> key) {
settings = new ServiceSettings<T>(key);
}
public ServiceBuilderImpl(final T instance) {
settings = new ServiceSettings<T>(instance);
}
public ServiceBuilderImpl<T> decoratedWith(final Key<? extends ImportDecorator<? super T>> key) {
settings.setDecorator(Setting.newSetting(key));
return this;
}
public ServiceBuilderImpl<T> decoratedWith(final ImportDecorator<? super T> instance) {
settings.setDecorator(Setting.<ImportDecorator<? super T>> newSetting(instance));
return this;
}
public ServiceBuilderImpl<T> attributes(final Key<? extends Map<String, ?>> key) {
settings.setAttributes(Setting.newSetting(key));
return this;
}
public ServiceBuilderImpl<T> attributes(final Map<String, ?> instance) {
settings.setAttributes(Setting.<Map<String, ?>> newSetting(instance));
return this;
}
public ServiceBuilderImpl<T> filter(final Key<? extends AttributeFilter> key) {
settings.setFilter(Setting.newSetting(key));
return this;
}
public ServiceBuilderImpl<T> filter(final AttributeFilter instance) {
settings.setFilter(Setting.newSetting(instance));
return this;
}
public ServiceBuilderImpl<T> in(final Key<? extends ServiceRegistry> key) {
settings.setRegistry(Setting.newSetting(key));
return this;
}
public ServiceBuilderImpl<T> in(final ServiceRegistry instance) {
settings.setRegistry(Setting.newSetting(instance));
return this;
}
public ServiceBuilderImpl<T> out(final Key<? extends ServiceWatcher<? super T>> key) {
settings.setWatcher(Setting.newSetting(key));
return this;
}
public ServiceBuilderImpl<T> out(final ServiceWatcher<? super T> instance) {
settings.setWatcher(Setting.<ServiceWatcher<? super T>> newSetting(instance));
return this;
}
public ProxyProvider<T> single() {
return new SingleServiceProvider<T>(settings);
}
public ProxyProvider<Iterable<T>> multiple() {
return new MultipleServiceProvider<T>(settings);
}
public ExportProvider<T> export() {
return new ExportedServiceProvider<T>(settings);
}
}