001 /*
002 * JBoss, Home of Professional Open Source.
003 * Copyright 2008, Red Hat Middleware LLC, and individual contributors
004 * as indicated by the @author tags. See the copyright.txt file in the
005 * distribution for a full listing of individual contributors.
006 *
007 * This is free software; you can redistribute it and/or modify it
008 * under the terms of the GNU Lesser General Public License as
009 * published by the Free Software Foundation; either version 2.1 of
010 * the License, or (at your option) any later version.
011 *
012 * This software is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * Lesser General Public License for more details.
016 *
017 * You should have received a copy of the GNU Lesser General Public
018 * License along with this software; if not, write to the Free
019 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021 */
022 package org.jboss.dna.graph.commands.basic;
023
024 import java.util.HashMap;
025 import java.util.LinkedList;
026 import java.util.List;
027 import java.util.Map;
028 import net.jcip.annotations.NotThreadSafe;
029 import org.jboss.dna.common.util.StringUtil;
030 import org.jboss.dna.graph.cache.CachePolicy;
031 import org.jboss.dna.graph.commands.GetChildrenCommand;
032 import org.jboss.dna.graph.properties.DateTime;
033 import org.jboss.dna.graph.properties.Path;
034 import org.jboss.dna.graph.properties.Property;
035 import org.jboss.dna.graph.properties.Path.Segment;
036
037 /**
038 * @author Randall Hauch
039 */
040 @NotThreadSafe
041 public class BasicGetChildrenCommand extends BasicGraphCommand implements GetChildrenCommand {
042
043 /**
044 */
045 private static final long serialVersionUID = -8515194602506918337L;
046 private final Map<Segment, Property[]> childProperties = new HashMap<Segment, Property[]>();
047 private final List<Segment> children = new LinkedList<Segment>();
048 private final Path path;
049 private CachePolicy cachePolicy;
050 private DateTime timeLoaded;
051
052 /**
053 * @param path the path to the node; may not be null
054 */
055 public BasicGetChildrenCommand( Path path ) {
056 super();
057 assert path != null;
058 this.path = path;
059 }
060
061 /**
062 * {@inheritDoc}
063 */
064 public void setNoChildren() {
065 this.children.clear();
066 }
067
068 /**
069 * {@inheritDoc}
070 *
071 * @see org.jboss.dna.graph.commands.GetChildrenCommand#addChild(org.jboss.dna.graph.properties.Path.Segment,
072 * org.jboss.dna.graph.properties.Property[])
073 */
074 public void addChild( Segment nameOfChild,
075 Property... identityProperties ) {
076 if (nameOfChild == null) return;
077 this.children.add(nameOfChild);
078 if (identityProperties != null) {
079 if (identityProperties.length == 0) identityProperties = null;
080 this.childProperties.put(nameOfChild, identityProperties);
081 }
082 }
083
084 /**
085 * Get the identity properties for the supplied child.
086 *
087 * @param child the name of the child
088 * @return the array of identity properties for the child, or null if there are none
089 */
090 public Property[] getChildIdentityProperties( Segment child ) {
091 return this.childProperties.get(child);
092 }
093
094 /**
095 * @return children
096 */
097 public List<Segment> getChildren() {
098 return this.children;
099 }
100
101 /**
102 * {@inheritDoc}
103 */
104 public Path getPath() {
105 return path;
106 }
107
108 /**
109 * {@inheritDoc}
110 */
111 public CachePolicy getCachePolicy() {
112 return cachePolicy;
113 }
114
115 /**
116 * {@inheritDoc}
117 */
118 public DateTime getTimeLoaded() {
119 return timeLoaded;
120 }
121
122 /**
123 * @param timeLoaded Sets timeLoaded to the specified value.
124 */
125 public void setTimeLoaded( DateTime timeLoaded ) {
126 this.timeLoaded = timeLoaded;
127 }
128
129 /**
130 * {@inheritDoc}
131 */
132 public void setCachePolicy( CachePolicy cachePolicy ) {
133 this.cachePolicy = cachePolicy;
134 }
135
136 /**
137 * {@inheritDoc}
138 *
139 * @see java.lang.Object#toString()
140 */
141 @Override
142 public String toString() {
143 StringBuilder sb = new StringBuilder();
144 sb.append(this.getClass().getSimpleName());
145 sb.append(" at ");
146 sb.append(this.getPath());
147 List<Path.Segment> children = this.getChildren();
148 if (children != null && children.size() > 0) {
149 sb.append(" with ").append(children.size()).append(" children: ");
150 sb.append(StringUtil.readableString(children));
151 }
152 return sb.toString();
153 }
154 }