continuum-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From c...@apache.org
Subject svn commit: r756580 - in /continuum/trunk/continuum-webapp/src/main: java/org/apache/continuum/web/util/ java/org/apache/maven/continuum/web/action/ java/org/apache/maven/continuum/web/action/component/ java/org/apache/maven/continuum/web/action/notifi...
Date Fri, 20 Mar 2009 16:25:46 GMT
Author: ctan
Date: Fri Mar 20 16:25:46 2009
New Revision: 756580

URL: http://svn.apache.org/viewvc?rev=756580&view=rev
Log:
[CONTINUUM-2134] display "latest committers" as recipient instead of empty string for 'send
to latest committers' notification

Submitted By: Jose Morales Martinez

Slight modification: move GenerateRecipientNotifier to org.apache.continuum.web.util package


Added:
    continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/util/
    continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/util/GenerateRecipentNotifier.java
  (with props)
Modified:
    continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/AddProjectAction.java
    continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/component/NotifierSummaryAction.java
    continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/notifier/DeleteGroupNotifierAction.java
    continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/notifier/DeleteProjectNotifierAction.java
    continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/view/projectview/NotifierRecipientCell.java
    continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties
    continuum/trunk/continuum-webapp/src/main/resources/struts.xml

Added: continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/util/GenerateRecipentNotifier.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/util/GenerateRecipentNotifier.java?rev=756580&view=auto
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/util/GenerateRecipentNotifier.java
(added)
+++ continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/util/GenerateRecipentNotifier.java
Fri Mar 20 16:25:46 2009
@@ -0,0 +1,81 @@
+package org.apache.continuum.web.util;
+
+import java.util.Map;
+
+import org.apache.maven.continuum.model.project.ProjectNotifier;
+import org.apache.maven.continuum.notification.AbstractContinuumNotifier;
+import org.codehaus.plexus.util.StringUtils;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * @author José Morales Martínez
+ * @version $Id$
+ */
+public final class GenerateRecipentNotifier
+{
+    private GenerateRecipentNotifier()
+    {
+
+    }
+
+    @SuppressWarnings( "unchecked" )
+    public static String generate( ProjectNotifier notifier )
+    {
+        Map configuration = notifier.getConfiguration();
+        String recipent = "unknown";
+        if ( ( "mail".equals( notifier.getType() ) ) || ( "msn".equals( notifier.getType()
) )
+            || ( "jabber".equals( notifier.getType() ) ) )
+        {
+            if ( StringUtils.isNotEmpty( (String) configuration.get( AbstractContinuumNotifier.ADDRESS_FIELD
) ) )
+            {
+                recipent = (String) configuration.get( AbstractContinuumNotifier.ADDRESS_FIELD
);
+            }
+            if ( StringUtils.isNotEmpty( (String) configuration.get( AbstractContinuumNotifier.COMMITTER_FIELD
) ) )
+            {
+                if ( Boolean.parseBoolean( (String) configuration.get( AbstractContinuumNotifier.COMMITTER_FIELD
) ) )
+                {
+                    if ( "unknown".equals( recipent ) )
+                    {
+                        recipent = "latest committers";
+                    }
+                    else
+                    {
+                        recipent += ", " + "latest committers";
+                    }
+                }
+            }
+        }
+        if ( "irc".equals( notifier.getType() ) )
+        {
+            recipent = (String) configuration.get( "host" );
+            if ( configuration.get( "port" ) != null )
+            {
+                recipent = recipent + ":" + (String) configuration.get( "port" );
+            }
+            recipent = recipent + ":" + (String) configuration.get( "channel" );
+        }
+        if ( "wagon".equals( notifier.getType() ) )
+        {
+            recipent = (String) configuration.get( "url" );
+        }
+        return recipent;
+    }
+}

