/*******************************************************************************
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *******************************************************************************/
package org.ofbiz.base.util.collections;

import java.util.Map;

public abstract class GenericMapEntrySet<K, V, M extends GenericMap<K, V>> extends GenericMapSet<K, V, M, Map.Entry<K, V>> {
    public GenericMapEntrySet(M source) {
        super(source);
    }

    public boolean contains(Object item) {
        if (item == null) return false;
        if (!(item instanceof Map.Entry<?, ?>)) return false;
        Map.Entry<?, ?> other = (Map.Entry<?, ?>) item;
        return contains(other.getKey(), other.getValue());
    }

    protected abstract boolean contains(Object key, Object value);

    public boolean remove(Object item) {
        if (item == null) return false;
        if (!(item instanceof Map.Entry<?, ?>)) return false;
        Map.Entry<?, ?> other = (Map.Entry<?, ?>) item;
        Object key = other.getKey();
        if (!source.containsKey(key)) return false;
        source.remove(key);
        return true;
    }
}

