/**************************************************************
 *
 * 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 com.sun.star.comp.test.deployment.active_java;

import com.sun.star.frame.DispatchDescriptor;
import com.sun.star.frame.XDispatch;
import com.sun.star.frame.XDispatchProvider;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.lib.uno.helper.WeakBase;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.util.URL;

public final class Provider extends WeakBase
    implements XServiceInfo, XDispatchProvider
{
    public Provider(XComponentContext context) {
        this.context = context;
    }

    public String getImplementationName() { return implementationName; }

    public boolean supportsService(String ServiceName) {
        return ServiceName.equals(getSupportedServiceNames()[0]); //TODO
    }

    public String[] getSupportedServiceNames() {
        return serviceNames;
    }

    public XDispatch queryDispatch(
        URL URL, String TargetFrameName, int SearchFlags)
    {
        return UnoRuntime.queryInterface(
            XDispatch.class,
            context.getValueByName(
                "/singletons/" +
                "com.sun.star.test.deployment.active_java_singleton"));
    }

    public XDispatch[] queryDispatches(DispatchDescriptor[] Requests) {
        XDispatch[] s = new XDispatch[Requests.length];
        for (int i = 0; i < s.length; ++i) {
            s[i] = queryDispatch(
                Requests[i].FeatureURL, Requests[i].FrameName,
                Requests[i].SearchFlags);
        }
        return s;
    }

    private final XComponentContext context;

    static final String implementationName =
        "com.sun.star.comp.test.deployment.active_java";

    static final String[] serviceNames = new String[] {
        "com.sun.star.test.deployment.active_java" };
}
