1/*
2 * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 *
26 */
27
28package bench.rmi;
29
30import java.lang.ref.WeakReference;
31import java.rmi.Remote;
32import java.rmi.RemoteException;
33import java.rmi.server.RemoteObject;
34import java.rmi.server.UnicastRemoteObject;
35import java.util.HashMap;
36
37/**
38 * Benchmark server implementation.
39 */
40public class BenchServerImpl
41    extends UnicastRemoteObject implements BenchServer
42{
43    HashMap implTable = new HashMap();
44
45    /**
46     * Create new server.
47     */
48    public BenchServerImpl() throws RemoteException {
49    }
50
51    /**
52     * Uses the given remote object factory to create a new remote object on
53     * the server side.
54     */
55    public Remote create(BenchServer.RemoteObjectFactory factory)
56        throws RemoteException
57    {
58        Remote impl = factory.create();
59        implTable.put(RemoteObject.toStub(impl), new WeakReference(impl));
60        return impl;
61    }
62
63    /**
64     * Unexports the specified remote object.  Returns true if successful,
65     * false otherwise.
66     */
67    public boolean unexport(Remote obj, boolean force) throws RemoteException {
68        WeakReference iref = (WeakReference) implTable.get(obj);
69        if (iref == null)
70            return false;
71        Remote impl = (Remote) iref.get();
72        if (impl == null)
73            return false;
74        return UnicastRemoteObject.unexportObject(impl, force);
75    }
76
77    /**
78     * Execute given task.
79     */
80    public Object execute(BenchServer.Task task) throws Exception {
81        return task.execute();
82    }
83
84    /**
85     * Invoke the garbage collector.
86     */
87    public void gc() throws RemoteException {
88        System.gc();
89    }
90
91    /**
92     * Terminate the server.
93     */
94    public void terminate(int delay) throws RemoteException {
95        System.exit(0);
96    }
97}
98