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

import java.io.Serial;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import javax.naming.StringRefAddr;

/**
 * Represents a reference web service.
 */
public class ServiceRef extends AbstractRef {

    @Serial
    private static final long serialVersionUID = 1L;


    /**
     * Default factory for this reference.
     */
    public static final String DEFAULT_FACTORY = org.apache.naming.factory.Constants.DEFAULT_SERVICE_FACTORY;


    /**
     * Service Classname address type.
     */
    public static final String SERVICE_INTERFACE = "serviceInterface";


    /**
     * ServiceQname address type.
     */
    public static final String SERVICE_NAMESPACE = "service namespace";

    /**
     * Service local part address type.
     */
    public static final String SERVICE_LOCAL_PART = "service local part";


    /**
     * Wsdl Location address type.
     */
    public static final String WSDL = "wsdl";


    /**
     * Jaxrpcmapping address type.
     */
    public static final String JAXRPCMAPPING = "jaxrpcmapping";


    /**
     * port-component-ref/port-component-link address type.
     */
    public static final String PORTCOMPONENTLINK = "portcomponentlink";


    /**
     * port-component-ref/service-endpoint-interface address type.
     */
    public static final String SERVICEENDPOINTINTERFACE = "serviceendpointinterface";


    /**
     * The list to save the handler Reference objects, because they can't be saved in the addrs vector.
     */
    private final List<HandlerRef> handlers = new CopyOnWriteArrayList<>();


    /**
     * Creates a ServiceRef with the given parameters and no factory information.
     *
     * @param refname the reference name
     * @param serviceInterface the service interface class name
     * @param serviceQname the service QName (namespace and local part)
     * @param wsdl the WSDL location
     * @param jaxrpcmapping the JAX-RPC mapping
     */
    public ServiceRef(String refname, String serviceInterface, String[] serviceQname, String wsdl,
            String jaxrpcmapping) {
        this(refname, serviceInterface, serviceQname, wsdl, jaxrpcmapping, null, null);
    }


    /**
     * Creates a ServiceRef with the given parameters and factory information.
     *
     * @param refname the reference name - unused
     * @param serviceInterface the service interface class name
     * @param serviceQname the service QName (namespace and local part)
     * @param wsdl the WSDL location
     * @param jaxrpcmapping the JAX-RPC mapping
     * @param factory the factory class name
     * @param factoryLocation the factory location
     */
    public ServiceRef(String refname, String serviceInterface, String[] serviceQname,
            String wsdl, String jaxrpcmapping, String factory, String factoryLocation) {
        super(serviceInterface, factory, factoryLocation);
        StringRefAddr refAddr;
        if (serviceInterface != null) {
            refAddr = new StringRefAddr(SERVICE_INTERFACE, serviceInterface);
            add(refAddr);
        }
        if (serviceQname != null) {
            if (serviceQname.length > 0 && serviceQname[0] != null) {
                refAddr = new StringRefAddr(SERVICE_NAMESPACE, serviceQname[0]);
                add(refAddr);
            }
            if (serviceQname.length > 1 && serviceQname[1] != null) {
                refAddr = new StringRefAddr(SERVICE_LOCAL_PART, serviceQname[1]);
                add(refAddr);
            }
        }
        if (wsdl != null) {
            refAddr = new StringRefAddr(WSDL, wsdl);
            add(refAddr);
        }
        if (jaxrpcmapping != null) {
            refAddr = new StringRefAddr(JAXRPCMAPPING, jaxrpcmapping);
            add(refAddr);
        }
    }


    /**
     * Add and Get Handlers classes.
     *
     * @return the handler
     */
    public HandlerRef getHandler() {
        return handlers.removeFirst();
    }


    /**
     * Returns the number of handlers in the list.
     *
     * @return the number of handlers
     */
    public int getHandlersSize() {
        return handlers.size();
    }


    /**
     * Adds a handler reference to the list.
     *
     * @param handler the handler reference to add
     */
    public void addHandler(HandlerRef handler) {
        handlers.add(handler);
    }


    @Override
    protected String getDefaultFactoryClassName() {
        return DEFAULT_FACTORY;
    }
}
