001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.juneau.internal; 018 019import java.util.*; 020 021import org.apache.juneau.*; 022import org.apache.juneau.collections.*; 023import org.apache.juneau.common.utils.*; 024 025/** 026 * Represents a wrapped {@link Map} where entries in the map can be removed without affecting the underlying map. 027 * 028 * <h5 class='section'>See Also:</h5><ul> 029 030 * </ul> 031 * 032 * @param <T> The class type of the wrapped bean. 033 * @serial exclude 034 */ 035@SuppressWarnings("rawtypes") 036public class DelegateMap<T extends Map> extends JsonMap implements Delegate<T> { 037 private static final long serialVersionUID = 1L; 038 039 private transient ClassMeta<T> classMeta; 040 041 /** 042 * Constructor. 043 * 044 * @param m The metadata object that created this delegate object. 045 * @param session The current bean session. 046 */ 047 @SuppressWarnings("unchecked") 048 public DelegateMap(T m, BeanSession session) { 049 this.classMeta = session.getClassMetaForObject(m); 050 m.forEach((k,v) -> put(Utils.s(k), v)); 051 } 052 053 @Override /* Delegate */ 054 public ClassMeta<T> getClassMeta() { 055 return classMeta; 056 } 057 058 /** 059 * Remove all but the specified keys from this map. 060 * 061 * <p> 062 * This does not affect the underlying map. 063 * 064 * @param keys The remaining keys in the map (in the specified order). 065 * @return This object. 066 */ 067 public DelegateMap<T> filterKeys(List<String> keys) { 068 JsonMap m = new JsonMap(); 069 keys.forEach(k -> { 070 if (containsKey(k)) 071 m.put(k, get(k)); 072 }); 073 this.clear(); 074 this.putAll(m); 075 return this; 076 } 077}