001    /*
002     * JBoss DNA (http://www.jboss.org/dna)
003     * See the COPYRIGHT.txt file distributed with this work for information
004     * regarding copyright ownership.  Some portions may be licensed
005     * to Red Hat, Inc. under one or more contributor license agreements.
006     * See the AUTHORS.txt file in the distribution for a full listing of 
007     * individual contributors.
008     *
009     * Unless otherwise indicated, all code in JBoss DNA is licensed
010     * to you under the terms of the GNU Lesser General Public License as
011     * published by the Free Software Foundation; either version 2.1 of
012     * the License, or (at your option) any later version.
013     * 
014     * JBoss DNA is distributed in the hope that it will be useful,
015     * but WITHOUT ANY WARRANTY; without even the implied warranty of
016     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
017     * Lesser General Public License for more details.
018     *
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this software; if not, write to the Free
021     * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
022     * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
023     */
024    package org.jboss.dna.jcr.cache;
025    
026    import java.util.Collections;
027    import java.util.List;
028    import java.util.Map;
029    import java.util.Set;
030    import java.util.UUID;
031    import net.jcip.annotations.Immutable;
032    import org.jboss.dna.graph.Location;
033    import org.jboss.dna.graph.property.Name;
034    import org.jboss.dna.jcr.NodeDefinitionId;
035    
036    /**
037     * The information that describes a node. This is the information that is kept in the cache.
038     */
039    @Immutable
040    public class ImmutableNodeInfo implements NodeInfo {
041        private final Location originalLocation;
042        private final UUID uuid;
043        private final UUID parent;
044        private final Name primaryTypeName;
045        private final NodeDefinitionId definition;
046        private final Children children;
047        private final Map<Name, PropertyInfo> properties;
048        private final List<Name> mixinTypeNames;
049    
050        /**
051         * Create an immutable NodeInfo instance.
052         * 
053         * @param originalLocation the original location
054         * @param primaryTypeName the name of the node's primary type
055         * @param mixinTypeNames the names of the mixin types for this node, or null if there are none
056         * @param definition the definition used when creating the node
057         * @param parent the parent
058         * @param children the immutable children; may be null if there are no children
059         * @param properties the unmodifiable map of properties; may be null if there are no properties
060         */
061        public ImmutableNodeInfo( Location originalLocation,
062                                  Name primaryTypeName,
063                                  List<Name> mixinTypeNames,
064                                  NodeDefinitionId definition,
065                                  UUID parent,
066                                  Children children,
067                                  Map<Name, PropertyInfo> properties ) {
068            this.originalLocation = originalLocation;
069            this.primaryTypeName = primaryTypeName;
070            this.definition = definition;
071            this.parent = parent;
072            this.uuid = this.originalLocation.getUuid();
073            this.children = children != null ? children : new EmptyChildren(this.uuid);
074            this.properties = properties != null ? properties : Collections.<Name, PropertyInfo>emptyMap();
075            this.mixinTypeNames = mixinTypeNames != null ? mixinTypeNames : Collections.<Name>emptyList();
076            assert this.uuid != null;
077            assert this.definition != null;
078            assert this.primaryTypeName != null;
079            assert this.children != null;
080            assert this.mixinTypeNames != null;
081            assert this.properties != null;
082        }
083    
084        /**
085         * {@inheritDoc}
086         * 
087         * @see org.jboss.dna.jcr.cache.NodeInfo#getOriginalLocation()
088         */
089        public Location getOriginalLocation() {
090            return originalLocation;
091        }
092    
093        /**
094         * {@inheritDoc}
095         * 
096         * @see org.jboss.dna.jcr.cache.NodeInfo#getUuid()
097         */
098        public UUID getUuid() {
099            return uuid;
100        }
101    
102        /**
103         * {@inheritDoc}
104         * 
105         * @see org.jboss.dna.jcr.cache.NodeInfo#getParent()
106         */
107        public UUID getParent() {
108            return parent;
109        }
110    
111        /**
112         * {@inheritDoc}
113         * 
114         * @see org.jboss.dna.jcr.cache.NodeInfo#getPrimaryTypeName()
115         */
116        public Name getPrimaryTypeName() {
117            return primaryTypeName;
118        }
119    
120        /**
121         * {@inheritDoc}
122         * 
123         * @see org.jboss.dna.jcr.cache.NodeInfo#getMixinTypeNames()
124         */
125        public List<Name> getMixinTypeNames() {
126            return mixinTypeNames;
127        }
128    
129        /**
130         * {@inheritDoc}
131         * 
132         * @see org.jboss.dna.jcr.cache.NodeInfo#getDefinitionId()
133         */
134        public NodeDefinitionId getDefinitionId() {
135            return definition;
136        }
137    
138        /**
139         * {@inheritDoc}
140         * 
141         * @see org.jboss.dna.jcr.cache.NodeInfo#getChildren()
142         */
143        public Children getChildren() {
144            return children;
145        }
146    
147        /**
148         * {@inheritDoc}
149         * 
150         * @see org.jboss.dna.jcr.cache.NodeInfo#hasProperties()
151         */
152        public boolean hasProperties() {
153            return this.properties.size() != 0;
154        }
155    
156        /**
157         * {@inheritDoc}
158         * 
159         * @see org.jboss.dna.jcr.cache.NodeInfo#getPropertyCount()
160         */
161        public int getPropertyCount() {
162            return this.properties.size();
163        }
164    
165        /**
166         * {@inheritDoc}
167         * 
168         * @see org.jboss.dna.jcr.cache.NodeInfo#getPropertyNames()
169         */
170        public Set<Name> getPropertyNames() {
171            return this.properties.keySet();
172        }
173    
174        /**
175         * {@inheritDoc}
176         * 
177         * @see org.jboss.dna.jcr.cache.NodeInfo#getProperty(org.jboss.dna.graph.property.Name)
178         */
179        public PropertyInfo getProperty( Name name ) {
180            return this.properties.get(name);
181        }
182    
183        /**
184         * {@inheritDoc}
185         * 
186         * @return {@code false} always as this object represents unmodified nodes only
187         * @see org.jboss.dna.jcr.cache.NodeInfo#isNew()
188         */
189        public boolean isNew() {
190            return false;
191        }
192    
193        /**
194         * {@inheritDoc}
195         * 
196         * @return {@code false} always as this object represents unmodified nodes only
197         * @see org.jboss.dna.jcr.cache.NodeInfo#isModified()
198         */
199        public boolean isModified() {
200            return false;
201        }
202    
203        @Override
204        public String toString() {
205            return this.uuid + " (" + primaryTypeName + ") {" + properties + "}";
206        }
207    }