1 /*
2 * ModeShape (http://www.modeshape.org)
3 * See the COPYRIGHT.txt file distributed with this work for information
4 * regarding copyright ownership. Some portions may be licensed
5 * to Red Hat, Inc. under one or more contributor license agreements.
6 * See the AUTHORS.txt file in the distribution for a full listing of
7 * individual contributors.
8 *
9 * ModeShape is free software. Unless otherwise indicated, all code in ModeShape
10 * is licensed to you under the terms of the GNU Lesser General Public License as
11 * published by the Free Software Foundation; either version 2.1 of
12 * the License, or (at your option) any later version.
13 *
14 * ModeShape is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this software; if not, write to the Free
21 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
22 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
23 */
24 package org.modeshape.graph.connector.path;
25
26 import java.util.Map;
27 import org.modeshape.graph.ExecutionContext;
28 import org.modeshape.graph.NodeConflictBehavior;
29 import org.modeshape.graph.property.Name;
30 import org.modeshape.graph.property.Path;
31 import org.modeshape.graph.property.Property;
32 import org.modeshape.graph.property.Path.Segment;
33
34 /**
35 * Extension of {@link PathWorkspace} for repositories that support modification of nodes as well as access to the nodes.
36 */
37 public interface WritablePathWorkspace extends PathWorkspace {
38
39 /**
40 * Create a node at the supplied path. The parent of the new node must already exist.
41 *
42 * @param context the environment; may not be null
43 * @param pathToNewNode the path to the new node; may not be null
44 * @param properties the properties for the new node
45 * @param conflictBehavior the expected behavior if an equivalently-named child already exists at the location
46 * @return the new node (or root if the path specified the root)
47 */
48 PathNode createNode( ExecutionContext context,
49 String pathToNewNode,
50 Map<Name, Property> properties,
51 NodeConflictBehavior conflictBehavior );
52
53 /**
54 * Create a new node with the supplied name, as a child of the supplied parent.
55 *
56 * @param context the execution context
57 * @param parentNode the parent node; may not be null
58 * @param name the name; may not be null
59 * @param properties the properties for the new node
60 * @param conflictBehavior the expected behavior if an equivalently-named child already exists at the location
61 * @return the new node
62 */
63 PathNode createNode( ExecutionContext context,
64 PathNode parentNode,
65 Name name,
66 Map<Name, Property> properties,
67 NodeConflictBehavior conflictBehavior );
68
69 /**
70 * Move the supplied node to the new parent within this workspace. This method automatically removes the node from its
71 * existing parent, and also correctly adjusts the {@link Segment#getIndex() index} to be correct in the new parent.
72 *
73 * @param context
74 * @param node the node to be moved; may not be the workspace root node
75 * @param desiredNewName the new name for the node, if it is to be changed; may be null
76 * @param originalWorkspace the workspace containing the node to be moved
77 * @param newParent the new parent; may not be the workspace root node
78 * @param beforeNode the node before which this new node should be placed
79 * @return a new copy of {@code node} that reflects the new location
80 */
81 public PathNode moveNode( ExecutionContext context,
82 PathNode node,
83 Name desiredNewName,
84 WritablePathWorkspace originalWorkspace,
85 PathNode newParent,
86 PathNode beforeNode );
87
88 /**
89 * Copy the subgraph given by the original node and place the new copy under the supplied new parent. Note that internal
90 * references between nodes within the original subgraph must be reflected as internal nodes within the new subgraph.
91 *
92 * @param context the context; may not be null
93 * @param original the node to be copied; may not be null
94 * @param originalWorkspace the workspace containing the original parent node; may not be null
95 * @param newParent the parent where the copy is to be placed; may not be null
96 * @param desiredName the desired name for the node; if null, the name will be obtained from the original node
97 * @param recursive true if the copy should be recursive
98 * @return the new node, which is the top of the new subgraph
99 */
100 PathNode copyNode( ExecutionContext context,
101 PathNode original,
102 PathWorkspace originalWorkspace,
103 PathNode newParent,
104 Name desiredName,
105 boolean recursive );
106
107 /**
108 * Inserts the specified child at the specified position in the list of children. Shifts the child currently at that position
109 * (if any) and any subsequent children to the right (adds one to their indices).
110 *
111 * @param index index at which the specified child is to be inserted
112 * @param child the child to be inserted
113 */
114 // public void addChild( int index,
115 // PathNode child );
116 /**
117 * Removes the node at the given path
118 *
119 * @param context the context; may not be null
120 * @param nodePath the path of the node to be removed
121 * @return true if the node existed (and was removed); false otherwise
122 */
123 public boolean removeNode( ExecutionContext context,
124 Path nodePath );
125
126 /**
127 * Sets the given properties in a single operation, overwriting any previous properties for the same name. This bulk mutator
128 * should be used when multiple properties are being set in order to allow underlying implementations to optimize their access
129 * to their respective persistent storage mechanism.
130 *
131 * @param context the context; may not be null
132 * @param nodePath the path to the node on which the properties should be set
133 * @param properties the properties to set
134 * @return this map node
135 */
136 public PathNode setProperties( ExecutionContext context,
137 Path nodePath,
138 Map<Name, Property> properties );
139
140 /**
141 * Removes the properties with the given names
142 *
143 * @param context the context; may not be null
144 * @param nodePath the path to the node from which the properties should be removed
145 * @param propertyNames the name of the properties to remove
146 * @return this map node
147 */
148 public PathNode removeProperties( ExecutionContext context,
149 Path nodePath,
150 Iterable<Name> propertyNames );
151
152 }