/**
* Copyright (C) 2010 Lowereast Software
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.mattinsler.guiceymongo.guice.spi;
import com.google.inject.Binder;
import com.google.inject.Module;
import com.mattinsler.guiceymongo.data.IsData;
import com.mattinsler.guiceymongo.guice.spi.Builders.BucketConfiguration;
import com.mattinsler.guiceymongo.guice.spi.Builders.BucketOptionConfiguration;
import com.mattinsler.guiceymongo.guice.spi.Builders.CollectionConfiguration;
import com.mattinsler.guiceymongo.guice.spi.Builders.CollectionConfigurationOnlyTo;
import com.mattinsler.guiceymongo.guice.spi.Builders.DatabaseConfiguration;
import com.mattinsler.guiceymongo.guice.spi.Builders.DatabaseOptionConfiguration;
import com.mattinsler.guiceymongo.guice.spi.Builders.FinishableConfiguration;
public final class BuilderImpls {
public static class Configuration implements Builders.Configuration, Builders.FinishableConfiguration {
private final String _name;
private final GuiceyMongoBindingCollector _collector = new GuiceyMongoBindingCollector();
public Configuration(String name) {
_name = name;
}
public Module cloneFrom(String configurationName) {
_collector.bindClonedConfiguration(_name, configurationName);
return this;
}
public Builders.CollectionConfiguration mapCollection(String collectionKey) {
return new Collection(this, collectionKey);
}
public Builders.DatabaseConfiguration mapDatabase(String databaseKey) {
return new Database(this, databaseKey);
}
public BucketConfiguration mapBucket(String bucketKey) {
return new Bucket(this, bucketKey);
}
public void configure(Binder binder) {
new GuiceyMongoBinder(binder.skipSources(Configuration.class, Database.class, Collection.class)).bind(_collector);
}
String getName() {
return _name;
}
GuiceyMongoBindingCollector getCollector() {
return _collector;
}
}
private static class Database implements Builders.DatabaseConfiguration, Builders.DatabaseOptionConfiguration {
private final Configuration _configuration;
private final String _databaseKey;
public Database(Configuration configuration, String databaseKey) {
_configuration = configuration;
_databaseKey = databaseKey;
}
public void configure(Binder binder) {
_configuration.configure(binder);
}
public CollectionConfiguration mapCollection(String collectionKey) {
return _configuration.mapCollection(collectionKey);
}
public DatabaseConfiguration mapDatabase(String databaseKey) {
return _configuration.mapDatabase(databaseKey);
}
public FinishableConfiguration overConnection(String connectionKey) {
_configuration.getCollector().bindConfiguredDatabaseConnection(_configuration.getName(), _databaseKey, connectionKey);
return _configuration;
}
public DatabaseOptionConfiguration to(String database) {
_configuration.getCollector().bindConfiguredDatabase(_configuration.getName(), _databaseKey, database);
return this;
}
public BucketConfiguration mapBucket(String bucketKey) {
return _configuration.mapBucket(bucketKey);
}
public DatabaseOptionConfiguration asTestDatabase() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
}
private static class Collection implements Builders.CollectionConfiguration, Builders.CollectionConfigurationOnlyTo, Builders.CollectionOptionConfiguration {
private final Configuration _configuration;
private final String _collectionKey;
private String _collection;
public Collection(Configuration configuration, String collectionKey) {
_configuration = configuration;
_collectionKey = collectionKey;
}
public CollectionConfigurationOnlyTo ofType(Class<? extends IsData> dataType) {
_configuration.getCollector().bindConfiguredCollectionDataType(_configuration.getName(), _collectionKey, dataType);
return this;
}
public Builders.CollectionOptionConfiguration to(String collection) {
_collection = collection;
return this;
}
public Builders.FinishableConfiguration inDatabase(String databaseKey) {
_configuration.getCollector().bindConfiguredCollection(_configuration.getName(), databaseKey, _collectionKey, _collection);
return _configuration;
}
}
private static class Bucket implements Builders.BucketConfiguration, Builders.BucketOptionConfiguration {
private final Configuration _configuration;
private final String _bucketKey;
private String _bucket;
public Bucket(Configuration configuration, String bucketKey) {
_configuration = configuration;
_bucketKey = bucketKey;
}
public FinishableConfiguration inDatabase(String databaseKey) {
_configuration.getCollector().bindConfiguredBucket(_configuration.getName(), databaseKey, _bucketKey, _bucket);
return _configuration;
}
public BucketOptionConfiguration to(String bucket) {
_bucket = bucket;
return this;
}
}
public static class Connection implements Builders.Connection, Builders.ConnectionWithHost, Builders.ConnectionWithPort {
private final String _name;
private String _hostname;
private int _port = -1;
public Connection(String name) {
_name = name;
}
public Builders.ConnectionWithHost host(String hostname) {
_hostname = hostname;
return this;
}
public Builders.ConnectionWithPort port(int port) {
_port = port;
return this;
}
public void configure(Binder binder) {
GuiceyMongoBinder guiceyBinder = new GuiceyMongoBinder(binder.skipSources(Connection.class));
if (_hostname != null)
guiceyBinder.bindConnectionHostname(_name, _hostname);
if (_port != -1)
guiceyBinder.bindConnectionPort(_name, _port);
}
}
}