001 /*
002 * Copyright (C) 2011 eXo Platform SAS.
003 *
004 * This is free software; you can redistribute it and/or modify it
005 * under the terms of the GNU Lesser General Public License as
006 *
007 * published by the Free Software Foundation; either version 2.1 of
008 * the License, or (at your option) any later version.
009 *
010 * This software is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013 * Lesser General Public License for more details.
014 *
015 * You should have received a copy of the GNU Lesser General Public
016 * License along with this software; if not, write to the Free
017 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
018 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
019 */
020
021 package org.crsh.command.impl;
022
023 import org.crsh.command.InvocationContext;
024
025 import java.util.*;
026
027 /**
028 * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
029 */
030 public class AttributesMap extends AbstractMap<String, Object> {
031
032 /** . */
033 private InvocationContext<?, ?> context;
034
035 /** . */
036 private Map<String, Object> delegate;
037
038 /** . */
039 private Set<Entry<String, Object>> entries;
040
041 public AttributesMap(InvocationContext<?, ?> context, Map<String, Object> delegate) {
042 this.context = context;
043 this.delegate = delegate;
044 }
045
046 private Entry<String, Object> out = new Entry<String, Object>() {
047 public String getKey() {
048 return "out";
049 }
050 public Object getValue() {
051 return context.getWriter();
052 }
053 public Object setValue(Object value) {
054 throw new IllegalArgumentException("Cannot change out entry");
055 }
056 };
057
058 @Override
059 public Object get(Object key) {
060 if ("out".equals(key)) {
061 return out.getValue();
062 } else {
063 return delegate.get(key);
064 }
065 }
066
067 @Override
068 public Object put(String key, Object value) {
069 if ("out".equals(key)) {
070 throw new IllegalArgumentException("Cannot change out entry");
071 } else {
072 return delegate.put(key, value);
073 }
074 }
075
076 @Override
077 public boolean containsKey(Object key) {
078 if ("out".equals(key)) {
079 return true;
080 } else {
081 return delegate.containsKey(key);
082 }
083 }
084
085 @Override
086 public Object remove(Object key) {
087 if ("out".equals(key)) {
088 throw new IllegalArgumentException("Cannot change out entry");
089 } else {
090 return delegate.remove(key);
091 }
092 }
093
094 @Override
095 public void clear() {
096 throw new UnsupportedOperationException("Cannot clear the attribute map");
097 }
098
099 @Override
100 public Set<Entry<String, Object>> entrySet() {
101 if (entries == null) {
102 entries = new AbstractSet<Entry<String, Object>>() {
103 @Override
104 public Iterator<Entry<String, Object>> iterator() {
105 return new Iterator<Entry<String, Object>>() {
106 Iterator<Entry<String, Object>> i = delegate.entrySet().iterator();
107 Entry<String, Object> next = out;
108 public boolean hasNext() {
109 while (next == null && i.hasNext()) {
110 Entry<String, Object> tmp = i.next();
111 if (!next.getKey().equals("out")) {
112 next = tmp;
113 }
114 }
115 return next != null;
116 }
117 public Entry<String, Object> next() {
118 if (hasNext()) {
119 Entry<String, Object> tmp = next;
120 next = null;
121 return tmp;
122 } else {
123 throw new NoSuchElementException();
124 }
125 }
126 public void remove() {
127 throw new UnsupportedOperationException();
128 }
129 };
130 }
131 @Override
132 public int size() {
133 return delegate.size() + (delegate.containsKey("out") ? 0 : 1);
134 }
135 };
136 }
137 return entries;
138 }
139 }