/*
* Copyright (C) 2012-2015 DataStax Inc.
*
* 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.datastax.driver.osgi.impl;
import com.datastax.driver.core.BoundStatement;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.Session;
import com.datastax.driver.mapping.Mapper;
import com.datastax.driver.mapping.MappingManager;
import com.datastax.driver.osgi.api.MailboxException;
import com.datastax.driver.osgi.api.MailboxMessage;
import com.datastax.driver.osgi.api.MailboxService;
import static com.datastax.driver.core.querybuilder.QueryBuilder.*;
import static com.datastax.driver.osgi.api.MailboxMessage.TABLE;
public class MailboxImpl implements MailboxService {
private final Session session;
private final String keyspace;
private volatile boolean initialized = false;
private PreparedStatement retrieveStatement;
private PreparedStatement deleteStatement;
private Mapper<MailboxMessage> mapper;
public MailboxImpl(Session session, String keyspace) {
this.session = session;
this.keyspace = keyspace;
}
public synchronized void init() {
if (initialized)
return;
retrieveStatement = session.prepare(select()
.from(keyspace, TABLE)
.where(eq("recipient", bindMarker())));
deleteStatement = session.prepare(delete().from(keyspace, TABLE)
.where(eq("recipient", bindMarker())));
MappingManager mappingManager = new MappingManager(session);
mapper = mappingManager.mapper(MailboxMessage.class);
initialized = true;
}
@Override
public Iterable<MailboxMessage> getMessages(String recipient) throws MailboxException {
try {
BoundStatement statement = new BoundStatement(retrieveStatement);
statement.setString(0, recipient);
return mapper.map(session.execute(statement));
} catch (Exception e) {
throw new MailboxException(e);
}
}
@Override
public long sendMessage(MailboxMessage message) throws MailboxException {
try {
mapper.save(message);
return message.getDate();
} catch (Exception e) {
throw new MailboxException(e);
}
}
@Override
public void clearMailbox(String recipient) throws MailboxException {
try {
BoundStatement statement = new BoundStatement(deleteStatement);
statement.setString(0, recipient);
session.execute(statement);
} catch (Exception e) {
throw new MailboxException(e);
}
}
}