Propchange: continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/util/GenerateRecipentNotifier.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/util/GenerateRecipentNotifier.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/AddProjectAction.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/AddProjectAction.java?rev=756580&r1=756579&r2=756580&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/AddProjectAction.java
(original)
+++ continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/AddProjectAction.java
Fri Mar 20 16:25:46 2009
@@ -19,7 +19,11 @@
  * under the License.
  */
 
-import com.opensymphony.xwork2.Validateable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
 import org.apache.maven.continuum.Continuum;
 import org.apache.maven.continuum.ContinuumException;
 import org.apache.maven.continuum.builddefinition.BuildDefinitionServiceException;
@@ -34,11 +38,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
 /**
  * @author Nick Gonzalez
  * @version $Id$
@@ -46,7 +45,6 @@
  */
 public class AddProjectAction
     extends ContinuumActionSupport
-    implements Validateable
 {
     private Logger logger = LoggerFactory.getLogger( this.getClass() );
 
@@ -91,49 +89,24 @@
 
     public void validate()
     {
-        boolean projectNameAlreadyExist = false;
-
         clearErrorsAndMessages();
-
         try
         {
-            if ( ( projectName.trim().length() > 0 ) && ( projectVersion.trim().length()
> 0 ) &&
-                ( projectScmUrl.trim().length() > 0 ) )
+            if ( !( projectName.trim().length() > 0 ) )
             {
-                Iterator<Project> projects = getContinuum().getProjects().iterator();
-                while ( projects.hasNext() )
-                {
-                    Project project = projects.next();
-                    // CONTINUUM-1445
-                    if ( StringUtils.equalsIgnoreCase( project.getName(), projectName.trim()
) &&
-                        StringUtils.equalsIgnoreCase( project.getVersion(), projectVersion.trim()
) &&
-                        StringUtils.equalsIgnoreCase( project.getScmUrl(), projectScmUrl.trim()
) )
-                    {
-                        projectNameAlreadyExist = true;
-                        break;
-                    }
-                }
-                if ( projectNameAlreadyExist )
-                {
-                    addActionError( getText( "projectName.already.exist.error" ) );
-                    this.input();
-                }
+                addActionError( getText( "addProject.name.required" ) );
             }
-            else
+            if ( !( projectVersion.trim().length() > 0 ) )
+            {
+                addActionError( getText( "addProject.version.required" ) );
+            }
+            if ( !( projectScmUrl.trim().length() > 0 ) )
+            {
+                addActionError( getText( "addProject.scmUrl.required" ) );
+            }
+            if ( hasActionErrors() )
             {
-                if ( !( projectName.trim().length() > 0 ) )
-                {
-                    addActionError( getText( "addProject.name.required" ) );
-                }
-                if ( !( projectVersion.trim().length() > 0 ) )
-                {
-                    addActionError( getText( "addProject.version.required" ) );
-                }
-                if ( !( projectScmUrl.trim().length() > 0 ) )
-                {
-                    addActionError( getText( "addProject.scmUrl.required" ) );
-                }
-                this.input();
+                input();
             }
         }
         catch ( ContinuumException e )
@@ -168,18 +141,33 @@
             return REQUIRES_AUTHORIZATION;
         }
 
+        String projectNameTrim = projectName.trim();
+        String versionTrim = projectVersion.trim();
+        String scmTrim = projectScmUrl.trim();
+        for ( Project project : getContinuum().getProjects() )
+        {
+            // CONTINUUM-1445
+            if ( StringUtils.equalsIgnoreCase( project.getName(), projectNameTrim )
+                && StringUtils.equalsIgnoreCase( project.getVersion(), versionTrim
)
+                && StringUtils.equalsIgnoreCase( project.getScmUrl(), scmTrim ) )
+            {
+                addActionError( getText( "projectName.already.exist.error" ) );
+                return INPUT;
+            }
+        }
+
         Project project = new Project();
 
-        project.setName( projectName.trim() );
+        project.setName( projectNameTrim );
 
         if ( projectDescription != null )
         {
             project.setDescription( projectDescription.trim() );
         }
 
-        project.setVersion( projectVersion.trim() );
+        project.setVersion( versionTrim );
 
-        project.setScmUrl( projectScmUrl.trim() );
+        project.setScmUrl( scmTrim );
 
         project.setScmUsername( projectScmUsername );
 
@@ -243,7 +231,7 @@
         }
         this.profiles = profileService.getAllProfiles();
         buildDefinitionTemplates = getContinuum().getBuildDefinitionService().getAllBuildDefinitionTemplate();
