org.apache.tapestry5.mongodb.modules.MongodbModule.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.tapestry5.mongodb.modules.MongodbModule.java

Source

// Copyright 2013 The Apache Software Foundation
//
// 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 org.apache.tapestry5.mongodb.modules;

import com.mongodb.ReadPreference;
import com.mongodb.WriteConcern;
import org.apache.tapestry5.internal.mongodb.MongoDBImpl;
import org.apache.tapestry5.internal.mongodb.MongoDBSourceImpl;
import org.apache.tapestry5.ioc.Configuration;
import org.apache.tapestry5.ioc.MappedConfiguration;
import org.apache.tapestry5.ioc.ScopeConstants;
import org.apache.tapestry5.ioc.ServiceBinder;
import org.apache.tapestry5.ioc.annotations.Scope;
import org.apache.tapestry5.ioc.annotations.Symbol;
import org.apache.tapestry5.ioc.services.Coercion;
import org.apache.tapestry5.ioc.services.CoercionTuple;
import org.apache.tapestry5.ioc.services.PerthreadManager;
import org.apache.tapestry5.mongodb.MongoDB;
import org.apache.tapestry5.mongodb.MongoDBSource;
import org.apache.tapestry5.mongodb.MongoDBSymbols;
import org.slf4j.Logger;

/**
 * Defines services which are responsible for MongoDB initializations and connections.
 */
public class MongodbModule {
    public static void bind(ServiceBinder binder) {
        binder.bind(MongoDBSource.class, MongoDBSourceImpl.class);
    }

    public static void contributeFactoryDefaults(MappedConfiguration<String, String> configuration) {
        configuration.add(MongoDBSymbols.CONNECTIONS_PER_HOSTS, "10");
        configuration.add(MongoDBSymbols.WRITE_CONCERN, "ACKNOWLEDGED");
        configuration.add(MongoDBSymbols.READ_PREFERENCE, "PRIMARY");
        configuration.add(MongoDBSymbols.CONSISTENT_REQUEST, "false");

        // Authentication (Mongo in secure mode)

        configuration.add(MongoDBSymbols.SECURE_MODE, "false");
        configuration.add(MongoDBSymbols.DB_USERNAME, "");
        configuration.add(MongoDBSymbols.DB_PASSWORD, "");
    }

    @Scope(ScopeConstants.PERTHREAD)
    public static MongoDB buildMongoDB(Logger logger, final MongoDBSource mongoDBSource,
            PerthreadManager perthreadManager, @Symbol(MongoDBSymbols.DEFAULT_DB_NAME) String defaultDbName,
            @Symbol(MongoDBSymbols.CONSISTENT_REQUEST) boolean consistentRequest,
            @Symbol(MongoDBSymbols.SECURE_MODE) boolean secureMode,
            @Symbol(MongoDBSymbols.DB_USERNAME) String dbUsername,
            @Symbol(MongoDBSymbols.DB_PASSWORD) String dbPassword) {
        final MongoDBImpl mongoDB = new MongoDBImpl(logger, mongoDBSource, defaultDbName, consistentRequest,
                secureMode, dbUsername, dbPassword);

        perthreadManager.addThreadCleanupListener(mongoDB);

        return mongoDB;
    }

    /**
     * Contribute coercions for {@link WriteConcern} and {@link ReadPreference} to have them from
     * {@link org.apache.tapestry5.ioc.annotations.Symbol}
     *
     * @param configuration lets help the {@link org.apache.tapestry5.ioc.services.TypeCoercer} service
     */
    public static void contributeTypeCoercer(Configuration<CoercionTuple> configuration) {
        configuration.add(new CoercionTuple(String.class, WriteConcern.class, new Coercion<String, WriteConcern>() {
            public WriteConcern coerce(String input) {
                if (input.equalsIgnoreCase("FSYNC_SAFE")) {
                    return WriteConcern.FSYNC_SAFE;
                } else if (input.equalsIgnoreCase("JOURNAL_SAFE")) {
                    return WriteConcern.JOURNAL_SAFE;
                } else if (input.equalsIgnoreCase("MAJORITY")) {
                    return WriteConcern.MAJORITY;
                } else if (input.equalsIgnoreCase("NONE")) {
                    return WriteConcern.NONE;
                } else if (input.equalsIgnoreCase("REPLICAS_SAFE")) {
                    return WriteConcern.REPLICAS_SAFE;
                } else if (input.equalsIgnoreCase("SAFE")) {
                    return WriteConcern.SAFE;
                } else if (input.equalsIgnoreCase("NORMAL")) {
                    return WriteConcern.NORMAL;
                } else // WriteConcern.ACKNOWLEDGED IS OUR DEFAULT
                {
                    return WriteConcern.ACKNOWLEDGED;
                }
            }
        }));

        configuration
                .add(new CoercionTuple(String.class, ReadPreference.class, new Coercion<String, ReadPreference>() {
                    public ReadPreference coerce(String input) {
                        if (input.equalsIgnoreCase("SECONDARY")) {
                            return ReadPreference.secondary();
                        } else // PRIMARY IS OUR DEFAULT
                        {
                            return ReadPreference.primary();
                        }
                    }
                }));
    }
}