package crmdna.sequence;
import com.googlecode.objectify.Work;
import crmdna.client.Client;
import crmdna.common.api.APIException;
import crmdna.common.api.APIResponse.Status;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static crmdna.common.OfyService.ofy;
class SequenceCore {
static List<Long> getNext(final String client, final String type, final int numElements) {
Client.ensureValid(client);
if (numElements < 1)
throw new APIException(
"numElements should be > 0 when calling getNext in Sequence. Current value: ["
+ numElements + "]").status(Status.ERROR_RESOURCE_INCORRECT);
if ((type == null) || (type.equals("")))
throw new APIException("Specified type [" + type
+ "] is either null or empty string when calling Sequence.getNext")
.status(Status.ERROR_RESOURCE_INCORRECT);
List<Long> next = ofy(client).transact(new Work<List<Long>>() {
@Override
public List<Long> run() {
String id = type.toUpperCase();
SequenceEntity sequenceEntity = ofy(client).load().type(SequenceEntity.class).id(id).now();
if (null == sequenceEntity) {
sequenceEntity = new SequenceEntity();
sequenceEntity.id = id;
sequenceEntity.counter = 0;
}
long initialValue = sequenceEntity.counter;
List<Long> list = new ArrayList<>(numElements);
for (Long i = 0l; i < numElements; i++)
list.add(initialValue + i + 1);
long finalValue = initialValue + numElements;
sequenceEntity.counter = finalValue;
ofy(client).save().entity(sequenceEntity).now();
return list;
}
});
return Collections.unmodifiableList(next);
}
}