/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.usergrid.persistence.qakka.core.impl;
import com.google.inject.Inject;
import org.apache.commons.lang3.StringUtils;
import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
import org.apache.usergrid.persistence.qakka.core.QakkaUtils;
import org.apache.usergrid.persistence.qakka.core.Queue;
import org.apache.usergrid.persistence.qakka.core.QueueManager;
import org.apache.usergrid.persistence.qakka.core.Regions;
import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
import org.apache.usergrid.persistence.qakka.serialization.queuemessages.MessageCounterSerialization;
import org.apache.usergrid.persistence.qakka.serialization.queues.DatabaseQueue;
import org.apache.usergrid.persistence.qakka.serialization.queues.QueueSerialization;
import org.apache.usergrid.persistence.qakka.serialization.sharding.Shard;
import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardSerialization;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
public class QueueManagerImpl implements QueueManager {
private static final Logger logger = LoggerFactory.getLogger( QueueManagerImpl.class );
private final ActorSystemFig actorSystemFig;
private final QueueSerialization queueSerialization;
private final DistributedQueueService distributedQueueService;
private final ShardSerialization shardSerialization;
private final MessageCounterSerialization messageCounterSerialization;
@Inject
public QueueManagerImpl(
ActorSystemFig actorSystemFig,
QueueSerialization queueSerialization,
DistributedQueueService distributedQueueService,
ShardSerialization shardSerialization,
MessageCounterSerialization messageCounterSerialization) {
this.actorSystemFig = actorSystemFig;
this.queueSerialization = queueSerialization;
this.distributedQueueService = distributedQueueService;
this.shardSerialization = shardSerialization;
this.messageCounterSerialization = messageCounterSerialization;
}
@Override
public void createQueue(Queue queue) {
logger.info("Creating queue with name: {}", queue.getName());
List<String> regions = new ArrayList<>();
if ( Regions.LOCAL.equals( queue.getRegions() ) || StringUtils.isEmpty( queue.getRegions() ) ) {
regions.add( actorSystemFig.getRegionLocal() );
} else if ( Regions.ALL.equals( queue.getRegions() )) {
for ( String region : actorSystemFig.getRegionsList().split(",")) {
regions.add( region );
}
} else {
for (String region : queue.getRegions().split( "," )) {
regions.add( region );
}
}
Shard available = new Shard( queue.getName(), actorSystemFig.getRegionLocal(),
Shard.Type.DEFAULT, 1L, QakkaUtils.getTimeUuid());
shardSerialization.createShard( available );
Shard inflight = new Shard( queue.getName(), actorSystemFig.getRegionLocal(),
Shard.Type.INFLIGHT, 1L, QakkaUtils.getTimeUuid());
shardSerialization.createShard( inflight );
// only write the existence of a queue to the database if its dependent initial shards have been written
queueSerialization.writeQueue(queue.toDatabaseQueue());
// init counters
messageCounterSerialization.incrementCounter( queue.getName(), DatabaseQueueMessage.Type.DEFAULT, 0L );
messageCounterSerialization.incrementCounter( queue.getName(), DatabaseQueueMessage.Type.INFLIGHT, 0L );
//distributedQueueService.initQueue( queue.getName() );
distributedQueueService.refreshQueue( queue.getName() );
}
@Override
public void updateQueueConfig(Queue queue) {
queueSerialization.writeQueue(queue.toDatabaseQueue());
//distributedQueueService.initQueue( queue.getName() );
distributedQueueService.refreshQueue( queue.getName() );
}
@Override
public void deleteQueue(String queueName) {
queueSerialization.deleteQueue(queueName);
// TODO: implement delete queue for Akka, stop schedulers, etc.
//qas.deleteQueue(queueName);
}
@Override
public Queue getQueueConfig(String queueName) {
DatabaseQueue databaseQueue = queueSerialization.getQueue(queueName);
if ( databaseQueue != null ) {
return new Queue( databaseQueue );
}
return null;
}
@Override
public List<String> getListOfQueues() {
return queueSerialization.getListOfQueues();
}
}