/** * 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.apache.camel.util; import java.util.AbstractMap; import java.util.AbstractSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import javax.activation.DataHandler; import org.apache.camel.Attachment; import org.apache.camel.impl.DefaultAttachment; /** * The AttachmentMap class provides a transparent Map<String, DataHandler> * interface for a Map<String, Attachment> */ public class AttachmentMap extends AbstractMap<String, DataHandler> { private Map<String, Attachment> map; public AttachmentMap(Map<String, Attachment> backingMap) { this.map = backingMap; } @Override public DataHandler put(String key, DataHandler value) { Attachment old = map.put(key, new DefaultAttachment(value)); if (old == null) { return null; } else { return old.getDataHandler(); } } @Override public Set<Map.Entry<String, DataHandler>> entrySet() { return new AttachmentEntrySet(map.entrySet()); } public Map<String, Attachment> getOriginalMap() { return map; } private static class AttachmentEntrySet extends AbstractSet<Map.Entry<String, DataHandler>> { private Set<Map.Entry<String, Attachment>> set; AttachmentEntrySet(Set<Map.Entry<String, Attachment>> set) { this.set = set; } @Override public int size() { return set.size(); } @Override public Iterator<Map.Entry<String, DataHandler>> iterator() { return new AttachmentEntrySetIterator(set.iterator()); } } private static class AttachmentEntrySetIterator implements Iterator<Map.Entry<String, DataHandler>> { private Iterator<Map.Entry<String, Attachment>> iter; AttachmentEntrySetIterator(Iterator<Map.Entry<String, Attachment>> origIterator) { iter = origIterator; } @Override public boolean hasNext() { return iter.hasNext(); } @Override public Map.Entry<String, DataHandler> next() { return new AttachmentEntry(iter.next()); } public void remove() { iter.remove(); } } private static class AttachmentEntry implements Map.Entry<String, DataHandler> { private Map.Entry<String, Attachment> entry; AttachmentEntry(Map.Entry<String, Attachment> backingEntry) { this.entry = backingEntry; } @Override public String getKey() { return entry.getKey(); } @Override public DataHandler getValue() { Attachment value = entry.getValue(); if (value != null) { return value.getDataHandler(); } return null; } @Override public DataHandler setValue(DataHandler value) { Attachment oldValue = entry.setValue(new DefaultAttachment(value)); if (oldValue != null) { return oldValue.getDataHandler(); } return null; } // two AttachmentEntry objects are equal if the backing entries are equal public boolean equals(Object o) { if (o instanceof AttachmentEntry && entry.equals(((AttachmentEntry)o).entry)) { return true; } return false; } public int hashCode() { return entry.hashCode(); } } }