/*
 * 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.
 */

package org.apache.axis2.wsdl.util;

import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.List;

/**
 * This class acts as the holder for the information that is required to be attached to the
 * AxisMessage during unwrapping
 */
public class MessagePartInformationHolder {

    private QName operationName;
    private List partsList = new ArrayList();

    public QName getOperationName() {
        return operationName;
    }

    public void setOperationName(QName operationName) {
        this.operationName = operationName;
    }

    public List getPartsList() {
        return partsList;
    }

    public void setPartsList(List partsList) {
        this.partsList = partsList;
    }


}
