1 /*
2 * Copyright (c) 2001-2004,
3 * RedVerst Group, ISP RAS http://www.ispras.ru
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright notice, this
10 * list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
15 *
16 * 3. The names "ATP", "TreeDL", "RedVerst", "ISP RAS"
17 * may not be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
24 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
27 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 package com.unitesk.atp.dynattrs;
33
34 import java.util.HashMap;
35 import java.util.HashSet;
36 import java.util.Map;
37 import java.util.Set;
38
39 /***
40 * The implementation of {@link Attributed} interface that stores attributes
41 * in {@link Map}.
42 *
43 * @author <A href="mailto:demakov@ispras.ru">Alexey Demakov</A>
44 * @version $Id: MapAttributed.java,v 1.2 2005/08/02 06:04:29 all-x Exp $
45 */
46 public class MapAttributed extends IndexedAttributedImpl
47 {
48 /***
49 * Class constructor with the default map created by {@link #createMap()}.
50 */
51 public MapAttributed()
52 {
53 }
54
55 /***
56 * Class constructor with the specified map.
57 *
58 * @param map The map to store attributes.
59 * This map should support optional operations:
60 * {@link Map#put(Object,Object)}, {@link Map#remove(Object)}.
61 * @throws NullPointerException
62 * If <code>map</code> is <code>null</code>.
63 */
64 public MapAttributed( Map map )
65 {
66 if( map == null )
67 {
68 throw new NullPointerException();
69 }
70 this.map = map;
71 }
72
73 /***
74 * {@inheritDoc}
75 */
76 public boolean hasAttribute( String name )
77 {
78 /*
79 * If map allows null key we should throw NullPointerException.
80 */
81 if( name == null )
82 {
83 throw new AttributeException( this, name );
84 }
85 if( map == null ) return false;
86 return map.containsKey( name );
87 }
88
89 /***
90 * Always returns <code>true</code> - attributes of this class
91 * may be created dynamically.
92 */
93 public boolean isAttrCreatable()
94 {
95 return true;
96 }
97
98 /***
99 * All existent attributes may be removed dynamically.
100 */
101 public boolean isRemovable( String name )
102 {
103 if( !hasAttribute( name ) )
104 {
105 throw new AttributeException( this, name );
106 }
107 return true;
108 }
109
110 /***
111 * Always returns <code>true</code> - all attributes of this class
112 * are writable.
113 */
114 public boolean isWritable( String name )
115 {
116 if( !hasAttribute( name ) )
117 {
118 throw new AttributeException( this, name );
119 }
120 return true;
121 }
122
123 //------------------------------------------------------------------------------
124
125 /***
126 * {@inheritDoc}
127 */
128 public void addAttribute( String name, Object value )
129 {
130 if( hasAttribute( name ) )
131 {
132 throw new AttributeException( this, name );
133 }
134 if( map == null ) createMap();
135 map.put( name, value );
136 }
137
138 /***
139 * {@inheritDoc}
140 */
141 public void removeAttribute( String name )
142 {
143 /*
144 * If map allows null key we should throw NullPointerException.
145 */
146 if( name == null )
147 {
148 throw new AttributeException( this, null );
149 }
150
151 if( map == null ) return;
152
153 map.remove( name );
154 }
155
156 //------------------------------------------------------------------------------
157
158 /***
159 * {@inheritDoc}
160 */
161 public Object getAttribute( String name )
162 {
163 if( !hasAttribute( name ) )
164 {
165 throw new AttributeException( this, name );
166 }
167 // (map == null) => !hasAttribute( name )
168 return map.get( name );
169 }
170
171 /***
172 * {@inheritDoc}
173 */
174 public void setAttribute( String name, Object value )
175 {
176 if( !hasAttribute( name ) )
177 {
178 throw new AttributeException( this, name );
179 }
180 // (map == null) => !hasAttribute( name )
181 map.put( name, value );
182 }
183
184 //------------------------------------------------------------------------------
185
186 /***
187 * {@inheritDoc}
188 */
189 public Set/*String*/ getAttributeNames()
190 {
191 if( map == null ) return new HashSet/*String*/();
192 return map.keySet();
193 }
194
195 //------------------------------------------------------------------------------
196 // implementation
197
198 /***
199 * Creates default map instance.
200 */
201 protected void createMap()
202 {
203 map = new HashMap/*String,Object*/();
204 }
205
206 private Map/*String,Object*/ map = null;
207 }