com.sun.faces.context.BaseContextMap Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jakarta.faces Show documentation
Show all versions of jakarta.faces Show documentation
EE4J Compatible Implementation for Jakarta Faces API
The newest version!
/*
* Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package com.sun.faces.context;
import java.util.AbstractCollection;
import java.util.AbstractMap;
import java.util.AbstractSet;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
/**
*
* This is the base Map for all Map instances required by @{link ExternalContext}.
*
*/
abstract class BaseContextMap extends AbstractMap {
private Set> entrySet;
private Set keySet;
private Collection values;
// -------------------------------------------------------- Methods from Map
// Supported by maps if overridden
@Override
public void clear() {
throw new UnsupportedOperationException();
}
// Supported by maps if overridden
@Override
public void putAll(Map t) {
throw new UnsupportedOperationException();
}
@Override
public Set> entrySet() {
if (entrySet == null) {
entrySet = new EntrySet();
}
return entrySet;
}
@Override
public Set keySet() {
if (keySet == null) {
keySet = new KeySet();
}
return keySet;
}
@Override
public Collection values() {
if (values == null) {
values = new ValueCollection();
}
return values;
}
// Supported by maps if overridden
@Override
public V remove(Object key) {
throw new UnsupportedOperationException();
}
// ------------------------------------------------------- Protected Methods
protected boolean removeKey(Object key) {
return this.remove(key) != null;
}
protected boolean removeValue(Object value) {
boolean valueRemoved = false;
if (value == null) {
return false;
}
if (containsValue(value)) {
for (Iterator i = entrySet().iterator(); i.hasNext();) {
Map.Entry e = (Map.Entry) i.next();
if (value.equals(e.getValue())) {
valueRemoved = remove(e.getKey()) != null;
}
}
}
return valueRemoved;
}
protected abstract Iterator> getEntryIterator();
protected abstract Iterator getKeyIterator();
protected abstract Iterator getValueIterator();
// ----------------------------------------------------------- Inner Classes
abstract static class BaseSet extends AbstractSet {
@Override
public int size() {
int size = 0;
for (Iterator i = iterator(); i.hasNext(); size++) {
i.next();
}
return size;
}
}
class EntrySet extends BaseSet> {
@Override
public Iterator> iterator() {
return getEntryIterator();
}
@Override
public boolean remove(Object o) {
return o instanceof Map.Entry && removeKey(((Map.Entry) o).getKey());
}
}
class KeySet extends BaseSet {
@Override
public Iterator iterator() {
return getKeyIterator();
}
@Override
public boolean contains(Object o) {
return containsKey(o);
}
@Override
public boolean remove(Object o) {
return o instanceof String && removeKey(o);
}
}
class ValueCollection extends AbstractCollection {
@Override
public int size() {
int size = 0;
for (Iterator i = iterator(); i.hasNext(); size++) {
i.next();
}
return size;
}
@Override
public Iterator iterator() {
return getValueIterator();
}
@Override
public boolean remove(Object o) {
return removeValue(o);
}
}
abstract static class BaseIterator implements Iterator {
protected Enumeration e;
protected String currentKey;
protected boolean removeCalled = false;
BaseIterator(Enumeration e) {
this.e = e;
}
@Override
public boolean hasNext() {
return e.hasMoreElements();
}
public String nextKey() {
removeCalled = false;
currentKey = (String) e.nextElement();
return currentKey;
}
}
class EntryIterator extends BaseIterator> {
EntryIterator(Enumeration e) {
super(e);
}
@Override
public void remove() {
if (currentKey != null && !removeCalled) {
removeCalled = true;
removeKey(currentKey);
} else {
throw new IllegalStateException();
}
}
@Override
public Map.Entry next() {
nextKey();
return new Entry<>(currentKey, get(currentKey));
}
}
class KeyIterator extends BaseIterator {
KeyIterator(Enumeration e) {
super(e);
}
@Override
public void remove() {
if (currentKey != null && !removeCalled) {
removeCalled = true;
removeKey(currentKey);
} else {
throw new IllegalStateException();
}
}
@Override
public String next() {
return nextKey();
}
}
class ValueIterator extends BaseIterator {
ValueIterator(Enumeration e) {
super(e);
}
@Override
public void remove() {
if (currentKey != null && !removeCalled) {
removeCalled = true;
removeValue(get(currentKey));
} else {
throw new IllegalStateException();
}
}
@Override
public V next() {
nextKey();
return get(currentKey);
}
}
static class Entry implements Map.Entry {
// immutable Entry
private final String key;
private final V value;
Entry(String key, V value) {
this.key = key;
this.value = value;
}
@Override
public String getKey() {
return key;
}
@Override
public V getValue() {
return value;
}
// No support of setting the value
@Override
public V setValue(V value) {
throw new UnsupportedOperationException();
}
@Override
public int hashCode() {
return (key == null ? 0 : key.hashCode()) ^ (value == null ? 0 : value.hashCode());
}
@Override
public boolean equals(Object obj) {
if ( !(obj instanceof Map.Entry) ) {
return false;
}
Map.Entry input = (Map.Entry) obj;
Object key = input.getKey();
Object value = input.getValue();
return Objects.equals(key, this.key) &&
Objects.equals(value, this.value);
}
}
}