package com.constellio.app.modules.es.connectors.http;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.List;
import org.apache.commons.io.FileUtils;
import com.constellio.app.modules.es.services.ESSchemasRecordsServices;
import com.constellio.data.dao.managers.config.ConfigManager;
import com.constellio.data.dao.managers.config.ConfigManagerException.OptimisticLockingConfiguration;
import com.constellio.data.dao.managers.config.values.BinaryConfiguration;
import com.constellio.data.utils.ImpossibleRuntimeException;
public class ConnectorHttpContextServices {
private static final String URLS_TEMP_FILE_READING_RESOURCE = "ConnectorHttpContextServices-UrlsTempFileReading";
private static final String URLS_TEMP_FILE_WRITING_RESOURCE = "ConnectorHttpContextServices-UrlsTempFileWriting";
private static final String URLS_TEMP_FILE_INPUTSTREAM_RESOURCE = "ConnectorHttpContextServices-UrlsTempFileInputStream";
private static final String URLS_TEMP_FILE_OUTPUTSTREAM_RESOURCE = "ConnectorHttpContextServices-UrlsTempFileOutputStream";
private static final String URLS_CONFIG_INPUTSTREAM_RESOURCE = "ConnectorHttpContextServices-UrlsConfigInputStream";
private static final String WRITE_URLS_TO_FILE_RESOURCE = "InMemoryFetchedUrlsList-WriteUrlsToFile";
ESSchemasRecordsServices es;
public ConnectorHttpContextServices(ESSchemasRecordsServices es) {
this.es = es;
}
public void save(ConnectorHttpContext context) {
save(context, false);
}
private void save(ConnectorHttpContext context, boolean add) {
File tempFile = es.getIOServices().newTemporaryFile(URLS_TEMP_FILE_WRITING_RESOURCE);
InputStream tempFileInputStream = null;
try {
ConfigManager configManager = es.getModelLayerFactory().getDataLayerFactory().getConfigManager();
saveTo(context, tempFile);
tempFileInputStream = es.getIOServices().newBufferedFileInputStream(tempFile, URLS_TEMP_FILE_INPUTSTREAM_RESOURCE);
String path = "/connectors/http/" + context.getConnectorId() + "/fetchedUrls.txt";
if (add) {
configManager.add(path, tempFileInputStream);
} else {
String hash = configManager.getBinary(path).getHash();
configManager.update(path, hash, tempFileInputStream);
}
} catch (IOException e) {
throw new RuntimeException(e);
} catch (OptimisticLockingConfiguration e) {
throw new ImpossibleRuntimeException(e);
} finally {
es.getIOServices().closeQuietly(tempFileInputStream);
es.getIOServices().deleteQuietly(tempFile);
}
}
private void saveTo(ConnectorHttpContext context, File file) {
ObjectOutputStream outputStream = null;
try {
outputStream = new ObjectOutputStream(new BufferedOutputStream(
es.getIOServices().newBufferedFileOutputStream(file, URLS_TEMP_FILE_OUTPUTSTREAM_RESOURCE)));
outputStream.writeObject(context);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
es.getIOServices().closeQuietly(outputStream);
}
}
public ConnectorHttpContext createContext(String connectorId) {
ConnectorHttpContext connectorHttpContext = new ConnectorHttpContext(connectorId);
save(connectorHttpContext, true);
return connectorHttpContext;
}
public ConnectorHttpContext loadContext(String connectorId) {
ConfigManager configManager = es.getModelLayerFactory().getDataLayerFactory().getConfigManager();
String path = "/connectors/http/" + connectorId + "/fetchedUrls.txt";
BinaryConfiguration binaryConfiguration = configManager.getBinary(path);
ObjectInputStream binaryConfigurationInputStream = null;
try {
binaryConfigurationInputStream = new ObjectInputStream(new BufferedInputStream(
binaryConfiguration.getInputStreamFactory().create(URLS_CONFIG_INPUTSTREAM_RESOURCE)));
return (ConnectorHttpContext) binaryConfigurationInputStream.readObject();
} catch (IOException | ClassNotFoundException e) {
throw new RuntimeException(e);
} finally {
es.getIOServices().closeQuietly(binaryConfigurationInputStream);
}
}
private ConnectorHttpContext loadFrom(String connectorId, File file) {
List<String> lines;
try {
lines = FileUtils.readLines(file);
} catch (IOException e) {
throw new RuntimeException(e);
}
ConnectorHttpContext fetchedUrlsList = new ConnectorHttpContext(connectorId);
for (String line : lines) {
fetchedUrlsList.markAsFetched(line);
}
return fetchedUrlsList;
}
public void deleteContext(String connectorId) {
ConfigManager configManager = es.getModelLayerFactory().getDataLayerFactory().getConfigManager();
String path = "/connectors/http/" + connectorId + "/fetchedUrls.txt";
configManager.delete(path);
}
}