-        return SUCCESS;
+        return INPUT;
     }
 
     private void initializeProjectGroupName()

Modified: continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/component/NotifierSummaryAction.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/component/NotifierSummaryAction.java?rev=756580&r1=756579&r2=756580&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/component/NotifierSummaryAction.java
(original)
+++ continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/component/NotifierSummaryAction.java
Fri Mar 20 16:25:46 2009
@@ -22,23 +22,21 @@
  * under the License.
  */
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.continuum.web.util.GenerateRecipentNotifier;
 import org.apache.maven.continuum.ContinuumException;
 import org.apache.maven.continuum.model.project.Project;
 import org.apache.maven.continuum.model.project.ProjectGroup;
 import org.apache.maven.continuum.model.project.ProjectNotifier;
-import org.apache.maven.continuum.notification.AbstractContinuumNotifier;
 import org.apache.maven.continuum.web.action.ContinuumActionSupport;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
 import org.apache.maven.continuum.web.model.NotifierSummary;
-import org.codehaus.plexus.util.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
 /**
  * Component Action that prepares and provides Project Group Notifier and
  * Project Notifier summaries.
@@ -247,50 +245,7 @@
             ns.setFromProject( false );
         }
 
-        // Source the recipient 
-        Map configuration = notifier.getConfiguration();
-
-        String recipient = "unknown";
-
-        if ( ( "mail".equals( notifier.getType() ) ) || ( "msn".equals( notifier.getType()
) ) ||
-            ( "jabber".equals( notifier.getType() ) ) )
-        {
-            if ( StringUtils.isNotEmpty( (String) configuration.get( AbstractContinuumNotifier.ADDRESS_FIELD
) ) )
-            {
-                recipient = (String) configuration.get( AbstractContinuumNotifier.ADDRESS_FIELD
);
-            }
-            if ( StringUtils.isNotEmpty( (String) configuration.get( AbstractContinuumNotifier.COMMITTER_FIELD
) ) )
-            {
-                if ( Boolean.parseBoolean( (String) configuration.get( AbstractContinuumNotifier.COMMITTER_FIELD
) ) )
-                {
-                    if ( "unknown".equals( recipient ) )
-                    {
-                        recipient = "latest committers";
-                    }
-                    else
-                    {
-                        recipient += ", " + "latest committers";
-                    }
-                }
-            }
-        }
-
-        if ( "irc".equals( notifier.getType() ) )
-        {
-            recipient = (String) configuration.get( "host" );
-
-            if ( configuration.get( "port" ) != null )
-            {
-                recipient = recipient + ":" + (String) configuration.get( "port" );
-            }
-
-            recipient = recipient + ":" + (String) configuration.get( "channel" );
-        }
-
-        if ( "wagon".equals( notifier.getType() ) )
-        {
-            recipient = (String) configuration.get( "url" );
-        }
+        String recipient = GenerateRecipentNotifier.generate( notifier );
 
         ns.setRecipient( recipient );
 
@@ -338,7 +293,7 @@
         return ns;
     }
 
-    // property accessors 
+    // property accessors
 
     /**
      * @return the projectGroupId

Modified: continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/notifier/DeleteGroupNotifierAction.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/notifier/DeleteGroupNotifierAction.java?rev=756580&r1=756579&r2=756580&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/notifier/DeleteGroupNotifierAction.java
(original)
+++ continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/notifier/DeleteGroupNotifierAction.java
Fri Mar 20 16:25:46 2009
@@ -19,16 +19,14 @@
  * under the License.
  */
 
