/*************************************************************************
* (c) Copyright 2016 Hewlett Packard Enterprise Development Company LP
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
************************************************************************/
package com.eucalyptus.simplequeue.persistence;
import java.util.Map;
import java.util.function.Function;
import com.eucalyptus.cassandra.common.Cassandra;
import com.eucalyptus.cassandra.common.CassandraPersistence;
import com.eucalyptus.component.Topology;
import com.eucalyptus.simplequeue.Constants;
import com.eucalyptus.simplequeue.common.policy.SimpleQueueResourceName;
import com.eucalyptus.simplequeue.config.SimpleQueueProperties;
import com.eucalyptus.simplequeue.persistence.cassandra.CassandraMessagePersistence;
import com.eucalyptus.simplequeue.persistence.cassandra.CassandraQueuePersistence;
import com.eucalyptus.simplequeue.persistence.postgresql.PostgresqlMessagePersistence;
import com.eucalyptus.simplequeue.persistence.postgresql.PostgresqlQueuePersistence;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableMap;
import javaslang.Tuple;
import javaslang.Tuple2;
/**
* Created by ethomas on 9/7/16.
*/
public class PersistenceFactory {
private static final String defaultPersistence = "postgres";
private static final Map<String, Tuple2<QueuePersistence,MessagePersistence>> persistenceMap =
ImmutableMap.<String,Tuple2<QueuePersistence,MessagePersistence>>builder( )
.put( "cassandra", Tuple.of( CassandraQueuePersistence.external( ), CassandraMessagePersistence.external( ) ) )
.put( "euca-cassandra", Tuple.of( CassandraQueuePersistence.internal( ), CassandraMessagePersistence.internal( ) ) )
.put( defaultPersistence, Tuple.of( new PostgresqlQueuePersistence( ), new PostgresqlMessagePersistence( ) ) )
.build( );
public static QueuePersistence getQueuePersistence( ) {
return persistence( Tuple2::_1 );
}
public static MessagePersistence getMessagePersistence( ) {
return persistence( Tuple2::_2 );
}
public static boolean queueHasMessages(SimpleQueueResourceName ern) {
// TODO: make a new persistence method somewhere
Queue queue = getQueuePersistence().lookupQueue(ern.getAccount(), ern.getResourceName());
if (queue == null) {
return false;
}
return Long.parseLong(getMessagePersistence().getApproximateMessageCounts(queue.getKey()).get(Constants.APPROXIMATE_NUMBER_OF_MESSAGES)) > 0;
}
private static <P> P persistence( Function<Tuple2<QueuePersistence,MessagePersistence>,P> extractor ) {
return extractor.apply( persistenceMap.getOrDefault(
resolveAuto( MoreObjects.firstNonNull( SimpleQueueProperties.DB_TO_USE, defaultPersistence ) ),
persistenceMap.get( defaultPersistence ) ) );
}
private static String resolveAuto( final String dbToUse ) {
if ( "auto".equals( dbToUse ) ) {
return Topology.isEnabled( Cassandra.class ) ?
"euca-cassandra" :
defaultPersistence;
}
return dbToUse;
}
}