/*
* Copyright (c) 2014 Dennis Fischer.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0+
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors: Dennis Fischer
*/
package de.chaosfisch.uploader.persistence.dao;
import com.google.common.eventbus.EventBus;
import com.google.inject.Inject;
import de.chaosfisch.google.youtube.upload.Status;
import de.chaosfisch.google.youtube.upload.Upload;
import de.chaosfisch.google.youtube.upload.events.UploadAdded;
import de.chaosfisch.google.youtube.upload.events.UploadRemoved;
import de.chaosfisch.google.youtube.upload.events.UploadUpdated;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
class UploadDaoImpl implements IUploadDao {
private final List<Upload> uploads = new CopyOnWriteArrayList<>();
@Inject
private EventBus eventBus;
@Inject
private IPersistenceService persistenceService;
@Override
public List<Upload> getAll() {
return uploads;
}
@Override
public Upload get(final String id) {
for (final Upload upload : uploads) {
if (upload.getId().equals(id)) {
return upload;
}
}
return null;
}
@Override
public Upload fetchNextUpload() {
if (uploads.isEmpty()) {
return null;
}
final List<Upload> result = new ArrayList<>(uploads.size());
for (final Upload upload : uploads) {
if (null == upload.getDateTimeOfStart() || upload.getDateTimeOfStart().isBeforeNow()) {
final Status status = upload.getStatus();
if (!status.isArchived() && !status.isFailed() && !status.isRunning() && !status.isLocked() && !status.isAborted()) {
result.add(upload);
}
}
}
sortList(result);
return result.isEmpty() ? null : result.get(0);
}
@Override
public List<Upload> fetchByArchived(final boolean archived) {
final List<Upload> result = new ArrayList<>(uploads.size());
for (final Upload upload : uploads) {
final Status status = upload.getStatus();
if (status.isArchived() == archived) {
result.add(upload);
}
}
return result;
}
@Override
public long fetchStarttimeDelay() {
if (uploads.isEmpty()) {
return -1;
}
final long time = System.currentTimeMillis();
long delay = -1;
for (final Upload upload : uploads) {
final Status status = upload.getStatus();
if (null != upload.getDateTimeOfStart() && !status.isArchived() && !status.isFailed() && !status.isRunning() && !status
.isLocked() && !status.isAborted()) {
if (-1 == delay || upload.getDateTimeOfStart().isBefore(delay)) {
delay = upload.getDateTimeOfStart().getMillis();
}
}
}
return -1 == delay ? -1 : delay < time ? 0 : delay - System.currentTimeMillis();
}
private void sortList(final List<Upload> list) {
final Upload[] uploads = new Upload[list.size()];
list.toArray(uploads);
Arrays.sort(uploads, new Comparator<Upload>() {
@Override
public int compare(final Upload o1, final Upload o2) {
final boolean o1Null = null == o1.getDateTimeOfStart();
final boolean o2Null = null == o2.getDateTimeOfStart();
if (o1Null || o2Null) {
return o1Null && o2Null ? Integer.compare(o2.getOrder(), o1.getOrder()) : o1Null ? 1 : -1;
}
return o1.getDateTimeOfStart().compareTo(o2.getDateTimeOfStart());
}
});
list.clear();
list.addAll(Arrays.asList(uploads));
}
@Override
public void setUploads(final List<Upload> uploads) {
this.uploads.clear();
this.uploads.addAll(uploads);
}
@Override
public List<Upload> getUploads() {
sortList(uploads);
return uploads;
}
@Override
public void insert(final Upload upload) {
upload.setId(UUID.randomUUID().toString());
uploads.add(upload);
persistenceService.saveToStorage();
eventBus.post(new UploadAdded(upload));
}
@Override
public void update(final Upload upload) {
persistenceService.saveToStorage();
eventBus.post(new UploadUpdated(upload));
}
@Override
public void delete(final Upload upload) {
uploads.remove(upload);
persistenceService.saveToStorage();
eventBus.post(new UploadRemoved(upload));
}
@Override
public int count() {
return getAll().size();
}
@Override
public int countUnprocessed() {
int count = 0;
for (final Upload upload : uploads) {
final Status status = upload.getStatus();
if (!status.isArchived() && !status.isFailed() && !status.isLocked() && !status.isAborted()) {
count++;
}
}
return count;
}
@Override
public long countReadyStarttime() {
int count = 0;
for (final Upload upload : uploads) {
final Status status = upload.getStatus();
if (!status.isArchived() && !status.isFailed() && !status.isLocked() && !status.isAborted()) {
if (null != upload.getDateTimeOfStart() && upload.getDateTimeOfStart().isBeforeNow()) {
count++;
}
}
}
return count;
}
@Override
public void resetUnfinishedUploads() {
for (final Upload upload : uploads) {
final Status status = upload.getStatus();
if (!status.isArchived()) {
status.setFailed(false);
status.setRunning(false);
status.setAborted(false);
}
}
}
}