package fi.otavanopisto.muikku.plugins.dnm.service;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Schedule;
import javax.ejb.Singleton;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import org.apache.commons.lang3.StringUtils;
import fi.otavanopisto.muikku.events.ContextDestroyedEvent;
import fi.otavanopisto.muikku.events.ContextInitializedEvent;
import fi.otavanopisto.muikku.model.workspace.WorkspaceEntity;
import fi.otavanopisto.muikku.plugins.dnm.DeusNexMachinaController;
import fi.otavanopisto.muikku.plugins.workspace.WorkspaceMaterialController;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceNode;
import fi.otavanopisto.muikku.schooldata.WorkspaceEntityController;
@Singleton
@Lock(LockType.READ)
public class DeusNexServiceDownloadUpdater {
@Inject
private Logger logger;
@Inject
private WorkspaceEntityController workspaceEntityController;
@Inject
private WorkspaceMaterialController workspaceMaterialController;
@Inject
private RestClient client;
@Inject
private DeusNexMachinaController deusNexMachinaController;
@Inject
private DeusNexImportQueueController deusNexImportQueueController;
@PostConstruct
public void init() {
running = false;
contextInitialized = false;
}
public void onContextInitialized(@Observes ContextInitializedEvent event) {
contextInitialized = true;
}
public void onContextDestroyed(@Observes ContextDestroyedEvent event) {
contextInitialized = false;
}
@Schedule(hour = "*", minute = "*", second = "*/20", persistent = false)
public void downloadNext() {
if (contextInitialized) {
if (!running) {
running = true;
try {
Long pendingDownload = deusNexImportQueueController.getNextPendingDownload();
if (pendingDownload != null) {
logger.info(String.format("Processing dnm document #%d", pendingDownload));
try {
Document document = client.getDocument(pendingDownload);
if (document != null) {
logger.info(String.format("Downloading dnm document #%d (%s)", document.getId(), document.getPath()));
String documentData = client.getDocumentData(pendingDownload);
if (documentData != null) {
String path = document.getPath();
int slashIndex = path.indexOf('/');
String workspacePath = slashIndex > -1 ? path.substring(slashIndex + 1) : null;
String dnmId = slashIndex > -1 ? path.substring(0, slashIndex) : path;
Long workspaceEntityId = deusNexMachinaController.getWorkspaceEntityIdDnmId(dnmId);
WorkspaceEntity workspaceEntity = workspaceEntityController.findWorkspaceEntityById(workspaceEntityId);
if (workspaceEntity != null) {
if ("[_FPF_]".equals(workspacePath)) {
logger.info(String.format("Importing front-page document #%d into workspace %s", document.getId(), workspaceEntity.getUrlName()));
InputStream documentStream = new ByteArrayInputStream(documentData.getBytes("UTF-8"));
try {
deusNexMachinaController.importFrontPageDocument(workspaceEntity, documentStream);
} finally {
documentStream.close();
}
} else if ("[_HELP_PAGE_]".equals(workspacePath)){
logger.info(String.format("Importing help-page document #%d into workspace %s", document.getId(), workspaceEntity.getUrlName()));
InputStream documentStream = new ByteArrayInputStream(documentData.getBytes("UTF-8"));
try {
deusNexMachinaController.importHelpPageDocument(workspaceEntity, documentStream);
} finally {
documentStream.close();
}
} else {
WorkspaceNode parentNode = null;
if (StringUtils.isBlank(workspacePath)) {
parentNode = workspaceMaterialController.findWorkspaceRootFolderByWorkspaceEntity(workspaceEntity);
} else {
String[] pathElements = workspacePath.split("/");
parentNode = workspaceMaterialController.findWorkspaceRootFolderByWorkspaceEntity(workspaceEntity);
WorkspaceNode parent = parentNode;
for (int i = 0, l = pathElements.length; i < l; i++) {
String pathElement = pathElements[i];
parentNode = workspaceMaterialController.findWorkspaceNodeByParentAndUrlName(parent, pathElement);
if (parentNode == null) {
parentNode = workspaceMaterialController.createWorkspaceFolder(parent, pathElement, pathElement);
}
parent = parentNode;
}
}
logger.info(String.format("Importing dnm document #%d into workspace %s", document.getId(), workspaceEntity.getUrlName()));
InputStream documentStream = new ByteArrayInputStream(documentData.getBytes("UTF-8"));
try {
deusNexMachinaController.importDeusNexDocument(parentNode, documentStream);
} finally {
documentStream.close();
}
}
deusNexImportQueueController.removePendingDownload(pendingDownload);
deusNexImportQueueController.addDownloaded(document.getId());
logger.info(String.format("Processed dnm document #%d (%s)", document.getId(), document.getPath()));
} else {
logger.log(Level.WARNING, String.format("Ignoring import for document %s because maching workspace could not be found", document.getPath()));
}
} else {
logger.severe(String.format("Pending dnm document %d did not contain any data", pendingDownload));
}
} else {
logger.severe(String.format("Pending dnm document %d could not be found", pendingDownload));
}
} catch (Exception e) {
logger.warning(String.format("Dnm document %d processing failed, added it back to queue: " + e.getMessage(), pendingDownload));
}
}
} finally {
running = false;
}
}
}
}
private boolean contextInitialized;
private boolean running;
}