use of com.zimbra.cs.object.ObjectHandlerException in project zm-mailbox by Zimbra.
the class ParsedMessage method analyzePart.
/**
* @return Extracted toplevel text (any text that should go into the toplevel indexed document)
*/
private String analyzePart(boolean isMainBody, MPartInfo mpi) throws MessagingException, ServiceException {
boolean ignoreCalendar;
if (calendarPartInfo == null) {
ignoreCalendar = isBouncedCalendar(mpi);
} else {
ignoreCalendar = true;
}
String methodParam = (new ContentType(mpi.getMimePart().getContentType())).getParameter("method");
if (methodParam == null && !LC.calendar_allow_invite_without_method.booleanValue()) {
ignoreCalendar = true;
}
String toRet = "";
try {
// ignore multipart "container" parts
if (mpi.isMultipart()) {
return toRet;
}
String ctype = mpi.getContentType();
MimeHandler handler = MimeHandlerManager.getMimeHandler(ctype, mpi.getFilename());
assert (handler != null);
handler.setDefaultCharset(defaultCharset);
Mime.repairTransferEncoding(mpi.getMimePart());
if (handler.isIndexingEnabled()) {
handler.init(mpi.getMimePart().getDataHandler().getDataSource());
handler.setPartName(mpi.getPartName());
handler.setFilename(mpi.getFilename());
handler.setSize(mpi.getSize());
// remember the first iCalendar attachment
if (!ignoreCalendar && calendarPartInfo == null) {
ZVCalendar cal = handler.getICalendar();
if (cal != null) {
setCalendarPartInfo(mpi, cal);
}
}
// - IndexAttachments was set and !disableIndexingAttachmentsTogether
if ((isMainBody && (!handler.runsExternally() || indexAttachments)) || (indexAttachments && !DebugConfig.disableIndexingAttachmentsTogether)) {
toRet = handler.getContent();
}
if (indexAttachments && !DebugConfig.disableIndexingAttachmentsSeparately) {
// Each non-text MIME part is also indexed as a separate
// Lucene document. This is necessary so that we can tell the
// client what parts match if a search matched a particular
// part.
IndexDocument doc = new IndexDocument(handler.getDocument());
String filename = handler.getFilename();
if (!Strings.isNullOrEmpty(filename)) {
filenames.add(filename);
}
doc.addSortSize(mpi.getMimePart().getSize());
luceneDocuments.add(setLuceneHeadersFromContainer(doc));
}
}
// make sure we've got the text/calendar handler installed
if (!ignoreCalendar && calendarPartInfo == null && ctype.equals(MimeConstants.CT_TEXT_CALENDAR)) {
if (handler.isIndexingEnabled()) {
ZimbraLog.index.warn("TextCalendarHandler not correctly installed");
}
InputStream is = null;
try {
String charset = mpi.getContentTypeParameter(MimeConstants.P_CHARSET);
if (charset == null || charset.trim().isEmpty()) {
charset = MimeConstants.P_CHARSET_DEFAULT;
}
is = mpi.getMimePart().getInputStream();
ZVCalendar cal = ZCalendarBuilder.build(is, charset);
if (cal != null) {
setCalendarPartInfo(mpi, cal);
}
} catch (IOException ioe) {
ZimbraLog.index.warn("error reading text/calendar mime part", ioe);
} finally {
ByteUtil.closeStream(is);
}
}
} catch (MimeHandlerException e) {
handleParseError(mpi, e);
} catch (ObjectHandlerException e) {
handleParseError(mpi, e);
}
return toRet;
}
use of com.zimbra.cs.object.ObjectHandlerException in project zm-mailbox by Zimbra.
the class ParsedContact method analyzeContact.
private void analyzeContact(Account acct, boolean indexAttachments) throws ServiceException {
if (indexDocs != null) {
return;
}
indexDocs = new ArrayList<IndexDocument>();
StringBuilder attachContent = new StringBuilder();
ServiceException conversionError = null;
if (contactAttachments != null) {
for (Attachment attach : contactAttachments) {
try {
analyzeAttachment(attach, attachContent, indexAttachments);
} catch (MimeHandlerException e) {
String part = attach.getPartName();
String ctype = attach.getContentType();
ZimbraLog.index.warn("Parse error on attachment " + part + " (" + ctype + ")", e);
if (conversionError == null && ConversionException.isTemporaryCauseOf(e)) {
conversionError = ServiceException.FAILURE("failed to analyze part", e.getCause());
mHasTemporaryAnalysisFailure = true;
}
} catch (ObjectHandlerException e) {
String part = attach.getPartName();
String ctype = attach.getContentType();
ZimbraLog.index.warn("Parse error on attachment " + part + " (" + ctype + ")", e);
}
}
}
indexDocs.add(getPrimaryDocument(acct, attachContent.toString()));
}
use of com.zimbra.cs.object.ObjectHandlerException in project zm-mailbox by Zimbra.
the class ParsedMessage method getMainBodyLuceneDocument.
private IndexDocument getMainBodyLuceneDocument(StringBuilder fullContent) throws MessagingException, ServiceException {
IndexDocument doc = new IndexDocument(new Document());
doc.addMimeType(new MimeTypeTokenStream("message/rfc822"));
doc.addPartName(LuceneFields.L_PARTNAME_TOP);
doc.addFrom(getFromTokenStream());
doc.addTo(getToTokenStream());
doc.addCc(getCcTokenStream());
try {
doc.addEnvFrom(new RFC822AddressTokenStream(getMimeMessage().getHeader("X-Envelope-From", ",")));
} catch (MessagingException ignore) {
}
try {
doc.addEnvTo(new RFC822AddressTokenStream(getMimeMessage().getHeader("X-Envelope-To", ",")));
} catch (MessagingException ignore) {
}
String msgId = Strings.nullToEmpty(Mime.getHeader(getMimeMessage(), "message-id"));
if (msgId.length() > 0) {
if (msgId.charAt(0) == '<') {
msgId = msgId.substring(1);
}
if (msgId.charAt(msgId.length() - 1) == '>') {
msgId = msgId.substring(0, msgId.length() - 1);
}
if (msgId.length() > 0) {
doc.addMessageId(msgId);
}
}
// iterate all the message headers, add them to the structured-field data in the index
FieldTokenStream fields = new FieldTokenStream();
MimeMessage mm = getMimeMessage();
List<Part> parts = new ArrayList<Part>();
parts.add(mm);
try {
if (mm.getContent() instanceof ZMimeMultipart) {
ZMimeMultipart content = (ZMimeMultipart) mm.getContent();
int numParts = content.getCount();
for (int i = 0; i < numParts; i++) {
parts.add(content.getBodyPart(i));
}
}
} catch (IOException ignore) {
}
for (Part part : parts) {
Enumeration<?> en = part.getAllHeaders();
while (en.hasMoreElements()) {
Header h = (Header) en.nextElement();
String key = h.getName().trim();
String value = h.getValue();
if (value != null) {
value = MimeUtility.unfold(value).trim();
} else {
value = "";
}
if (key.length() > 0) {
if (value.length() == 0) {
// low-level tokenizer can't deal with blank header value, so we'll index
// some dummy value just so the header appears in the index.
// Users can query for the existence of the header with a query
// like #headername:*
fields.add(key, "_blank_");
} else {
fields.add(key, value);
}
}
}
}
// add key:value pairs to the structured FIELD lucene field
doc.addField(fields);
String subject = getSubject();
doc.addSubject(subject);
// add subject and from to main content for better searching
StringBuilder contentPrepend = new StringBuilder(subject);
// Bug 583: add all of the TOKENIZED versions of the email addresses to our CONTENT field...
appendToContent(contentPrepend, StringUtil.join(" ", getFromTokenStream().getAllTokens()));
appendToContent(contentPrepend, StringUtil.join(" ", getToTokenStream().getAllTokens()));
appendToContent(contentPrepend, StringUtil.join(" ", getCcTokenStream().getAllTokens()));
// bug 33461: add filenames to our CONTENT field
for (String fn : filenames) {
appendToContent(contentPrepend, ZimbraAnalyzer.getAllTokensConcatenated(LuceneFields.L_FILENAME, fn));
// also add the non-tokenized form, so full-filename searches match
appendToContent(contentPrepend, fn);
}
String text = contentPrepend.toString() + " " + fullContent.toString();
doc.addContent(text);
try {
MimeHandler.getObjects(text, doc);
} catch (ObjectHandlerException e) {
ZimbraLog.index.warn("Unable to recognize searchable objects in message: msgid=%s,subject=%s", getMessageID(), getSubject(), e);
}
// Get the list of attachment content types from this message and any TNEF attachments
doc.addAttachments(new MimeTypeTokenStream(Mime.getAttachmentTypeList(messageParts)));
return doc;
}
Aggregations