+import org.apache.continuum.web.util.GenerateRecipentNotifier;
 import org.apache.maven.continuum.ContinuumException;
 import org.apache.maven.continuum.model.project.ProjectGroup;
 import org.apache.maven.continuum.model.project.ProjectNotifier;
-import org.apache.maven.continuum.notification.AbstractContinuumNotifier;
 import org.apache.maven.continuum.web.action.ContinuumActionSupport;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
 import org.codehaus.plexus.util.StringUtils;
 
-import java.util.Map;
-
 /**
  * Action to delete a {@link ProjectNotifier} instance from a
  * specified {@link ProjectGroup}.
@@ -84,27 +82,9 @@
 
         ProjectNotifier notifier = getContinuum().getGroupNotifier( projectGroupId, notifierId
);
 
-        Map configuration = notifier.getConfiguration();
-
         notifierType = notifier.getType();
 
-        if ( ( "mail".equals( notifierType ) ) || ( "msn".equals( notifierType ) ) ||
-            ( "jabber".equals( notifierType ) ) )
-        {
-            recipient = (String) configuration.get( AbstractContinuumNotifier.ADDRESS_FIELD
);
-        }
-
-        if ( "irc".equals( notifierType ) )
-        {
-            recipient = (String) configuration.get( "host" );
-
-            if ( configuration.get( "port" ) != null )
-            {
-                recipient = recipient + ":" + (String) configuration.get( "port" );
-            }
-
-            recipient = recipient + ":" + (String) configuration.get( "channel" );
-        }
+        recipient = GenerateRecipentNotifier.generate( notifier );
 
         return "delete";
     }

Modified: continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/notifier/DeleteProjectNotifierAction.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/notifier/DeleteProjectNotifierAction.java?rev=756580&r1=756579&r2=756580&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/notifier/DeleteProjectNotifierAction.java
(original)
+++ continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/notifier/DeleteProjectNotifierAction.java
Fri Mar 20 16:25:46 2009
@@ -19,17 +19,15 @@
  * under the License.
  */
 
+import org.apache.continuum.web.util.GenerateRecipentNotifier;
 import org.apache.maven.continuum.ContinuumException;
 import org.apache.maven.continuum.model.project.Project;
 import org.apache.maven.continuum.model.project.ProjectGroup;
 import org.apache.maven.continuum.model.project.ProjectNotifier;
-import org.apache.maven.continuum.notification.AbstractContinuumNotifier;
 import org.apache.maven.continuum.web.action.ContinuumActionSupport;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
 import org.codehaus.plexus.util.StringUtils;
 
-import java.util.Map;
-
 /**
  * Action that deletes a {@link ProjectNotifier} from a specified {@link Project}.
  *
@@ -95,27 +93,9 @@
 
         ProjectNotifier notifier = getContinuum().getNotifier( projectId, notifierId );
 
-        Map configuration = notifier.getConfiguration();
-
         notifierType = notifier.getType();
 
-        if ( ( "mail".equals( notifierType ) ) || ( "msn".equals( notifierType ) ) ||
-            ( "jabber".equals( notifierType ) ) )
-        {
-            recipient = (String) configuration.get( AbstractContinuumNotifier.ADDRESS_FIELD
);
-        }
-
-        if ( "irc".equals( notifierType ) )
-        {
-            recipient = (String) configuration.get( "host" );
-
-            if ( configuration.get( "port" ) != null )
-            {
-                recipient = recipient + ":" + (String) configuration.get( "port" );
-            }
-
-            recipient = recipient + ":" + (String) configuration.get( "channel" );
-        }
+        recipient = GenerateRecipentNotifier.generate( notifier );
 
         return "delete";
     }

Modified: continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/view/projectview/NotifierRecipientCell.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/view/projectview/NotifierRecipientCell.java?rev=756580&r1=756579&r2=756580&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/view/projectview/NotifierRecipientCell.java
(original)
+++ continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/view/projectview/NotifierRecipientCell.java
Fri Mar 20 16:25:46 2009
@@ -19,8 +19,8 @@
  * under the License.
  */
 
