1/*
2 *  Licensed to the Apache Software Foundation (ASF) under one or more
3 *  contributor license agreements.  See the NOTICE file distributed with
4 *  this work for additional information regarding copyright ownership.
5 *  The ASF licenses this file to You under the Apache License, Version 2.0
6 *  (the "License"); you may not use this file except in compliance with
7 *  the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17
18package java.security;
19
20import java.io.IOException;
21import java.io.Serializable;
22
23/**
24 * {@code GuardedObject} controls access to an object, by checking all requests
25 * for the object with a {@code Guard}.
26 */
27public class GuardedObject implements Serializable {
28
29    private static final long serialVersionUID = -5240450096227834308L;
30
31    private final Object object;
32
33    private final Guard guard;
34
35    /**
36     * Constructs a new instance of {@code GuardedObject} which protects access
37     * to the specified {@code Object} using the specified {@code Guard}.
38     *
39     * @param object
40     *            the {@code Object} to protect.
41     * @param guard
42     *            the {@code Guard} which protects the specified {@code Object},
43     *            maybe {@code null}.
44     */
45    public GuardedObject(Object object, Guard guard) {
46        this.object = object;
47        this.guard = guard;
48    }
49
50    /**
51     * Returns the guarded {@code Object} if the associated {@code Guard}
52     * permits access. If access is not granted, then a {@code
53     * SecurityException} is thrown.
54     *
55     * @return the guarded object.
56     * @exception SecurityException
57     *                if access is not granted to the guarded object.
58     */
59    public Object getObject() throws SecurityException {
60        if (guard != null) {
61            guard.checkGuard(object);
62        }
63        return object;
64    }
65
66    /**
67     * Checks the guard (if there is one) before performing a default
68     * serialization.
69     */
70    private void writeObject(java.io.ObjectOutputStream out) throws IOException {
71        if (guard != null) {
72            guard.checkGuard(object);
73        }
74        out.defaultWriteObject();
75    }
76}
77