1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18 package net.jini.lookup;
19
20 import java.util.HashMap;
21 import java.util.Map;
22 import net.jini.core.lookup.ServiceItem;
23 import net.jini.core.lookup.ServiceRegistrar;
24
25 /**
26 * Used in the LookupCache. For each LookupCache, there is a HashMap that
27 * maps ServiceId to a ServiceItemReg. The ServiceItemReg class helps track
28 * where the ServiceItem comes from.
29 */
30 final class ServiceItemReg {
31 /* Maps ServiceRegistrars to their latest registered item */
32 private final Map<ServiceRegistrar, ServiceItem> items;
33 /* The ServiceRegistrar currently being used to track changes */
34 private volatile ServiceRegistrar proxy;
35 /* Flag that indicates that the ServiceItem has been discarded. */
36 private volatile boolean bDiscarded;
37 /* The discovered service, prior to filtering. */
38 private volatile ServiceItem item;
39 /* The discovered service, after filtering. */
40 private volatile ServiceItem filteredItem;
41 /* Creates an instance of this class, and associates it with the given
42 * lookup service proxy.
43 */
44
45 public ServiceItemReg(ServiceRegistrar proxy, ServiceItem item) {
46 this.bDiscarded = false;
47 items = new HashMap<ServiceRegistrar, ServiceItem>();
48 this.proxy = proxy;
49 items.put(proxy, item);
50 this.item = item;
51 filteredItem = null;
52 }
53
54 /* Adds the given proxy to the 'proxy-to-item' map. This method is
55 * called by the newOldService method. Returns false if the proxy is being used
56 * to track changes, true otherwise.
57 */
58 public boolean proxyNotUsedToTrackChange(ServiceRegistrar proxy, ServiceItem item) {
59 items.put(proxy, item);
60 return !proxy.equals(this.proxy);
61 }
62
63 /**
64 * Replaces the proxy used to track change if the proxy passed in is non
65 * null, also replaces the ServiceItem.
66 *
67 * @param proxy replacement proxy
68 * @param item replacement item.
69 */
70 public void replaceProxyUsedToTrackChange(ServiceRegistrar proxy, ServiceItem item) {
71 if (proxy != null) {
72 this.proxy = proxy;
73 }
74 this.item = item;
75 }
76 /* Removes the given proxy from the 'proxy-to-item' map. This method
77 * is called from the lookup, handleMatchNoMatch methods and
78 * ProxyRegDropTask. If this proxy was being used to track changes,
79 * then pick a new one and return its current item, else return null.
80 */
81
82 public ServiceItem removeProxy(ServiceRegistrar proxy) {
83 items.remove(proxy);
84 if (proxy.equals(this.proxy)) {
85 if (items.isEmpty()) {
86 this.proxy = null;
87 } else {
88 Map.Entry ent = (Map.Entry) items.entrySet().iterator().next();
89 this.proxy = (ServiceRegistrar) ent.getKey();
90 return (ServiceItem) ent.getValue();
91 } //endif
92 } //endif
93 return null;
94 }
95 /* Determines if the 'proxy-to-item' map contains any mappings.
96 */
97
98 public boolean hasNoProxys() {
99 return items.isEmpty();
100 }
101 /* Returns the flag indicating whether the ServiceItem is discarded. */
102
103 public boolean isDiscarded() {
104 return bDiscarded;
105 }
106
107 /* Discards if not discarded and returns true if successful */
108 public boolean discard() {
109 if (!bDiscarded) {
110 bDiscarded = true;
111 return true;
112 }
113 return false;
114 }
115
116 /* Undiscards if discarded and returns true if successful */
117 public boolean unDiscard() {
118 if (bDiscarded) {
119 bDiscarded = false;
120 return true;
121 }
122 return false;
123 }
124
125 /**
126 * @return the proxy
127 */
128 public ServiceRegistrar getProxy() {
129 return proxy;
130 }
131
132 /**
133 * @return the filteredItem
134 */
135 public ServiceItem getFilteredItem() {
136 return filteredItem == null ? null : filteredItem.clone();
137 }
138
139 /**
140 * @param filteredItem the filteredItem to set
141 */
142 public void setFilteredItem(ServiceItem filteredItem) {
143 this.filteredItem = filteredItem == null ? null : filteredItem.clone();
144 }
145
146 /**
147 * @return the item
148 */
149 public ServiceItem getItem() {
150 return item;
151 }
152
153 }