View Javadoc

    1   /*
    2    * @(#) $Id: CorrectedContentTypeDataSource.java,v 1.1.2.2 2004/10/24 10:27:40 otsuka Exp $
    3    * $Revision: 1.1.2.2 $
    4    * Copyright (c) 2000 Shin Kinoshita All Rights Reserved.
    5    */
    6   package com.ozacc.mail.fetch.impl.sk_jp;
    7
    8   import java.io.IOException;
    9   import java.io.InputStream;
    10  import java.io.OutputStream;
    11  import javax.activation.DataSource;
    12  import javax.mail.MessageAware;
    13  import javax.mail.MessageContext;
    14  import javax.mail.MessagingException;
    15  import javax.mail.Part;
    16  import javax.mail.internet.ContentType;
    17  import javax.mail.internet.ParseException;
    18
    19  /***
    20   * Content-Type:の不適合をISO-2022-JPに補正します。
    21   * 使用方法は<PRE>
    22   * Object o = new DataHandler(
    23   *               new CorrectedContentTypeDataSource(part, charset)
    24   *            ).getContent();
    25   * </PRE><P>のようになります。</P><P>
    26   * スレッドセーフではありませんので利用者側で排他制御を行ってください。
    27   * </P>
    28   * @author Shin
    29   * @version $Revision: 1.1.2.2 $ $Date: 2004/10/24 10:27:40 $
    30   */
    31  class CorrectedContentTypeDataSource implements DataSource, MessageAware {
    32
    33  	protected DataSource source;
    34
    35  	protected String defaultCharset;
    36
    37  	protected String forceCharset;
    38
    39  	public CorrectedContentTypeDataSource() {}
    40
    41  	public CorrectedContentTypeDataSource(DataSource dataSource, String defaultCharset) {
    42  		setDataSource(dataSource);
    43  		setDefaultCharset(defaultCharset);
    44  	}
    45
    46  	public CorrectedContentTypeDataSource(Part part, String defaultCharset)
    47  																			throws MessagingException {
    48  		setPart(part);
    49  		setDefaultCharset(defaultCharset);
    50  	}
    51
    52  	public void setPart(Part part) throws MessagingException {
    53  		// getDataHandler() method creates a implicit DataSource.
    54  		setDataSource(part.getDataHandler().getDataSource());
    55  	}
    56
    57  	public void setDataSource(DataSource newSource) {
    58  		source = newSource;
    59  	}
    60
    61  	public void setDefaultCharset(String defaultCharset) {
    62  		this.defaultCharset = defaultCharset;
    63  	}
    64
    65  	/***
    66  	 * 指定された文字コードで既存の文字コードを上書きします。
    67  	 *
    68  	 * @param forceCharset 強制的に適用する文字コード
    69  	 * @author Tomohiro Otsuka
    70  	 */
    71  	public void setForceCharset(String forceCharset) {
    72  		this.forceCharset = forceCharset;
    73  	}
    74
    75  	public String getContentType() {
    76  		ContentType contentType = null;
    77  		try {
    78  			contentType = new ContentType(source.getContentType());
    79  		} catch (ParseException e) {
    80  			return "text/plain; charset=" + defaultCharset;
    81  		}
    82  		String specifiedCharset = contentType.getParameter("charset");
    83  		if (specifiedCharset == null) {
    84  			// Content-Type:が存在しない場合は"text/plain"になってしまう。
    85  			// 本当にtext/plainだった場合は正しくない事になるが、
    86  			// charset=ISO-2022-JPにする場合は一応表示上は問題ない。
    87  			contentType.setParameter("charset", defaultCharset);
    88  		} else if (forceCharset != null) {
    89  			contentType.setParameter("charset", forceCharset);
    90  		}
    91  		return contentType.toString();
    92  	}
    93
    94  	public String getName() {
    95  		return source.getName();
    96  	}
    97
    98  	public InputStream getInputStream() throws IOException {
    99  		return source.getInputStream();
    100 	}
    101
    102 	public OutputStream getOutputStream() throws IOException {
    103 		return source.getOutputStream();
    104 	}
    105
    106 	public synchronized MessageContext getMessageContext() {
    107 		if (source instanceof MessageAware) {
    108 			return ((MessageAware)source).getMessageContext();
    109 		}
    110 		throw new RuntimeException(source + " isn't MessageAware.");
    111 	}
    112 }