+import org.apache.continuum.web.util.GenerateRecipentNotifier;
 import org.apache.maven.continuum.model.project.ProjectNotifier;
-import org.apache.maven.continuum.notification.AbstractContinuumNotifier;
 import org.extremecomponents.table.bean.Column;
 import org.extremecomponents.table.cell.DisplayCell;
 import org.extremecomponents.table.core.TableModel;
@@ -40,37 +40,8 @@
     {
         ProjectNotifier notifier = (ProjectNotifier) tableModel.getCurrentRowBean();
 
-        if ( "irc".equals( notifier.getType() ) )
-        {
-            String address = "";
+        String recipient = GenerateRecipentNotifier.generate( notifier );
 
-            if ( notifier.getConfiguration().get( "host" ) != null )
-            {
-                address += notifier.getConfiguration().get( "host" ) + ":";
-            }
-
-            if ( notifier.getConfiguration().get( "port" ) != null )
-            {
-                address += notifier.getConfiguration().get( "port" ) + ":";
-            }
-
-            if ( notifier.getConfiguration().get( "channel" ) != null )
-            {
-                address += notifier.getConfiguration().get( "channel" );
-            }
-
-            return address;
-        }
-        else
-        {
-            if ( "wagon".equals( notifier.getType() ) )
-            {
-                return notifier.getConfiguration().get( "url" ).toString();
-            }
-
-            String address = (String) notifier.getConfiguration().get( AbstractContinuumNotifier.ADDRESS_FIELD
);
-
-            return address == null ? "" : address;
-        }
+        return recipient;
     }
 }

Modified: continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties?rev=756580&r1=756579&r2=756580&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties
(original)
+++ continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties
Fri Mar 20 16:25:46 2009
@@ -778,6 +778,7 @@
 installation.ant.type.label = ANT
 installation.automaticProfile.label=Create a Build Environment with the Installation name
 installation.name.duplicate = Installation name already exists.
+installation.varName.required = You must define an environment variable
 
 # ----------------------------------------------------------------------
 # Page: Installations Type Choice

Modified: continuum/trunk/continuum-webapp/src/main/resources/struts.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/resources/struts.xml?rev=756580&r1=756579&r2=756580&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/resources/struts.xml (original)
+++ continuum/trunk/continuum-webapp/src/main/resources/struts.xml Fri Mar 20 16:25:46 2009
@@ -196,7 +196,7 @@
     
     <action name="addMavenOneProject" class="addMavenOneProject">
       <interceptor-ref name="configuredContinuumStack"/>
-      <interceptor-ref name="execAndWait"/> 
+      <interceptor-ref name="execAndWait"/>
       <result name="wait">/WEB-INF/jsp/navigations/wait.jsp</result>      
       <result name="input">/WEB-INF/jsp/addMavenOneProject.jsp</result>
       <result name="success" type="chain">groupSummary</result>
@@ -207,19 +207,19 @@
     </action>
 
     <action name="addProjectInput" class="addProject" method="input">
-      <result name="success">/WEB-INF/jsp/addProject.jsp</result>
+      <result name="input">/WEB-INF/jsp/addProject.jsp</result>
     </action>
 
     <action name="addProject" class="addProject" method="add">
       <interceptor-ref name="configuredContinuumStack"/>
-      <interceptor-ref name="execAndWait"/> 
+      <interceptor-ref name="execAndWait"/>
       <result name="wait">/WEB-INF/jsp/navigations/wait.jsp</result>      
-      <result name="input">/WEB-INF/jsp/addProject.jsp</result>
+      <result name="input" type="chain">addProjectInput</result>
       <result name="success" type="chain">groupSummary</result>
       <result name="projectGroupSummary" type="redirect-action">
         <param name="actionName">projectGroupSummary</param>
         <param name="projectGroupId">${projectGroupId}</param>
-      </result>        
+      </result>
     </action>
 
     <action name="deleteProject" class="deleteProject">



Mime
View raw message