📄 dimebodypart.java
字号:
/* * Copyright 2001-2004 The Apache Software Foundation. * * Licensed 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 Rick Rineholt */package org.apache.axis.attachments;import org.apache.axis.components.logger.LogFactory;import org.apache.axis.utils.Messages;import org.apache.commons.logging.Log;import javax.activation.DataHandler;import javax.activation.DataSource;import java.io.BufferedInputStream;import java.io.IOException;import java.util.StringTokenizer;/** * This class is a single part for DIME mulitpart message.<pre> DIME 1.0 format 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | VERSION |B|E|C| TYPE_T| OPT_T | OPTIONS_LENGTH | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ID_LENGTH | TYPE_LENGTH | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | DATA_LENGTH | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | / / OPTIONS + PADDING / / | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | / / ID + PADDING / / | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | / / TYPE + PADDING / / | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | / / DATA + PADDING / / | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ </pre> *//** * Holds one attachment DIME part. */public class DimeBodyPart { protected static Log log = LogFactory.getLog(DimeBodyPart.class.getName()); protected Object data = null; protected DimeTypeNameFormat dtnf = null; protected byte[] type = null; protected byte[] id = null; static final byte POSITION_FIRST = (byte) 0x04; static final byte POSITION_LAST = (byte) 0x02; private static final byte CHUNK = 0x01; //Means set the chunk bit private static final byte CHUNK_NEXT = 0x2; //Means this was part of a CHUNK private static final byte ONLY_CHUNK = -1;//Means only one chunk was sent private static final byte LAST_CHUNK = (byte)0;//Means many chunks were sent private static int MAX_TYPE_LENGTH = (1 << 16) - 1; private static int MAX_ID_LENGTH = (1 << 16) - 1; static final long MAX_DWORD = 0xffffffffL; // fixme: don't use? is this for inheritance only? I can't find any // classes that extend this protected DimeBodyPart() {} //do not use. /** * Create a DIME Attachment Part. * @param data a byte array containing the data as the attachment. * @param format the type format for the data. * @param type the type of the data * @param id the ID for the DIME part. * */ public DimeBodyPart(byte[] data, DimeTypeNameFormat format, String type, String id) { System.arraycopy(data, 0, this.data = new byte[ data.length], 0, data.length); this.dtnf = format; this.type = type.getBytes(); if (this.type.length > MAX_TYPE_LENGTH) throw new IllegalArgumentException(Messages.getMessage ("attach.dimetypeexceedsmax", "" + this.type.length, "" + MAX_TYPE_LENGTH)); this.id = id.getBytes(); if (this.id.length > MAX_ID_LENGTH) throw new IllegalArgumentException( Messages.getMessage("attach.dimelengthexceedsmax", "" + this.id.length, "" + MAX_ID_LENGTH)); } /** * Create a DIME Attachment Part. * @param dh the data for the attachment as a JAF datahadler. * @param format the type format for the data. * @param type the type of the data * @param id the ID for the DIME part. * */ public DimeBodyPart(DataHandler dh, DimeTypeNameFormat format, String type, String id) { this.data = dh; this.dtnf = format; if (type == null || type.length() == 0) type = "application/octet-stream"; this.type = type.getBytes(); if (this.type.length > MAX_TYPE_LENGTH) throw new IllegalArgumentException(Messages.getMessage( "attach.dimetypeexceedsmax", "" + this.type.length, "" + MAX_TYPE_LENGTH)); this.id = id.getBytes(); if (this.id.length > MAX_ID_LENGTH) throw new IllegalArgumentException(Messages.getMessage( "attach.dimelengthexceedsmax", "" + this.id.length, "" + MAX_ID_LENGTH)); } /** * Create a DIME Attachment Part. * @param dh the data for the attachment as a JAF datahadler. * The type and foramt is derived from the DataHandler. * @param id the ID for the DIME part. * */ public DimeBodyPart(DataHandler dh, String id) { this(dh, DimeTypeNameFormat.MIME, dh.getContentType(), id); String ct = dh.getContentType(); if (ct != null) { ct = ct.trim(); if (ct.toLowerCase().startsWith("application/uri")) { StringTokenizer st = new StringTokenizer(ct, " \t;"); String t = st.nextToken(" \t;"); if (t.equalsIgnoreCase("application/uri")) { for (; st.hasMoreTokens();) { t = st.nextToken(" \t;"); if (t.equalsIgnoreCase("uri")) { t = st.nextToken("="); if (t != null) { t = t.trim(); if (t.startsWith("\"")) t = t.substring(1); if (t.endsWith("\"")) t = t.substring(0, t.length() - 1); this.type = t.getBytes(); this.dtnf = DimeTypeNameFormat.URI; } return; } else if (t.equalsIgnoreCase("uri=")) { t = st.nextToken(" \t;"); if (null != t && t.length() != 0) { t = t.trim(); if (t.startsWith("\"")) t= t.substring(1); if (t.endsWith("\"")) t= t.substring(0, t.length() - 1); this.type = t.getBytes(); this.dtnf = DimeTypeNameFormat.URI; return; } } else if (t.toLowerCase().startsWith("uri=")) { if (-1 != t.indexOf('=')) { t = t.substring(t.indexOf('=')).trim(); if (t.length() != 0) { t = t.trim(); if (t.startsWith("\"")) t = t.substring(1); if (t.endsWith("\"")) t = t.substring(0, t.length() - 1); this.type = t.getBytes(); this.dtnf = DimeTypeNameFormat.URI; return; } } } } } } } } /** * Write to stream the data using maxchunk for the largest junk. * * @param os the <code>OutputStream</code> to write to * @param position the position to write * @param maxchunk the maximum length of any one chunk * @throws IOException if there was a problem writing data to the stream */ void write(java.io.OutputStream os, byte position, long maxchunk) throws java.io.IOException { if (maxchunk < 1) throw new IllegalArgumentException( Messages.getMessage("attach.dimeMaxChunkSize0", "" + maxchunk)); if (maxchunk > MAX_DWORD) throw new IllegalArgumentException( Messages.getMessage("attach.dimeMaxChunkSize1", "" + maxchunk)); if (data instanceof byte[]) { send(os, position, (byte[]) data, maxchunk); } else if (data instanceof DynamicContentDataHandler) { send(os, position, (DynamicContentDataHandler) data, maxchunk); } else if (data instanceof DataHandler) { DataSource source = ((DataHandler)data).getDataSource(); DynamicContentDataHandler dh2 = new DynamicContentDataHandler(source); send(os, position, dh2, maxchunk); } } /** * Write to stream the data using the default largest chunk size. * * @param os the <code>OutputStream</code> to write to * @param position the position to write * @throws IOException if there was a problem writing data to the stream */ void write(java.io.OutputStream os, byte position) throws java.io.IOException { write(os, position, MAX_DWORD); } private static final byte[] pad = new byte[4]; void send(java.io.OutputStream os, byte position, byte[] data, final long maxchunk)throws java.io.IOException { send(os, position, data, 0, data.length, maxchunk); } void send(java.io.OutputStream os, byte position, byte[] data, int offset, final int length, final long maxchunk) throws java.io.IOException { byte chunknext = 0; do { int sendlength = (int) Math.min(maxchunk, length - offset); sendChunk(os, position, data, offset, sendlength, (byte) ((sendlength < (length - offset) ? CHUNK : 0) | chunknext)); offset += sendlength; chunknext = CHUNK_NEXT; } while (offset < length); } void send(java.io.OutputStream os, byte position, DataHandler dh, final long maxchunk) throws java.io.IOException { java.io.InputStream in = null; try { long dataSize = getDataSize(); in = dh.getInputStream();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -