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 */
017
018 package org.apache.commons.betwixt.strategy;
019
020 import java.util.HashMap;
021 import java.util.Map;
022
023 import org.apache.commons.betwixt.expression.Context;
024
025 /**
026 * <p>Stores every ID that given to it into an internal <code>HashMap</code> and
027 * returns it on request.
028 * </p><p>
029 * {@link #DefaultIdStoringStrategy(Map, Map)} allows the implementations
030 * to be specified.
031 * For example, those who want to use identity (rather than equality)
032 * should pass a <code>IdentityHashMap</code> instance.
033 * </p>
034 *
035 * @author <a href="mailto:christian@wilde-welt.de">Christian Aust</a>
036 * @since 0.7
037 */
038 public class DefaultIdStoringStrategy extends IdStoringStrategy {
039 private Map idByBeanMap;
040 private Map beanByIdMap;
041
042 /**
043 * Constructs a {@link IdStoringStrategy} using a <code>HashMap</code> for
044 * storage.
045 */
046 public DefaultIdStoringStrategy() {
047 this(new HashMap(), new HashMap());
048 }
049
050 /**
051 * Constructs a {@link IdStoringStrategy}using the <code>Map</code>
052 * implementations provided for storage.
053 *
054 * @param idByBeanMap <code>Map</code> implementation stores the ID's by bean
055 * @param beanByIdMap <code>Map</code> implementation stores the bean's by ID
056 * @since 0.8
057 */
058 public DefaultIdStoringStrategy(Map idByBeanMap, Map beanByIdMap) {
059 this.idByBeanMap = idByBeanMap;
060 this.beanByIdMap = beanByIdMap;
061 }
062
063
064 /**
065 * Returns a String id for the given bean if it has been stored previously.
066 * Otherwise returns null.
067 *
068 * @param context
069 * current context, not null
070 * @param bean
071 * the instance, not null
072 * @return id as String, or null if not found
073 * @see org.apache.commons.betwixt.strategy.IdStoringStrategy#getReferenceFor(org.apache.commons.betwixt.expression.Context,
074 * java.lang.Object)
075 */
076 public String getReferenceFor(Context context, Object bean) {
077 return (String) idByBeanMap.get(bean);
078 }
079
080 /**
081 * Stores an ID for the given instance and context. It will check first if
082 * this ID has been previously stored and will do nothing in that case.
083 *
084 * @param context
085 * current context, not null
086 * @param bean
087 * current instance, not null
088 * @param id
089 * the ID to store
090 * @see org.apache.commons.betwixt.strategy.IdStoringStrategy#setReference(org.apache.commons.betwixt.expression.Context,
091 * java.lang.Object, java.lang.String)
092 */
093 public void setReference(Context context, Object bean, String id) {
094 if (!idByBeanMap.containsKey(bean)) {
095 idByBeanMap.put(bean, id);
096 beanByIdMap.put(id, bean);
097 }
098 }
099
100 /**
101 * Gets an object matching the given reference.
102 * @param context <code>Context</code>, not null
103 * @param id the reference id
104 * @return an bean matching the given reference,
105 * or null if there is no bean matching the given reference
106 */
107 public Object getReferenced(Context context, String id) {
108 return beanByIdMap.get(id);
109 }
110
111 /**
112 * Clears all beans.
113 */
114 public void reset() {
115 idByBeanMap.clear();
116 beanByIdMap.clear();
117 }
118
119
120 }