/*
 * Copyright 2006 The Apache Software Foundation.
 * Copyright 2006 International Business Machines Corp.
 *
 * 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.
 */
package org.apache.axis2.jaxws.message.impl;

import javax.activation.DataHandler;

import org.apache.axis2.jaxws.message.Attachment;

/**
 * 
 */
public class AttachmentImpl implements Attachment {
    private DataHandler data;
    private String contentType;
    private String cid;
    
    public AttachmentImpl(DataHandler dh, String id) {
        data = dh;
        cid = id;
    }
    
    /*
     * (non-Javadoc)
     * @see org.apache.axis2.jaxws.message.Attachment#getContentType()
     */
    public String getContentType() {
        if (contentType == null)
            contentType = data.getContentType();
        
        return contentType;
    }
    
    /*
     * (non-Javadoc)
     * @see org.apache.axis2.jaxws.message.Attachment#getContentID()
     */
    public String getContentID() {
        return cid;
    }
    
    /*
     * (non-Javadoc)
     * @see org.apache.axis2.jaxws.message.Attachment#getDataHandler()
     */
    public DataHandler getDataHandler() {
        return data;
    }
}
