package com.constellio.app.modules.rm.ui.pages.email;
import static com.constellio.app.ui.i18n.i18n.$;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Map.Entry;
import com.constellio.model.services.contents.icap.IcapException;
import org.apache.commons.io.IOUtils;
import com.constellio.app.modules.rm.navigation.RMViews;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.wrappers.Document;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.ui.pages.base.SingleSchemaBasePresenter;
import com.constellio.app.ui.params.ParamUtils;
import com.constellio.app.ui.util.MessageUtils;
import com.constellio.model.entities.records.Content;
import com.constellio.model.entities.records.ContentVersion;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.records.wrappers.UserDocument;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.services.contents.ContentManager;
import com.constellio.model.services.contents.ContentVersionDataSummary;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
public class AddEmailAttachmentsToFolderPresenter extends SingleSchemaBasePresenter<AddEmailAttachmentsToFolderView> {
private String userDocumentId;
private transient RecordServices recordServices;
private transient ContentManager contentManager;
private transient RMSchemasRecordsServices rmSchemasRecordsServices;
public AddEmailAttachmentsToFolderPresenter(AddEmailAttachmentsToFolderView view) {
super(view, Document.DEFAULT_SCHEMA);
initTransientObjects();
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
initTransientObjects();
}
private void initTransientObjects() {
recordServices = modelLayerFactory.newRecordServices();
contentManager = modelLayerFactory.getContentManager();
rmSchemasRecordsServices = new RMSchemasRecordsServices(collection, appLayerFactory);
}
@Override
protected boolean hasPageAccess(String params, User user) {
return true;
}
void forParams(String params) {
Map<String, String> paramsMap = ParamUtils.getParamsMap(params);
this.userDocumentId = paramsMap.get("userDocumentId");
}
@SuppressWarnings("unchecked")
void saveButtonClicked() {
String folderId = view.getFolderId();
if (folderId == null) {
view.showErrorMessage($("AddEmailAttachmentsToFolderView.folderRequired"));
} else {
boolean noExceptionDisplayed = true;
Folder folder = rmSchemasRecordsServices.getFolder(folderId);
Record emailRecord = recordServices.getDocumentById(userDocumentId);
MetadataSchemaTypes types = types();
UserDocument userDocument = new UserDocument(emailRecord, types);
String filename = userDocument.getContent().getCurrentVersion().getFilename();
ContentVersion emailContentVersion = userDocument.getContent().getCurrentVersion();
InputStream messageInputStream = contentManager.getContentInputStream(emailContentVersion.getHash(),
"AddEmailAttachmentsToFolderPresenter.saveButtonClicked");
try {
Map<String, Object> parsedEmail = rmSchemasRecordsServices.parseEmail(filename, messageInputStream);
Map<String, InputStream> emailAttachments = (Map<String, InputStream>) parsedEmail
.get(RMSchemasRecordsServices.EMAIL_ATTACHMENTS);
for (Entry<String, InputStream> emailAttachment : emailAttachments.entrySet()) {
String attachmentFilename = emailAttachment.getKey();
InputStream attachmentIn = emailAttachment.getValue();
try {
Document attachmentDocument = rmSchemasRecordsServices.newDocument();
attachmentDocument.setTitle(attachmentFilename);
ContentVersionDataSummary attachmentSummary = uploadContent(attachmentIn, true, true, attachmentFilename);
Content attachmentContent = contentManager
.createMajor(getCurrentUser(), attachmentFilename, attachmentSummary);
attachmentDocument.setContent(attachmentContent);
attachmentDocument.setFolder(folder);
recordServices.add(attachmentDocument.getWrappedRecord());
} catch (RecordServicesException e) {
view.showErrorMessage(MessageUtils.toMessage(e));
noExceptionDisplayed = false;
} catch (final IcapException e) {
view.showErrorMessage(e.getMessage());
noExceptionDisplayed = false;
}finally {
IOUtils.closeQuietly(attachmentIn);
}
}
} finally {
IOUtils.closeQuietly(messageInputStream);
}
if (noExceptionDisplayed) {
delete(userDocument.getWrappedRecord());
view.navigate().to(RMViews.class).displayFolder(folderId);
}
}
}
public void cancelButtonClicked() {
view.navigate().to(RMViews.class).listUserDocuments();
}
}