| /* | |
| * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved. | |
| * | |
| * This program and the accompanying materials are made available under the | |
| * terms of the Eclipse Distribution License v. 1.0, which is available at | |
| * http://www.eclipse.org/org/documents/edl-v10.php. | |
| * | |
| * SPDX-License-Identifier: BSD-3-Clause | |
| */ | |
| import java.awt.*; | |
| import java.awt.event.*; | |
| import javax.mail.*; | |
| import javax.activation.*; | |
| import java.util.Date; | |
| import java.io.IOException; | |
| import javax.swing.JPanel; | |
| /** | |
| * @author Christopher Cotton | |
| * @author Bill Shannon | |
| */ | |
| public class MessageViewer extends JPanel implements CommandObject { | |
| Message displayed = null; | |
| DataHandler dataHandler = null; | |
| String verb = null; | |
| Component mainbody; | |
| TextArea headers; | |
| public MessageViewer() { | |
| this(null); | |
| } | |
| public MessageViewer(Message what) { | |
| // set our layout | |
| super(new GridBagLayout()); | |
| // add the toolbar | |
| addToolbar(); | |
| GridBagConstraints gb = new GridBagConstraints(); | |
| gb.gridwidth = GridBagConstraints.REMAINDER; | |
| gb.fill = GridBagConstraints.BOTH; | |
| gb.weightx = 1.0; | |
| gb.weighty = 0.0; | |
| // add the headers | |
| headers = new TextArea("", 4, 80, TextArea.SCROLLBARS_NONE); | |
| headers.setEditable(false); | |
| add(headers, gb); | |
| // now display our message | |
| setMessage(what); | |
| } | |
| /** | |
| * sets the current message to be displayed in the viewer | |
| */ | |
| public void setMessage(Message what) { | |
| displayed = what; | |
| if (mainbody != null) | |
| remove(mainbody); | |
| if (what != null) { | |
| loadHeaders(); | |
| mainbody = getBodyComponent(); | |
| } else { | |
| headers.setText(""); | |
| TextArea dummy = new TextArea("", 24, 80, TextArea.SCROLLBARS_NONE); | |
| dummy.setEditable(false); | |
| mainbody = dummy; | |
| } | |
| // add the main body | |
| GridBagConstraints gb = new GridBagConstraints(); | |
| gb.gridwidth = GridBagConstraints.REMAINDER; | |
| gb.fill = GridBagConstraints.BOTH; | |
| gb.weightx = 1.0; | |
| gb.weighty = 1.0; | |
| add(mainbody, gb); | |
| invalidate(); | |
| validate(); | |
| } | |
| protected void addToolbar() { | |
| GridBagConstraints gb = new GridBagConstraints(); | |
| gb.gridheight = 1; | |
| gb.gridwidth = 1; | |
| gb.fill = GridBagConstraints.NONE; | |
| gb.anchor = GridBagConstraints.WEST; | |
| gb.weightx = 0.0; | |
| gb.weighty = 0.0; | |
| gb.insets = new Insets(4,4,4,4); | |
| // structure button | |
| gb.gridwidth = GridBagConstraints.REMAINDER; // only for the last one | |
| Button b = new Button("Structure"); | |
| b.addActionListener( new StructureAction()); | |
| add(b, gb); | |
| } | |
| protected void loadHeaders() { | |
| // setup what we want in our viewer | |
| StringBuffer sb = new StringBuffer(); | |
| // date | |
| sb.append("Date: "); | |
| try { | |
| Date duh = displayed.getSentDate(); | |
| if (duh != null) { | |
| sb.append(duh.toString()); | |
| } else { | |
| sb.append("Unknown"); | |
| } | |
| sb.append("\n"); | |
| // from | |
| sb.append("From: "); | |
| Address[] adds = displayed.getFrom(); | |
| if (adds != null && adds.length > 0) { | |
| sb.append(adds[0].toString()); | |
| } | |
| sb.append("\n"); | |
| // to | |
| sb.append("To: "); | |
| adds = displayed.getRecipients(Message.RecipientType.TO); | |
| if (adds != null && adds.length > 0) { | |
| sb.append(adds[0].toString()); | |
| } | |
| sb.append("\n"); | |
| // subject | |
| sb.append("Subject: "); | |
| sb.append(displayed.getSubject()); | |
| headers.setText(sb.toString()); | |
| } catch (MessagingException me) { | |
| headers.setText(""); | |
| } | |
| } | |
| protected Component getBodyComponent() { | |
| //------------ | |
| // now get a content viewer for the main type... | |
| //------------ | |
| try { | |
| DataHandler dh = displayed.getDataHandler(); | |
| CommandInfo ci = dh.getCommand("view"); | |
| if (ci == null) { | |
| throw new MessagingException("view command failed on: " + | |
| displayed.getContentType()); | |
| } | |
| Object bean = dh.getBean(ci); | |
| if (bean instanceof Component) { | |
| return (Component)bean; | |
| } else { | |
| throw new MessagingException("bean is not a component " + | |
| bean.getClass().toString()); | |
| } | |
| } catch (MessagingException me) { | |
| return new Label(me.toString()); | |
| } | |
| } | |
| /** | |
| * the CommandObject method to accept our DataHandler | |
| * @param dh the datahandler used to get the content | |
| */ | |
| public void setCommandContext(String verb, | |
| DataHandler dh) throws IOException { | |
| this.verb = verb; | |
| dataHandler = dh; | |
| Object o = dh.getContent(); | |
| if (o instanceof Message) { | |
| setMessage((Message)o); | |
| } | |
| else { | |
| System.out.println( | |
| "MessageViewer - content not a Message object, " + o); | |
| if (o != null){ | |
| System.out.println(o.getClass().toString()); | |
| } | |
| } | |
| } | |
| class StructureAction implements ActionListener { | |
| StringBuffer sb; | |
| public void actionPerformed(ActionEvent e) { | |
| System.out.println("\n\nMessage Structure"); | |
| dumpPart("", displayed); | |
| } | |
| protected void dumpPart(String prefix, Part p) { | |
| try { | |
| System.out.println(prefix + "----------------"); | |
| System.out.println(prefix + | |
| "Content-Type: " + p.getContentType()); | |
| System.out.println(prefix + | |
| "Class: " + p.getClass().toString()); | |
| Object o = p.getContent(); | |
| if (o == null) { | |
| System.out.println(prefix + "Content: is null"); | |
| } else { | |
| System.out.println(prefix + | |
| "Content: " + o.getClass().toString()); | |
| } | |
| if (o instanceof Multipart) { | |
| String newpref = prefix + "\t"; | |
| Multipart mp = (Multipart)o; | |
| int count = mp.getCount(); | |
| for (int i = 0; i < count; i++) { | |
| dumpPart(newpref, mp.getBodyPart(i)); | |
| } | |
| } | |
| } catch (MessagingException e) { | |
| e.printStackTrace(); | |
| } catch (IOException ioex) { | |
| System.out.println("Cannot get content" + ioex.getMessage()); | |
| } | |
| } | |
| } | |
| } |