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.graph.request;
025
026 import org.jboss.dna.common.util.CheckArg;
027 import org.jboss.dna.graph.Location;
028 import org.jboss.dna.graph.request.CreateWorkspaceRequest.CreateConflictBehavior;
029
030 /**
031 * Request that an existing workspace be cloned into a target workspace with the supplied name. If the target workspace exists,
032 * the {@link #targetConflictBehavior() target conflict behavior} defines the behavior to be followed. If the workspace being
033 * cloned does not exist, the {@link #cloneConflictBehavior() clone conflict behavior} defines the behavior to be followed.
034 */
035 public final class CloneWorkspaceRequest extends Request {
036
037 private static final long serialVersionUID = 1L;
038
039 /**
040 * The options for the behavior when a request specifies the name of the workspace to clone, but the cloned workspace does not
041 * exist.
042 */
043 public enum CloneConflictBehavior {
044 /** Do not perform the clone, and record as an {@link Request#setError(Throwable) error} on the request. */
045 DO_NOT_CLONE,
046
047 /** The clone operation is skipped quietly, resulting in an empty new workspace. */
048 SKIP_CLONE,
049 }
050
051 /**
052 * The default {@link CloneConflictBehavior} that will be used if it is unspecified.
053 */
054 public static final CloneConflictBehavior DEFAULT_CLONE_CONFLICT_BEHAVIOR = CloneConflictBehavior.DO_NOT_CLONE;
055
056 /**
057 * The default {@link CreateConflictBehavior} that will be used if it is unspecified.
058 */
059 public static final CreateConflictBehavior DEFAULT_CREATE_CONFLICT_BEHAVIOR = CreateConflictBehavior.DO_NOT_CREATE;
060
061 private final String nameOfWorkspaceToBeCloned;
062 private final String desiredNameOfTargetWorkspace;
063 private final CreateConflictBehavior createConflictBehavior;
064 private final CloneConflictBehavior cloneConflictBehavior;
065 private String actualWorkspaceName;
066 private Location actualLocationOfRoot;
067
068 /**
069 * Create a request to clone an existing workspace to create a new workspace, and specify the behavior should a workspace
070 * already exists with a name that matches the desired name for the new workspace.
071 *
072 * @param nameOfWorkspaceToBeCloned the name of the existing workspace that is to be cloned
073 * @param desiredNameOfTargetWorkspace the desired name of the target workspace
074 * @param createConflictBehavior the behavior if a workspace already exists with the same name
075 * @param cloneConflictBehavior the behavior if the workspace to be cloned does not exist
076 * @throws IllegalArgumentException if the either workspace name is null
077 */
078 public CloneWorkspaceRequest( String nameOfWorkspaceToBeCloned,
079 String desiredNameOfTargetWorkspace,
080 CreateConflictBehavior createConflictBehavior,
081 CloneConflictBehavior cloneConflictBehavior ) {
082 CheckArg.isNotNull(nameOfWorkspaceToBeCloned, "nameOfWorkspaceToBeCloned");
083 CheckArg.isNotNull(desiredNameOfTargetWorkspace, "desiredNameOfTargetWorkspace");
084 this.nameOfWorkspaceToBeCloned = nameOfWorkspaceToBeCloned;
085 this.desiredNameOfTargetWorkspace = desiredNameOfTargetWorkspace;
086 this.createConflictBehavior = createConflictBehavior != null ? createConflictBehavior : DEFAULT_CREATE_CONFLICT_BEHAVIOR;
087 this.cloneConflictBehavior = cloneConflictBehavior != null ? cloneConflictBehavior : DEFAULT_CLONE_CONFLICT_BEHAVIOR;
088 }
089
090 /**
091 * Get the name of the existing workspace that is to be cloned into the new workspace.
092 *
093 * @return the name of the existing workspace that is to be cloned; never null
094 */
095 public String nameOfWorkspaceToBeCloned() {
096 return nameOfWorkspaceToBeCloned;
097 }
098
099 /**
100 * Get the desired name for the target workspace.
101 *
102 * @return the desired name for the new workspace; never null
103 */
104 public String desiredNameOfTargetWorkspace() {
105 return desiredNameOfTargetWorkspace;
106 }
107
108 /**
109 * Get the desired behavior if a workspace already exists with the {@link #desiredNameOfTargetWorkspace() desired workspace
110 * name} .
111 *
112 * @return the desired behavior; never null
113 */
114 public CreateConflictBehavior targetConflictBehavior() {
115 return createConflictBehavior;
116 }
117
118 /**
119 * Get the desired behavior if the {@link #nameOfWorkspaceToBeCloned() cloned workspace} does not exist.
120 *
121 * @return the desired behavior; never null
122 */
123 public CloneConflictBehavior cloneConflictBehavior() {
124 return cloneConflictBehavior;
125 }
126
127 /**
128 * Get the actual name of the workspace that was created. This will be the same as the {@link #desiredNameOfTargetWorkspace()
129 * desired target name} unless there was a conflict and the {@link #targetConflictBehavior() desired behavior} was to
130 * {@link CreateConflictBehavior#CREATE_WITH_ADJUSTED_NAME alter the name}.
131 *
132 * @return the actual name of the workspace that was created, or null if a workspace was not created (yet)
133 */
134 public String getActualWorkspaceName() {
135 return actualWorkspaceName;
136 }
137
138 /**
139 * Set the actual name of the workspace that was created. This should be the same as the
140 * {@link #desiredNameOfTargetWorkspace() desired target name} unless there was a conflict and the
141 * {@link #targetConflictBehavior() desired behavior} was to {@link CreateConflictBehavior#CREATE_WITH_ADJUSTED_NAME alter the
142 * name}.
143 *
144 * @param actualWorkspaceName the actual name of the workspace that was created, or null if a workspace was not created
145 */
146 public void setActualWorkspaceName( String actualWorkspaceName ) {
147 this.actualWorkspaceName = actualWorkspaceName;
148 }
149
150 /**
151 * Get the actual location of the root node in the new workspace, or null if the workspace was not (yet) created.
152 *
153 * @return the actual location of the root node in the new workspace, or null if the workspace was not (yet) created
154 */
155 public Location getActualLocationOfRoot() {
156 return actualLocationOfRoot;
157 }
158
159 /**
160 * Set the actual location of the root node in the new workspace.
161 *
162 * @param actualLocationOfRoot the actual location of the workspace's root node.
163 */
164 public void setActualRootLocation( Location actualLocationOfRoot ) {
165 this.actualLocationOfRoot = actualLocationOfRoot;
166 }
167
168 /**
169 * {@inheritDoc}
170 *
171 * @see org.jboss.dna.graph.request.Request#isReadOnly()
172 */
173 @Override
174 public boolean isReadOnly() {
175 return false;
176 }
177
178 /**
179 * {@inheritDoc}
180 *
181 * @see java.lang.Object#hashCode()
182 */
183 @Override
184 public int hashCode() {
185 return desiredNameOfTargetWorkspace.hashCode();
186 }
187
188 /**
189 * {@inheritDoc}
190 *
191 * @see java.lang.Object#equals(java.lang.Object)
192 */
193 @Override
194 public boolean equals( Object obj ) {
195 if (obj == this) return true;
196 if (this.getClass().isInstance(obj)) {
197 CloneWorkspaceRequest that = (CloneWorkspaceRequest)obj;
198 if (!this.nameOfWorkspaceToBeCloned.equals(that.nameOfWorkspaceToBeCloned())) return false;
199 if (!this.desiredNameOfTargetWorkspace.equals(that.desiredNameOfTargetWorkspace())) return false;
200 return true;
201 }
202 return false;
203 }
204
205 /**
206 * {@inheritDoc}
207 *
208 * @see java.lang.Object#toString()
209 */
210 @Override
211 public String toString() {
212 return "clone workspace \"" + nameOfWorkspaceToBeCloned() + "\" as workspace \"" + desiredNameOfTargetWorkspace() + "\"";
213 }
214 }