001    package org.apache.turbine.om.security;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one
005     * or more contributor license agreements.  See the NOTICE file
006     * distributed with this work for additional information
007     * regarding copyright ownership.  The ASF licenses this file
008     * to you under the Apache License, Version 2.0 (the
009     * "License"); you may not use this file except in compliance
010     * with the License.  You may obtain a copy of the License at
011     *
012     *   http://www.apache.org/licenses/LICENSE-2.0
013     *
014     * Unless required by applicable law or agreed to in writing,
015     * software distributed under the License is distributed on an
016     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017     * KIND, either express or implied.  See the License for the
018     * specific language governing permissions and limitations
019     * under the License.
020     */
021    
022    import java.util.Collections;
023    import java.util.HashMap;
024    import java.util.Map;
025    
026    /**
027     * This class represents a generic object used in the Access Control Lists.
028     *
029     * @author <a href="mailto:frank.kim@clearink.com">Frank Y. Kim</a>
030     * @author <a href="mailto:john.mcnally@clearink.com">John D. McNally</a>
031     * @author <a href="mailto:bmclaugh@algx.net">Brett McLaughlin</a>
032     * @author <a href="mailto:Rafal.Krzewski@e-point.pl">Rafal Krzewski</a>
033     * @version $Id: SecurityObject.java 1071091 2011-02-15 22:06:55Z tv $
034     */
035    public abstract class SecurityObject<T extends SecurityEntity> implements Comparable<T>
036    {
037        /** The name of this object. */
038        private String name;
039    
040        /** The id of this object */
041        private int id;
042    
043        /** The attributes of this object. */
044        private Map<String, Object> attributes;
045    
046        /**
047         * Constructs a new SecurityObject
048         */
049        public SecurityObject()
050        {
051            this("");
052        }
053    
054        /**
055         * Constructs a new SecurityObject with the specified name.
056         *
057         * @param name The name of the new object.
058         */
059        public SecurityObject(String name)
060        {
061            setName(name);
062            setId(0);
063            setAttributes(Collections.synchronizedMap(new HashMap<String, Object>()));
064        }
065    
066        /**
067         * Returns a Map containing this object's attributes.
068         *
069         * @return the object's attributes.
070         */
071        public Map<String, Object> getAttributes()
072        {
073            return attributes;
074        }
075    
076        /**
077         * Replaces this object's attributes with the specified Map.
078         *
079         * @param attributes The new attributes of the object.
080         */
081        public void setAttributes(Map<String, Object> attributes)
082        {
083            this.attributes = attributes;
084        }
085    
086        /**
087         * Retrieves the value of specific attribute of this object.
088         *
089         * @param name the name of the attribute
090         * @return the value of the attribute
091         */
092        public Object getAttribute(String name)
093        {
094            return attributes.get(name);
095        }
096    
097        /**
098         * Sets the value of specific attribute of this object.
099         *
100         * @param name the name of the attribute
101         * @param value the value of the attribute
102         */
103        public void setAttribute(String name, Object value)
104        {
105            attributes.put(name, value);
106        }
107    
108        /**
109         * Returns the name of this object.
110         *
111         * @return The name of the object.
112         */
113        public String getName()
114        {
115            return name;
116        }
117    
118        /**
119         * Sets the name of this object.
120         *
121         * @param name The name of the object.
122         */
123        public void setName(String name)
124        {
125            this.name = name;
126        }
127    
128        /**
129         * Unused. There is an ID column in the
130         * database scheme but it doesn't seem
131         * to be used.
132         *
133         * @return 0
134         */
135        public int getId()
136        {
137            return id;
138        }
139    
140        /**
141         * Unused. There is an ID column in the
142         * database scheme but it doesn't seem
143         * to be used.
144         *
145         * @return null
146         */
147        public Integer getIdAsObj()
148        {
149            return new Integer(id);
150        }
151    
152        /**
153         * Unused. There is an ID column in the
154         * database scheme but it doesn't seem
155         * to be used.
156         *
157         * @param id The id of the User.
158         */
159        public void setId(int id)
160        {
161            this.id = id;
162        }
163    
164        /**
165         * Used for ordering SecurityObjects.
166         *
167         * @param obj The Object to compare to.
168         * @return -1 if the name of the other object is lexically greater than this
169         *         group, 1 if it is lexically lesser, 0 if they are equal.
170         */
171        public int compareTo(T obj)
172        {
173            if (this.getClass() != obj.getClass())
174            {
175                throw new ClassCastException();
176            }
177    
178            String name1 = obj.getName();
179            String name2 = this.getName();
180    
181            return name2.compareTo(name1);
182        }
183    
184        /**
185         * Returns a textual representation of this object, consisted by
186         * it's name and attributes.
187         *
188         * @return  a textual representation of this group.
189         */
190        public String toString()
191        {
192            return (getName() + ':' + getAttributes().toString());
193        }
194    }