You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ofbiz.apache.org by Si Chen <si...@opensourcestrategies.com> on 2006/11/24 20:01:08 UTC

Fwd: svn commit: r478781 - in /incubator/ofbiz/trunk/applications/content/src/org/ofbiz/content/email: EmailServices.java EmailWorker.java

Hey Hans,

Does this mean we can parse attachments of incoming emails now and  
store them in OFBIZ?

Begin forwarded message:

> From: hansbak@apache.org
> Date: November 23, 2006 10:42:25 PM PST
> To: ofbiz-commits@incubator.apache.org
> Subject: svn commit: r478781 - in /incubator/ofbiz/trunk/ 
> applications/content/src/org/ofbiz/content/email:  
> EmailServices.java EmailWorker.java
> Reply-To: ofbiz-dev@incubator.apache.org
>
> Author: hansbak
> Date: Thu Nov 23 22:42:24 2006
> New Revision: 478781
>
> URL: http://svn.apache.org/viewvc?view=rev&rev=478781
> Log:
> system now accepts incoming email messages with multilevel multiparts
>
> Modified:
>     incubator/ofbiz/trunk/applications/content/src/org/ofbiz/ 
> content/email/EmailServices.java
>     incubator/ofbiz/trunk/applications/content/src/org/ofbiz/ 
> content/email/EmailWorker.java
>
> Modified: incubator/ofbiz/trunk/applications/content/src/org/ofbiz/ 
> content/email/EmailServices.java
> URL: http://svn.apache.org/viewvc/incubator/ofbiz/trunk/ 
> applications/content/src/org/ofbiz/content/email/EmailServices.java? 
> view=diff&rev=478781&r1=478780&r2=478781
> ====================================================================== 
> ========
> --- incubator/ofbiz/trunk/applications/content/src/org/ofbiz/ 
> content/email/EmailServices.java (original)
> +++ incubator/ofbiz/trunk/applications/content/src/org/ofbiz/ 
> content/email/EmailServices.java Thu Nov 23 22:42:24 2006
> @@ -642,6 +642,53 @@
>
>          return allResults;
>      }
> +
> +    public static String contentIndex = "";
> +    private static Map addMessageBody( Map commEventMap, Multipart  
> multipart)
> +	throws MessagingException, IOException {
> +    	try {
> +    		int multipartCount = multipart.getCount();
> +    		for (int i=0; i < multipartCount  && i < 10; i++) {
> +    			Part part = multipart.getBodyPart(i);
> +    			String thisContentTypeRaw = part.getContentType();
> +    			String content = null;
> +    			int idx2 = thisContentTypeRaw.indexOf(";");
> +    			if (idx2 == -1) idx2 = thisContentTypeRaw.length();
> +    			String thisContentType = thisContentTypeRaw.substring(0,  
> idx2);
> +    			if (thisContentType == null || thisContentType.equals(""))  
> thisContentType = "text/html";
> +    			String disposition = part.getDisposition();
> +
> +    			if (thisContentType.startsWith("multipart") ||  
> thisContentType.startsWith("Multipart")) {
> +					contentIndex = contentIndex.concat("." + i);
> +    				return addMessageBody(commEventMap, (Multipart)  
> part.getContent());
> +    			}
> +    			// See this case where the disposition of the inline text  
> is null
> +    			else if ((disposition == null) && (i == 0) &&  
> thisContentType.startsWith("text")) {
> +    				content = (String)part.getContent();
> +    				if (UtilValidate.isNotEmpty(content)) {
> +    					contentIndex = contentIndex.concat("." + i);
> +    					commEventMap.put("content", content);
> +    					commEventMap.put("contentMimeTypeId", thisContentType);
> +    					return commEventMap;
> +    				}
> +    			} else if ((disposition != null)
> +    					&& (disposition.equals(Part.ATTACHMENT) ||  
> disposition.equals(Part.INLINE))
> +    					&& thisContentType.startsWith("text")) {
> +					contentIndex = contentIndex.concat("." + i);
> +    				commEventMap.put("content", part.getContent());
> +    				commEventMap.put("contentMimeTypeId", thisContentType);
> +    				return commEventMap;
> +    			}
> +    		}
> +    		return commEventMap;
> +    	} catch (MessagingException e) {
> +    		Debug.logError(e, module);
> +    		return ServiceUtil.returnError(e.getMessage());
> +        } catch (IOException e) {
> +            Debug.logError(e, module);
> +            return ServiceUtil.returnError(e.getMessage());
> +        }
> +    }
>
>      /**
>       * This service is the main one for processing incoming emails.
> @@ -665,7 +712,9 @@
>       * CommunicationEvent.content field) are cycled thru and  
> attached to the CommunicationEvent entity using the
>       * createCommContentDataResource service. This happens in the  
> EmailWorker.addAttachmentsToCommEvent method.
>       *
> -     * -Al Byers
> +     * However multiparts can contain multiparts. A recursive  
> function has been added.
> +     *
> +     * -Al Byers - Hans Bakker
>       * @param dctx
>       * @param context
>       * @return
> @@ -681,7 +730,6 @@
>          String partyIdTo = null;
>          String partyIdFrom = null;
>          String contentType = null;
> -        String content = null;
>  		String communicationEventId = null;
>          String contactMechIdFrom = null;
>          String contactMechIdTo = null;
> @@ -770,42 +818,13 @@
>  	        commEventMap.put("datetimeEnded", UtilDateTime.toTimestamp 
> (message.getReceivedDate()));
>
>              // get the content(type) part
> -    		int contentIndex = -1;
> -			Multipart multipart = null;
>      		if (contentType.startsWith("text")) {
> -    			content = (String)message.getContent();
> +    			commEventMap.put("content", message.getContent());
>          		commEventMap.put("contentMimeTypeId", contentType);
>      		} else if (contentType.startsWith("multipart") ||  
> contentType.startsWith("Multipart")) {
> -    			multipart = (Multipart) message.getContent();
> -    			int multipartCount = multipart.getCount();
> -    			for (int i=0; i < multipartCount; i++) {
> -    				Part part = multipart.getBodyPart(i);
> -    				String thisContentTypeRaw = part.getContentType();
> -    	            int idx2 = thisContentTypeRaw.indexOf(";");
> -                    if (idx2 == -1) idx2 =  
> thisContentTypeRaw.length();
> -    	            String thisContentType =  
> thisContentTypeRaw.substring(0, idx2);
> -                    if (thisContentType == null ||  
> thisContentType.equals("")) thisContentType = "text/html";
> -                    String disposition = part.getDisposition();
> -    				
> -    				// See this case where the disposition of the inline text  
> is null
> -    				if ((disposition == null) && (i == 0) &&  
> thisContentType.startsWith("text")) {
> -    					content = (String)part.getContent();
> -    					if (UtilValidate.isNotEmpty(content)) {
> -    						contentIndex = i;
> -    						commEventMap.put("contentMimeTypeId", thisContentType);
> -    						break;
> -    					}
> -   			    	} else if ((disposition != null)
> -   						 && (disposition.equals(Part.ATTACHMENT) ||  
> disposition.equals(Part.INLINE))
> -   					     && thisContentType.startsWith("text")) {
> -   			    		content = (String)part.getContent();
> -   			    		contentIndex = i;
> -   			    		commEventMap.put("contentMimeTypeId", thisContentType);
> -   			    		break;
> -   			    	}
> -    			}    			
> -    		}
> -    		commEventMap.put("content", content);
> +    			contentIndex = "";
> +    			commEventMap = addMessageBody(commEventMap, (Multipart)  
> message.getContent());
> +    		}    			
>      		
>              // store from/to parties, but when not found make a  
> note of the email to/from address in the workEffort Note Section.
>              String commNote = "";
> @@ -844,10 +863,9 @@
>      		result = dispatcher.runSync("createCommunicationEvent",  
> commEventMap);
>      		communicationEventId = (String)result.get 
> ("communicationEventId");
>
> -    		// 'system' Id has no partyId but needed for prefix  
> generation of the creation of related contentId and dataresourceId.
>              // store attachements
>      		if (contentType.startsWith("multipart") ||  
> contentType.startsWith("Multipart")) {
> -    			int attachmentCount = EmailWorker.addAttachmentsToCommEvent 
> (message, communicationEventId, contentIndex, dispatcher, userLogin);
> +    			int attachmentCount = EmailWorker.addAttachmentsToCommEvent 
> (message, communicationEventId, dispatcher, userLogin);
>      			if (Debug.infoOn()) Debug.logInfo(attachmentCount + "  
> attachments added to CommunicationEvent:" +  
> communicationEventId,module);
>      		}
>
>
> Modified: incubator/ofbiz/trunk/applications/content/src/org/ofbiz/ 
> content/email/EmailWorker.java
> URL: http://svn.apache.org/viewvc/incubator/ofbiz/trunk/ 
> applications/content/src/org/ofbiz/content/email/EmailWorker.java? 
> view=diff&rev=478781&r1=478780&r2=478781
> ====================================================================== 
> ========
> --- incubator/ofbiz/trunk/applications/content/src/org/ofbiz/ 
> content/email/EmailWorker.java (original)
> +++ incubator/ofbiz/trunk/applications/content/src/org/ofbiz/ 
> content/email/EmailWorker.java Thu Nov 23 22:42:24 2006
> @@ -30,6 +30,7 @@
>  import org.ofbiz.base.util.Debug;
>  import org.ofbiz.service.LocalDispatcher;
>  import org.ofbiz.service.GenericServiceException;
> +import org.ofbiz.service.ServiceUtil;
>  import org.ofbiz.entity.util.ByteWrapper;
>
>  public class EmailWorker {
> @@ -43,9 +44,8 @@
>      	return fieldValue;
>      }
>
> -    public static int addAttachmentsToCommEvent(MimeMessage  
> message, String communicationEventId, int bodyContentIndex,  
> LocalDispatcher dispatcher, GenericValue userLogin)
> +    public static int addAttachmentsToCommEvent(MimeMessage  
> message, String communicationEventId, LocalDispatcher dispatcher,  
> GenericValue userLogin)
>      	throws MessagingException, IOException,  
> GenericServiceException {
> -    	int attachmentCount =0;
>      	Map commEventMap = new HashMap();
>      	commEventMap.put("communicationEventId", communicationEventId);
>      	commEventMap.put("contentTypeId", "DOCUMENT");
> @@ -55,55 +55,76 @@
>  		if (subject != null && subject.length() > 80) {
>  			subject = subject.substring(0,80); // make sure not too big for  
> database field. (20 characters for filename)
>  		}
> -		ByteArrayOutputStream baos = new ByteArrayOutputStream();
> -    	
> -		Multipart multipart = (Multipart)message.getContent();
> -		int multipartCount = multipart.getCount();
> -		for (int i=0; i < multipartCount; i++) {
> -			Part part = multipart.getBodyPart(i);
> -			String thisContentTypeRaw = part.getContentType();
> -            int idx2 = thisContentTypeRaw.indexOf(";");
> -            if (idx2 == -1) idx2 = thisContentTypeRaw.length();
> -            String thisContentType = thisContentTypeRaw.substring 
> (0, idx2);
> -			String disposition = part.getDisposition();
> -			
> -			// The first test should not pass, because if it exists, it  
> should be the bodyContentIndex part
> -			if (((disposition == null) && (i == 0) && (i !=  
> bodyContentIndex)  && thisContentType.startsWith("text"))
> -               || ((disposition != null)
> -					 && (disposition.equals(Part.ATTACHMENT) || disposition.equals 
> (Part.INLINE))
> -				     && (i != bodyContentIndex)) )
> -		    {
> -				String attFileName = part.getFileName();
> -				if (attFileName != null && attFileName.length() > 17) {
> -					attFileName = attFileName.substring(0,17);
> -				}
> -				commEventMap.put("contentName", subject + "-" + i + " " +  
> attFileName);
> -        		commEventMap.put("drMimeTypeId", thisContentType);
> -        		if (thisContentType.startsWith("text")) {
> -        			String content = (String)part.getContent();
> -        			commEventMap.put("drDataResourceTypeId",  
> "ELECTRONIC_TEXT");
> -        			commEventMap.put("textData", content);
> -        		} else {
> -    				
> -        			InputStream is = part.getInputStream();
> -        			int c;
> -        			while ((c = is.read()) > -1) {
> -        				baos.write(c);
> -        			}
> -        			
> -    				ByteWrapper imageData = new ByteWrapper(baos.toByteArray());
> -    				int len = imageData.getLength();
> -    				if (Debug.infoOn()) Debug.logInfo("imageData length: " +  
> len, module);
> -                    commEventMap.put("drDataResourceName",  
> part.getFileName());
> -    				commEventMap.put("imageData", imageData);
> -    				commEventMap.put("drDataResourceTypeId", "IMAGE_OBJECT");
> -            		commEventMap.put("_imageData_contentType",  
> thisContentType);
> -        		}
> -        		dispatcher.runSync("createCommContentDataResource",  
> commEventMap);
> -    			attachmentCount++;
> -		    }
> -		}
> +		currentIndex = "";
> +		attachmentCount = 0;
> +		return addMultipartAttachementToComm((Multipart) 
> message.getContent(), commEventMap, subject, dispatcher, userLogin);
> +
> +    }
> +    private static String currentIndex = "";
> +    private static int attachmentCount = 0;
> +    private static int addMultipartAttachementToComm(Multipart  
> multipart, Map commEventMap, String subject, LocalDispatcher  
> dispatcher, GenericValue userLogin)
> +    throws MessagingException, IOException, GenericServiceException {
> +    	try {
> +    		int multipartCount = multipart.getCount();
> +    		for (int i=0; i < multipartCount; i++) {
> +    			Part part = multipart.getBodyPart(i);
> +    			String thisContentTypeRaw = part.getContentType();
> +    			int idx2 = thisContentTypeRaw.indexOf(";");
> +    			if (idx2 == -1) idx2 = thisContentTypeRaw.length();
> +    			String thisContentType = thisContentTypeRaw.substring(0,  
> idx2);
> +    			String disposition = part.getDisposition();
> +    			ByteArrayOutputStream baos = new ByteArrayOutputStream();
> +
> +    			if (thisContentType.startsWith("multipart") ||  
> thisContentType.startsWith("Multipart")) {
> +    				currentIndex = currentIndex.concat("." + i);
> +    				return	addMultipartAttachementToComm((Multipart)  
> part.getContent(), commEventMap, subject, dispatcher, userLogin);
> +    			}
> +    			
> +    			if(currentIndex.concat("." + i).equals 
> (EmailServices.contentIndex)) continue;
> +
> +    			// The first test should not pass, because if it exists, it  
> should be the bodyContentIndex part
> +    			if (((disposition == null) && (i == 0) &&  
> thisContentType.startsWith("text"))
> +    					|| ((disposition != null)
> +    							&& (disposition.equals(Part.ATTACHMENT) ||  
> disposition.equals(Part.INLINE))
> +    							) )
> +    			{
> +    				String attFileName = part.getFileName();
> +    				if (attFileName != null && attFileName.length() > 17) {
> +    					attFileName = attFileName.substring(0,17);
> +    				}
> +    				commEventMap.put("contentName", subject + "-" +  
> attachmentCount + " " + attFileName);
> +    				commEventMap.put("drMimeTypeId", thisContentType);
> +    				if (thisContentType.startsWith("text")) {
> +    					String content = (String)part.getContent();
> +    					commEventMap.put("drDataResourceTypeId", "ELECTRONIC_TEXT");
> +    					commEventMap.put("textData", content);
> +    				} else {
> +
> +    					InputStream is = part.getInputStream();
> +    					int c;
> +    					while ((c = is.read()) > -1) {
> +    						baos.write(c);
> +    					}
>
> +    					ByteWrapper imageData = new ByteWrapper(baos.toByteArray());
> +    					int len = imageData.getLength();
> +    					if (Debug.infoOn()) Debug.logInfo("imageData length: " +  
> len, module);
> +    					commEventMap.put("drDataResourceName", part.getFileName());
> +    					commEventMap.put("imageData", imageData);
> +    					commEventMap.put("drDataResourceTypeId", "IMAGE_OBJECT");
> +    					commEventMap.put("_imageData_contentType", thisContentType);
> +    				}
> +    				dispatcher.runSync("createCommContentDataResource",  
> commEventMap);
> +    				attachmentCount++;
> +    			}
> +    		}
> +    	} catch (MessagingException e) {
> +    		Debug.logError(e, module);
> +    	} catch (IOException e) {
> +    		Debug.logError(e, module);
> +    	} catch (GenericServiceException e) {
> +    		Debug.logError(e, module);
> +    	}
>      	return attachmentCount;
>      }
>  }
>

Best Regards,

Si
sichen@opensourcestrategies.com




Re: Fwd: svn commit: r478781 - in /incubator/ofbiz/trunk/applications/content/src/org/ofbiz/content/email: EmailServices.java EmailWorker.java

Posted by Hans Bakker <ma...@antwebsystems.com>.
Hi Si,
The current implementation did not recognize multiple attachments within an 
attachement. I have now implemented a recursive function to take care of 
that.

The attachements themselves did work fine before (thanks to Al) but were not 
recognised if they were not at the higest level.

Hans

On Saturday 25 November 2006 02:01, Si Chen wrote:
> Hey Hans,
>
> Does this mean we can parse attachments of incoming emails now and
> store them in OFBIZ?
>
> Begin forwarded message:
> > From: hansbak@apache.org
> > Date: November 23, 2006 10:42:25 PM PST
> > To: ofbiz-commits@incubator.apache.org
> > Subject: svn commit: r478781 - in /incubator/ofbiz/trunk/
> > applications/content/src/org/ofbiz/content/email:
> > EmailServices.java EmailWorker.java
> > Reply-To: ofbiz-dev@incubator.apache.org
> >
> > Author: hansbak
> > Date: Thu Nov 23 22:42:24 2006
> > New Revision: 478781
> >
> > URL: http://svn.apache.org/viewvc?view=rev&rev=478781
> > Log:
> > system now accepts incoming email messages with multilevel multiparts
> >
> > Modified:
> >     incubator/ofbiz/trunk/applications/content/src/org/ofbiz/
> > content/email/EmailServices.java
> >     incubator/ofbiz/trunk/applications/content/src/org/ofbiz/
> > content/email/EmailWorker.java
> >
> > Modified: incubator/ofbiz/trunk/applications/content/src/org/ofbiz/
> > content/email/EmailServices.java
> > URL: http://svn.apache.org/viewvc/incubator/ofbiz/trunk/
> > applications/content/src/org/ofbiz/content/email/EmailServices.java?
> > view=diff&rev=478781&r1=478780&r2=478781
> > ======================================================================
> > ========
> > --- incubator/ofbiz/trunk/applications/content/src/org/ofbiz/
> > content/email/EmailServices.java (original)
> > +++ incubator/ofbiz/trunk/applications/content/src/org/ofbiz/
> > content/email/EmailServices.java Thu Nov 23 22:42:24 2006
> > @@ -642,6 +642,53 @@
> >
> >          return allResults;
> >      }
> > +
> > +    public static String contentIndex = "";
> > +    private static Map addMessageBody( Map commEventMap, Multipart
> > multipart)
> > +	throws MessagingException, IOException {
> > +    	try {
> > +    		int multipartCount = multipart.getCount();
> > +    		for (int i=0; i < multipartCount  && i < 10; i++) {
> > +    			Part part = multipart.getBodyPart(i);
> > +    			String thisContentTypeRaw = part.getContentType();
> > +    			String content = null;
> > +    			int idx2 = thisContentTypeRaw.indexOf(";");
> > +    			if (idx2 == -1) idx2 = thisContentTypeRaw.length();
> > +    			String thisContentType = thisContentTypeRaw.substring(0,
> > idx2);
> > +    			if (thisContentType == null || thisContentType.equals(""))
> > thisContentType = "text/html";
> > +    			String disposition = part.getDisposition();
> > +
> > +    			if (thisContentType.startsWith("multipart") ||
> > thisContentType.startsWith("Multipart")) {
> > +					contentIndex = contentIndex.concat("." + i);
> > +    				return addMessageBody(commEventMap, (Multipart)
> > part.getContent());
> > +    			}
> > +    			// See this case where the disposition of the inline text
> > is null
> > +    			else if ((disposition == null) && (i == 0) &&
> > thisContentType.startsWith("text")) {
> > +    				content = (String)part.getContent();
> > +    				if (UtilValidate.isNotEmpty(content)) {
> > +    					contentIndex = contentIndex.concat("." + i);
> > +    					commEventMap.put("content", content);
> > +    					commEventMap.put("contentMimeTypeId", thisContentType);
> > +    					return commEventMap;
> > +    				}
> > +    			} else if ((disposition != null)
> > +    					&& (disposition.equals(Part.ATTACHMENT) ||
> > disposition.equals(Part.INLINE))
> > +    					&& thisContentType.startsWith("text")) {
> > +					contentIndex = contentIndex.concat("." + i);
> > +    				commEventMap.put("content", part.getContent());
> > +    				commEventMap.put("contentMimeTypeId", thisContentType);
> > +    				return commEventMap;
> > +    			}
> > +    		}
> > +    		return commEventMap;
> > +    	} catch (MessagingException e) {
> > +    		Debug.logError(e, module);
> > +    		return ServiceUtil.returnError(e.getMessage());
> > +        } catch (IOException e) {
> > +            Debug.logError(e, module);
> > +            return ServiceUtil.returnError(e.getMessage());
> > +        }
> > +    }
> >
> >      /**
> >       * This service is the main one for processing incoming emails.
> > @@ -665,7 +712,9 @@
> >       * CommunicationEvent.content field) are cycled thru and
> > attached to the CommunicationEvent entity using the
> >       * createCommContentDataResource service. This happens in the
> > EmailWorker.addAttachmentsToCommEvent method.
> >       *
> > -     * -Al Byers
> > +     * However multiparts can contain multiparts. A recursive
> > function has been added.
> > +     *
> > +     * -Al Byers - Hans Bakker
> >       * @param dctx
> >       * @param context
> >       * @return
> > @@ -681,7 +730,6 @@
> >          String partyIdTo = null;
> >          String partyIdFrom = null;
> >          String contentType = null;
> > -        String content = null;
> >  		String communicationEventId = null;
> >          String contactMechIdFrom = null;
> >          String contactMechIdTo = null;
> > @@ -770,42 +818,13 @@
> >  	        commEventMap.put("datetimeEnded", UtilDateTime.toTimestamp
> > (message.getReceivedDate()));
> >
> >              // get the content(type) part
> > -    		int contentIndex = -1;
> > -			Multipart multipart = null;
> >      		if (contentType.startsWith("text")) {
> > -    			content = (String)message.getContent();
> > +    			commEventMap.put("content", message.getContent());
> >          		commEventMap.put("contentMimeTypeId", contentType);
> >      		} else if (contentType.startsWith("multipart") ||
> > contentType.startsWith("Multipart")) {
> > -    			multipart = (Multipart) message.getContent();
> > -    			int multipartCount = multipart.getCount();
> > -    			for (int i=0; i < multipartCount; i++) {
> > -    				Part part = multipart.getBodyPart(i);
> > -    				String thisContentTypeRaw = part.getContentType();
> > -    	            int idx2 = thisContentTypeRaw.indexOf(";");
> > -                    if (idx2 == -1) idx2 =
> > thisContentTypeRaw.length();
> > -    	            String thisContentType =
> > thisContentTypeRaw.substring(0, idx2);
> > -                    if (thisContentType == null ||
> > thisContentType.equals("")) thisContentType = "text/html";
> > -                    String disposition = part.getDisposition();
> > -
> > -    				// See this case where the disposition of the inline text
> > is null
> > -    				if ((disposition == null) && (i == 0) &&
> > thisContentType.startsWith("text")) {
> > -    					content = (String)part.getContent();
> > -    					if (UtilValidate.isNotEmpty(content)) {
> > -    						contentIndex = i;
> > -    						commEventMap.put("contentMimeTypeId", thisContentType);
> > -    						break;
> > -    					}
> > -   			    	} else if ((disposition != null)
> > -   						 && (disposition.equals(Part.ATTACHMENT) ||
> > disposition.equals(Part.INLINE))
> > -   					     && thisContentType.startsWith("text")) {
> > -   			    		content = (String)part.getContent();
> > -   			    		contentIndex = i;
> > -   			    		commEventMap.put("contentMimeTypeId", thisContentType);
> > -   			    		break;
> > -   			    	}
> > -    			}
> > -    		}
> > -    		commEventMap.put("content", content);
> > +    			contentIndex = "";
> > +    			commEventMap = addMessageBody(commEventMap, (Multipart)
> > message.getContent());
> > +    		}
> >
> >              // store from/to parties, but when not found make a
> > note of the email to/from address in the workEffort Note Section.
> >              String commNote = "";
> > @@ -844,10 +863,9 @@
> >      		result = dispatcher.runSync("createCommunicationEvent",
> > commEventMap);
> >      		communicationEventId = (String)result.get
> > ("communicationEventId");
> >
> > -    		// 'system' Id has no partyId but needed for prefix
> > generation of the creation of related contentId and dataresourceId.
> >              // store attachements
> >      		if (contentType.startsWith("multipart") ||
> > contentType.startsWith("Multipart")) {
> > -    			int attachmentCount = EmailWorker.addAttachmentsToCommEvent
> > (message, communicationEventId, contentIndex, dispatcher, userLogin);
> > +    			int attachmentCount = EmailWorker.addAttachmentsToCommEvent
> > (message, communicationEventId, dispatcher, userLogin);
> >      			if (Debug.infoOn()) Debug.logInfo(attachmentCount + "
> > attachments added to CommunicationEvent:" +
> > communicationEventId,module);
> >      		}
> >
> >
> > Modified: incubator/ofbiz/trunk/applications/content/src/org/ofbiz/
> > content/email/EmailWorker.java
> > URL: http://svn.apache.org/viewvc/incubator/ofbiz/trunk/
> > applications/content/src/org/ofbiz/content/email/EmailWorker.java?
> > view=diff&rev=478781&r1=478780&r2=478781
> > ======================================================================
> > ========
> > --- incubator/ofbiz/trunk/applications/content/src/org/ofbiz/
> > content/email/EmailWorker.java (original)
> > +++ incubator/ofbiz/trunk/applications/content/src/org/ofbiz/
> > content/email/EmailWorker.java Thu Nov 23 22:42:24 2006
> > @@ -30,6 +30,7 @@
> >  import org.ofbiz.base.util.Debug;
> >  import org.ofbiz.service.LocalDispatcher;
> >  import org.ofbiz.service.GenericServiceException;
> > +import org.ofbiz.service.ServiceUtil;
> >  import org.ofbiz.entity.util.ByteWrapper;
> >
> >  public class EmailWorker {
> > @@ -43,9 +44,8 @@
> >      	return fieldValue;
> >      }
> >
> > -    public static int addAttachmentsToCommEvent(MimeMessage
> > message, String communicationEventId, int bodyContentIndex,
> > LocalDispatcher dispatcher, GenericValue userLogin)
> > +    public static int addAttachmentsToCommEvent(MimeMessage
> > message, String communicationEventId, LocalDispatcher dispatcher,
> > GenericValue userLogin)
> >      	throws MessagingException, IOException,
> > GenericServiceException {
> > -    	int attachmentCount =0;
> >      	Map commEventMap = new HashMap();
> >      	commEventMap.put("communicationEventId", communicationEventId);
> >      	commEventMap.put("contentTypeId", "DOCUMENT");
> > @@ -55,55 +55,76 @@
> >  		if (subject != null && subject.length() > 80) {
> >  			subject = subject.substring(0,80); // make sure not too big for
> > database field. (20 characters for filename)
> >  		}
> > -		ByteArrayOutputStream baos = new ByteArrayOutputStream();
> > -
> > -		Multipart multipart = (Multipart)message.getContent();
> > -		int multipartCount = multipart.getCount();
> > -		for (int i=0; i < multipartCount; i++) {
> > -			Part part = multipart.getBodyPart(i);
> > -			String thisContentTypeRaw = part.getContentType();
> > -            int idx2 = thisContentTypeRaw.indexOf(";");
> > -            if (idx2 == -1) idx2 = thisContentTypeRaw.length();
> > -            String thisContentType = thisContentTypeRaw.substring
> > (0, idx2);
> > -			String disposition = part.getDisposition();
> > -
> > -			// The first test should not pass, because if it exists, it
> > should be the bodyContentIndex part
> > -			if (((disposition == null) && (i == 0) && (i !=
> > bodyContentIndex)  && thisContentType.startsWith("text"))
> > -               || ((disposition != null)
> > -					 && (disposition.equals(Part.ATTACHMENT) || disposition.equals
> > (Part.INLINE))
> > -				     && (i != bodyContentIndex)) )
> > -		    {
> > -				String attFileName = part.getFileName();
> > -				if (attFileName != null && attFileName.length() > 17) {
> > -					attFileName = attFileName.substring(0,17);
> > -				}
> > -				commEventMap.put("contentName", subject + "-" + i + " " +
> > attFileName);
> > -        		commEventMap.put("drMimeTypeId", thisContentType);
> > -        		if (thisContentType.startsWith("text")) {
> > -        			String content = (String)part.getContent();
> > -        			commEventMap.put("drDataResourceTypeId",
> > "ELECTRONIC_TEXT");
> > -        			commEventMap.put("textData", content);
> > -        		} else {
> > -
> > -        			InputStream is = part.getInputStream();
> > -        			int c;
> > -        			while ((c = is.read()) > -1) {
> > -        				baos.write(c);
> > -        			}
> > -
> > -    				ByteWrapper imageData = new ByteWrapper(baos.toByteArray());
> > -    				int len = imageData.getLength();
> > -    				if (Debug.infoOn()) Debug.logInfo("imageData length: " +
> > len, module);
> > -                    commEventMap.put("drDataResourceName",
> > part.getFileName());
> > -    				commEventMap.put("imageData", imageData);
> > -    				commEventMap.put("drDataResourceTypeId", "IMAGE_OBJECT");
> > -            		commEventMap.put("_imageData_contentType",
> > thisContentType);
> > -        		}
> > -        		dispatcher.runSync("createCommContentDataResource",
> > commEventMap);
> > -    			attachmentCount++;
> > -		    }
> > -		}
> > +		currentIndex = "";
> > +		attachmentCount = 0;
> > +		return addMultipartAttachementToComm((Multipart)
> > message.getContent(), commEventMap, subject, dispatcher, userLogin);
> > +
> > +    }
> > +    private static String currentIndex = "";
> > +    private static int attachmentCount = 0;
> > +    private static int addMultipartAttachementToComm(Multipart
> > multipart, Map commEventMap, String subject, LocalDispatcher
> > dispatcher, GenericValue userLogin)
> > +    throws MessagingException, IOException, GenericServiceException {
> > +    	try {
> > +    		int multipartCount = multipart.getCount();
> > +    		for (int i=0; i < multipartCount; i++) {
> > +    			Part part = multipart.getBodyPart(i);
> > +    			String thisContentTypeRaw = part.getContentType();
> > +    			int idx2 = thisContentTypeRaw.indexOf(";");
> > +    			if (idx2 == -1) idx2 = thisContentTypeRaw.length();
> > +    			String thisContentType = thisContentTypeRaw.substring(0,
> > idx2);
> > +    			String disposition = part.getDisposition();
> > +    			ByteArrayOutputStream baos = new ByteArrayOutputStream();
> > +
> > +    			if (thisContentType.startsWith("multipart") ||
> > thisContentType.startsWith("Multipart")) {
> > +    				currentIndex = currentIndex.concat("." + i);
> > +    				return	addMultipartAttachementToComm((Multipart)
> > part.getContent(), commEventMap, subject, dispatcher, userLogin);
> > +    			}
> > +
> > +    			if(currentIndex.concat("." + i).equals
> > (EmailServices.contentIndex)) continue;
> > +
> > +    			// The first test should not pass, because if it exists, it
> > should be the bodyContentIndex part
> > +    			if (((disposition == null) && (i == 0) &&
> > thisContentType.startsWith("text"))
> > +    					|| ((disposition != null)
> > +    							&& (disposition.equals(Part.ATTACHMENT) ||
> > disposition.equals(Part.INLINE))
> > +    							) )
> > +    			{
> > +    				String attFileName = part.getFileName();
> > +    				if (attFileName != null && attFileName.length() > 17) {
> > +    					attFileName = attFileName.substring(0,17);
> > +    				}
> > +    				commEventMap.put("contentName", subject + "-" +
> > attachmentCount + " " + attFileName);
> > +    				commEventMap.put("drMimeTypeId", thisContentType);
> > +    				if (thisContentType.startsWith("text")) {
> > +    					String content = (String)part.getContent();
> > +    					commEventMap.put("drDataResourceTypeId", "ELECTRONIC_TEXT");
> > +    					commEventMap.put("textData", content);
> > +    				} else {
> > +
> > +    					InputStream is = part.getInputStream();
> > +    					int c;
> > +    					while ((c = is.read()) > -1) {
> > +    						baos.write(c);
> > +    					}
> >
> > +    					ByteWrapper imageData = new ByteWrapper(baos.toByteArray());
> > +    					int len = imageData.getLength();
> > +    					if (Debug.infoOn()) Debug.logInfo("imageData length: " +
> > len, module);
> > +    					commEventMap.put("drDataResourceName", part.getFileName());
> > +    					commEventMap.put("imageData", imageData);
> > +    					commEventMap.put("drDataResourceTypeId", "IMAGE_OBJECT");
> > +    					commEventMap.put("_imageData_contentType", thisContentType);
> > +    				}
> > +    				dispatcher.runSync("createCommContentDataResource",
> > commEventMap);
> > +    				attachmentCount++;
> > +    			}
> > +    		}
> > +    	} catch (MessagingException e) {
> > +    		Debug.logError(e, module);
> > +    	} catch (IOException e) {
> > +    		Debug.logError(e, module);
> > +    	} catch (GenericServiceException e) {
> > +    		Debug.logError(e, module);
> > +    	}
> >      	return attachmentCount;
> >      }
> >  }
>
> Best Regards,
>
> Si
> sichen@opensourcestrategies.com

-- 
Regards,
Hans Bakker
ANT Websystems Co.,Ltd (http://www.antwebsystems.com)

If you want to verify that this message really originates from
from the above person, download the public key from:
http://www.antwebsystems.com/hbakkerAntwebsystems.asc