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.activemq.kaha.impl.index;
018
019import java.io.IOException;
020import java.util.HashMap;
021import java.util.Map;
022
023import org.apache.activemq.kaha.IndexMBean;
024import org.apache.activemq.kaha.Marshaller;
025import org.apache.activemq.kaha.StoreEntry;
026import org.slf4j.Logger;
027import org.slf4j.LoggerFactory;
028
029/**
030 * Index implementation using a HashMap
031 *
032 * 
033 */
034public class VMIndex implements Index, IndexMBean {
035    private static final Logger LOG = LoggerFactory.getLogger(VMIndex.class);
036    private IndexManager indexManager;
037    private Map<Object, StoreEntry> map = new HashMap<Object, StoreEntry>();
038
039    public VMIndex(IndexManager manager) {
040        this.indexManager = manager;
041    }
042
043    /**
044     *
045     * @see org.apache.activemq.kaha.impl.index.Index#clear()
046     */
047    public void clear() {
048        map.clear();
049    }
050
051    /**
052     * @param key
053     * @return true if the index contains the key
054     * @see org.apache.activemq.kaha.impl.index.Index#containsKey(java.lang.Object)
055     */
056    public boolean containsKey(Object key) {
057        return map.containsKey(key);
058    }
059
060    /**
061     * @param key
062     * @return store entry
063     * @see org.apache.activemq.kaha.impl.index.Index#removeKey(java.lang.Object)
064     */
065    public StoreEntry remove(Object key) {
066        StoreEntry result = map.remove(key);
067        if (result != null) {
068            try {
069                result = indexManager.refreshIndex((IndexItem)result);
070            } catch (IOException e) {
071                LOG.error("Failed to refresh entry", e);
072                throw new RuntimeException("Failed to refresh entry");
073            }
074        }
075        return result;
076    }
077
078    /**
079     * @param key
080     * @param entry
081     * @see org.apache.activemq.kaha.impl.index.Index#store(java.lang.Object,
082     *      org.apache.activemq.kaha.impl.index.IndexItem)
083     */
084    public void store(Object key, StoreEntry entry) {
085        map.put(key, entry);
086    }
087
088    /**
089     * @param key
090     * @return the entry
091     */
092    public StoreEntry get(Object key) {
093        StoreEntry result = map.get(key);
094        if (result != null) {
095            try {
096                result = indexManager.refreshIndex((IndexItem)result);
097            } catch (IOException e) {
098                LOG.error("Failed to refresh entry", e);
099                throw new RuntimeException("Failed to refresh entry");
100            }
101        }
102        return result;
103    }
104
105    /**
106     * @return true if the index is transient
107     */
108    public boolean isTransient() {
109        return true;
110    }
111
112    /**
113     * load indexes
114     */
115    public void load() {
116    }
117
118    /**
119     * unload indexes
120     */
121    public void unload() {
122        map.clear();
123    }
124
125    public void delete() throws IOException {
126        unload();
127    }
128
129    public void setKeyMarshaller(Marshaller marshaller) {
130    }
131
132    public int getSize() {
133        return map.size();
134    }
135}