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.Collection; 025 import java.util.LinkedList; 026 import net.jcip.annotations.NotThreadSafe; 027 import org.jboss.dna.common.util.StringUtil; 028 import org.jboss.dna.graph.commands.CreateNodeCommand; 029 import org.jboss.dna.graph.commands.NodeConflictBehavior; 030 import org.jboss.dna.graph.properties.Path; 031 import org.jboss.dna.graph.properties.Property; 032 033 /** 034 * @author Randall Hauch 035 */ 036 @NotThreadSafe 037 public class BasicCreateNodeCommand extends BasicGraphCommand implements CreateNodeCommand { 038 039 /** 040 */ 041 private static final long serialVersionUID = -5452285887178397354L; 042 private final Path path; 043 private final Collection<Property> properties; 044 private final NodeConflictBehavior conflictBehavior; 045 046 /** 047 * @param path the path to the node; may not be null 048 */ 049 public BasicCreateNodeCommand( Path path ) { 050 this(path, new LinkedList<Property>(), NodeConflictBehavior.UPDATE); 051 } 052 053 /** 054 * @param path the path to the node; may not be null 055 * @param properties the properties of the node; may not be null 056 * @param conflictBehavior the desired behavior when a node exists at the <code>path</code>; may not be null 057 */ 058 public BasicCreateNodeCommand( Path path, 059 Collection<Property> properties, 060 NodeConflictBehavior conflictBehavior ) { 061 super(); 062 assert path != null; 063 assert properties != null; 064 assert conflictBehavior != null; 065 this.properties = properties; 066 this.path = path; 067 this.conflictBehavior = conflictBehavior; 068 } 069 070 /** 071 * {@inheritDoc} 072 */ 073 public Path getPath() { 074 return path; 075 } 076 077 /** 078 * {@inheritDoc} 079 */ 080 public Collection<Property> getProperties() { 081 return properties; 082 } 083 084 /** 085 * {@inheritDoc} 086 */ 087 public NodeConflictBehavior getConflictBehavior() { 088 return this.conflictBehavior; 089 } 090 091 public void setProperty( Property property ) { 092 if (!properties.isEmpty()) { 093 for (Property existing : this.properties) { 094 if (existing.getName().equals(property.getName())) { 095 this.properties.remove(existing); 096 break; 097 } 098 } 099 } 100 this.properties.add(property); 101 } 102 103 public void setProperties( Property... properties ) { 104 for (Property property : properties) { 105 setProperty(property); 106 } 107 } 108 109 public void setProperties( Iterable<Property> properties ) { 110 for (Property property : properties) { 111 setProperty(property); 112 } 113 } 114 115 /** 116 * {@inheritDoc} 117 */ 118 public int compareTo( CreateNodeCommand that ) { 119 if (this == that) return 0; 120 return this.getPath().compareTo(that.getPath()); 121 } 122 123 /** 124 * {@inheritDoc} 125 */ 126 @Override 127 public int hashCode() { 128 return path.hashCode(); 129 } 130 131 /** 132 * {@inheritDoc} 133 */ 134 @Override 135 public boolean equals( Object obj ) { 136 if (obj == this) return true; 137 if (obj instanceof CreateNodeCommand) { 138 CreateNodeCommand that = (CreateNodeCommand)obj; 139 return this.path.equals(that.getPath()); 140 } 141 return false; 142 } 143 144 /** 145 * {@inheritDoc} 146 * 147 * @see java.lang.Object#toString() 148 */ 149 @Override 150 public String toString() { 151 StringBuilder sb = new StringBuilder(); 152 sb.append(this.getClass().getSimpleName()); 153 sb.append(" at "); 154 sb.append(this.getPath()); 155 boolean firstProperty = true; 156 for (Property property : this.getProperties()) { 157 if (property.isEmpty()) continue; 158 if (firstProperty) { 159 sb.append(" { "); 160 firstProperty = false; 161 } else { 162 sb.append("; "); 163 } 164 sb.append(property.getName()); 165 sb.append("="); 166 if (property.isSingle()) { 167 sb.append(StringUtil.readableString(property.getValues().next())); 168 } else { 169 sb.append(StringUtil.readableString(property.getValuesAsArray())); 170 } 171 } 172 if (!firstProperty) { 173 sb.append(" }"); 174 } 175 return sb.toString(); 176 } 177 }