/*
 * 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.jaxws.description;

import java.util.List;

/**
 * Information related to handlers which have been resolved to a particluar port.
 * This information consists of:
 * - The handler implementation classes
 * - The list of SOAP roles (aka SOAP Actors)
 * 
 *  This information is cached on the service descrpiption so the handlers don't 
 *  have to be resolved for other HandlerResolvers requesting handlers for the 
 *  same port.
 */
public interface ResolvedHandlersDescription {
    public void setHandlerClasses(List<Class> handlerClasses);
    public List<Class> getHandlerClasses();
    
    public void setRoles(List<String> role);
    public List<String> getRoles();
}
