/*
 * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 *
 */

package bench.rmi;

import java.lang.ref.WeakReference;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.RemoteObject;
import java.rmi.server.UnicastRemoteObject;
import java.util.HashMap;

/**
 * Benchmark server implementation.
 */
public class BenchServerImpl
    extends UnicastRemoteObject implements BenchServer
{
    HashMap implTable = new HashMap();

    /**
     * Create new server.
     */
    public BenchServerImpl() throws RemoteException {
    }

    /**
     * Uses the given remote object factory to create a new remote object on
     * the server side.
     */
    public Remote create(BenchServer.RemoteObjectFactory factory)
        throws RemoteException
    {
        Remote impl = factory.create();
        implTable.put(RemoteObject.toStub(impl), new WeakReference(impl));
        return impl;
    }

    /**
     * Unexports the specified remote object.  Returns true if successful,
     * false otherwise.
     */
    public boolean unexport(Remote obj, boolean force) throws RemoteException {
        WeakReference iref = (WeakReference) implTable.get(obj);
        if (iref == null)
            return false;
        Remote impl = (Remote) iref.get();
        if (impl == null)
            return false;
        return UnicastRemoteObject.unexportObject(impl, force);
    }

    /**
     * Execute given task.
     */
    public Object execute(BenchServer.Task task) throws Exception {
        return task.execute();
    }

    /**
     * Invoke the garbage collector.
     */
    public void gc() throws RemoteException {
        System.gc();
    }

    /**
     * Terminate the server.
     */
    public void terminate(int delay) throws RemoteException {
        System.exit(0);
    }
}
