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     * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
010     * is licensed 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.connector.store.jpa.model.basic;
025    
026    import java.util.Collection;
027    import java.util.HashSet;
028    import javax.persistence.Column;
029    import javax.persistence.Entity;
030    import javax.persistence.FetchType;
031    import javax.persistence.Id;
032    import javax.persistence.JoinColumn;
033    import javax.persistence.JoinTable;
034    import javax.persistence.Lob;
035    import javax.persistence.NamedQueries;
036    import javax.persistence.NamedQuery;
037    import javax.persistence.Table;
038    import org.jboss.dna.connector.store.jpa.util.Serializer;
039    
040    /**
041     * Represents the packed properties of a single node. Node that the object has the node's identifier and the packed properties,
042     * but nothing else. The PropertiesEntity doesn't even have the name. This is because this class is used to read, modify, and save
043     * the properties of a node. Finding a node by its name or working with the children, however, requires working with the
044     * {@link ChildEntity node children}.
045     * 
046     * @author Randall Hauch
047     */
048    @Entity
049    @Table( name = "DNA_BASIC_NODEPROPS" )
050    @NamedQueries( {
051        @NamedQuery( name = "PropertiesEntity.findByUuid", query = "select prop from PropertiesEntity as prop where prop.id.workspaceId = :workspaceId and prop.id.uuidString = :uuid" ),
052        @NamedQuery( name = "PropertiesEntity.deleteByUuid", query = "delete PropertiesEntity prop where prop.id.workspaceId = :workspaceId and prop.id.uuidString = :uuid" ),
053        @NamedQuery( name = "PropertiesEntity.findInWorkspace", query = "select prop from PropertiesEntity as prop where prop.id.workspaceId = :workspaceId" ),
054        @NamedQuery( name = "PropertiesEntity.withLargeValues", query = "select prop from PropertiesEntity as prop where prop.id.workspaceId = :workspaceId and size(prop.largeValues) > 0" )} )
055    public class PropertiesEntity {
056        @Id
057        private NodeId id;
058    
059        @Lob
060        @Column( name = "DATA", nullable = true, unique = false )
061        private byte[] data;
062    
063        @Column( name = "NUM_PROPS", nullable = false )
064        private int propertyCount;
065    
066        /**
067         * Flag specifying whether the binary data is stored in a compressed format.
068         */
069        @Column( name = "COMPRESSED", nullable = true )
070        private Boolean compressed;
071    
072        /**
073         * Flag specifying whether this node should be included in referential integrity enforcement.
074         */
075        @Column( name = "ENFORCEREFINTEG", nullable = false )
076        private boolean referentialIntegrityEnforced = true;
077    
078        @org.hibernate.annotations.CollectionOfElements( fetch = FetchType.LAZY )
079        @JoinTable( name = "DNA_LARGEVALUE_USAGES", joinColumns = {@JoinColumn( name = "WORKSPACE_ID" ),
080            @JoinColumn( name = "NODE_UUID" )} )
081        private Collection<LargeValueId> largeValues = new HashSet<LargeValueId>();
082    
083        public PropertiesEntity() {
084        }
085    
086        public PropertiesEntity( NodeId id ) {
087            setId(id);
088        }
089    
090        /**
091         * Get the node's identifier.
092         * 
093         * @return the node's identifier
094         */
095        public NodeId getId() {
096            return id;
097        }
098    
099        /**
100         * Set the node's identifier.
101         * 
102         * @param id the new identifier for the node
103         */
104        public void setId( NodeId id ) {
105            this.id = id;
106        }
107    
108        /**
109         * Get the data that represents the {@link Serializer packed} properties.
110         * 
111         * @return the raw data representing the properties
112         */
113        public byte[] getData() {
114            return data;
115        }
116    
117        /**
118         * Set the data that represents the {@link Serializer packed} properties.
119         * 
120         * @param data the raw data representing the properties
121         */
122        public void setData( byte[] data ) {
123            this.data = data;
124        }
125    
126        /**
127         * @return propertyCount
128         */
129        public int getPropertyCount() {
130            return propertyCount;
131        }
132    
133        /**
134         * @param propertyCount Sets propertyCount to the specified value.
135         */
136        public void setPropertyCount( int propertyCount ) {
137            this.propertyCount = propertyCount;
138        }
139    
140        /**
141         * @return compressed
142         */
143        public boolean isCompressed() {
144            return compressed != null && compressed.booleanValue();
145        }
146    
147        /**
148         * @param compressed Sets compressed to the specified value.
149         */
150        public void setCompressed( boolean compressed ) {
151            this.compressed = Boolean.valueOf(compressed);
152        }
153    
154        /**
155         * @return largeValues
156         */
157        public Collection<LargeValueId> getLargeValues() {
158            return largeValues;
159        }
160    
161        /**
162         * @return referentialIntegrityEnforced
163         */
164        public boolean isReferentialIntegrityEnforced() {
165            return referentialIntegrityEnforced;
166        }
167    
168        /**
169         * @param referentialIntegrityEnforced Sets referentialIntegrityEnforced to the specified value.
170         */
171        public void setReferentialIntegrityEnforced( boolean referentialIntegrityEnforced ) {
172            this.referentialIntegrityEnforced = referentialIntegrityEnforced;
173        }
174    
175        /**
176         * {@inheritDoc}
177         * 
178         * @see java.lang.Object#hashCode()
179         */
180        @Override
181        public int hashCode() {
182            return getId().hashCode();
183        }
184    
185        /**
186         * {@inheritDoc}
187         * 
188         * @see java.lang.Object#equals(java.lang.Object)
189         */
190        @Override
191        public boolean equals( Object obj ) {
192            if (obj == this) return true;
193            if (obj instanceof PropertiesEntity) {
194                PropertiesEntity that = (PropertiesEntity)obj;
195                if (this.getId().equals(that.getId())) return true;
196            }
197            return false;
198        }
199    
200        /**
201         * {@inheritDoc}
202         * 
203         * @see java.lang.Object#toString()
204         */
205        @Override
206        public String toString() {
207            return "Properties for " + this.id;
208        }
209    }