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.properties;
023    
024    import org.jboss.dna.common.text.TextDecoder;
025    
026    /**
027     * A factory for creating {@link Path paths}. This interface extends the {@link ValueFactory} generic interface and adds specific
028     * methods for creating paths (and relative paths) from a series of names, segments, or combinations.
029     * 
030     * @author Randall Hauch
031     * @author John Verhaeg
032     */
033    public interface PathFactory extends ValueFactory<Path> {
034    
035        /**
036         * Create an absolute root path. Subsequent calls will always return the same instance.
037         * 
038         * @return the new path
039         */
040        Path createRootPath();
041    
042        /**
043         * Create an absolute path with the supplied segment names, in order. If no segments are provided, the result will be the root
044         * path.
045         * 
046         * @param segmentNames the names of the segments
047         * @return the new path
048         * @throws IllegalArgumentException if at least one segment name is provided and if any of the supplied segment names are null
049         */
050        Path createAbsolutePath( Name... segmentNames );
051    
052        /**
053         * Create an absolute path with the supplied segments, in order. If no segments are provided, the result will be the root
054         * path.
055         * 
056         * @param segments the segments
057         * @return the new path
058         * @throws IllegalArgumentException if at least one segment is provided and if any of the supplied segments are null
059         */
060        Path createAbsolutePath( Path.Segment... segments );
061    
062        /**
063         * Create an absolute path with the supplied segments, in order. If no segments are provided, the result will be the root
064         * path.
065         * 
066         * @param segments the segments
067         * @return the new path
068         * @throws IllegalArgumentException if at least one segment is provided and if any of the supplied segments are null
069         */
070        Path createAbsolutePath( Iterable<Path.Segment> segments );
071    
072        /**
073         * Create an empty relative path (i.e., equivalent to {@link #createRelativePath(Path.Segment...) createRelativePath}(
074         * {@link Path#SELF_SEGMENT})). Subsequent calls will always return the same instance.
075         * 
076         * @return the new path
077         */
078        Path createRelativePath();
079    
080        /**
081         * Create a relative path with the supplied segment names, in order. If no segments are provided, the result will be the root
082         * path.
083         * 
084         * @param segmentNames the names of the segments
085         * @return the new path
086         * @throws IllegalArgumentException if at least one segment name is provided and if any of the supplied segment names are null
087         */
088        Path createRelativePath( Name... segmentNames );
089    
090        /**
091         * Create a relative path with the supplied segments, in order. If no segments are provided, the result will be the root path.
092         * 
093         * @param segments the segments
094         * @return the new path
095         * @throws IllegalArgumentException if at least one segment is provided and if any of the supplied segments are null
096         */
097        Path createRelativePath( Path.Segment... segments );
098    
099        /**
100         * Create a relative path with the supplied segments, in order. If no segments are provided, the result will be the root path.
101         * 
102         * @param segments the segments
103         * @return the new path
104         * @throws IllegalArgumentException if at least one segment is provided and if any of the supplied segments are null
105         */
106        Path createRelativePath( Iterable<Path.Segment> segments );
107    
108        /**
109         * Create a path by appending the supplied relative path to the supplied parent path. The resulting path will be
110         * {@link Path#isAbsolute() absolute} if the supplied parent path is absolute.
111         * 
112         * @param parentPath the path that is to provide the basis for the new path
113         * @param childPath the path that should be appended to the parent path
114         * @return the new path
115         * @throws IllegalArgumentException if the parent path reference or the child path reference is null
116         */
117        Path create( Path parentPath,
118                     Path childPath );
119    
120        /**
121         * Create a path by appending the supplied names to the parent path.
122         * 
123         * @param parentPath the path that is to provide the basis for the new path
124         * @param segmentName the name of the segment to be appended to the parent path
125         * @param index the index for the new segment
126         * @return the new path
127         * @throws IllegalArgumentException if the parent path reference or the segment name is null, or if the index is invalid
128         */
129        Path create( Path parentPath,
130                     Name segmentName,
131                     int index );
132    
133        /**
134         * Create a path by appending the supplied names to the parent path. If no names are appended, the parent path is returned.
135         * 
136         * @param parentPath the path that is to provide the basis for the new path
137         * @param segmentNames the names of the segments that are to be appended, in order, to the parent path
138         * @return the new path
139         * @throws IllegalArgumentException if the parent path reference is null, or if at least one segment name is provided and if
140         *         any of the supplied segment names are null
141         */
142        Path create( Path parentPath,
143                     Name... segmentNames );
144    
145        /**
146         * Create a path by appending the supplied names to the parent path. If no names are appended, the parent path is returned.
147         * 
148         * @param parentPath the path that is to provide the basis for the new path
149         * @param segments the segments that are to be appended, in order, to the parent path
150         * @return the new path
151         * @throws IllegalArgumentException if the parent path reference is null, or if at least one segment name is provided and if
152         *         any of the supplied segment names are null
153         */
154        Path create( Path parentPath,
155                     Path.Segment... segments );
156    
157        /**
158         * Create a path by appending the supplied names to the parent path. If no names are appended, the parent path is returned.
159         * 
160         * @param parentPath the path that is to provide the basis for the new path
161         * @param segments the segments that are to be appended, in order, to the parent path
162         * @return the new path
163         * @throws IllegalArgumentException if the parent path reference is null, or if at least one segment name is provided and if
164         *         any of the supplied segment names are null
165         */
166        Path create( Path parentPath,
167                     Iterable<Path.Segment> segments );
168    
169        /**
170         * Create a path by appending the supplied names to the parent path.
171         * 
172         * @param parentPath the path that is to provide the basis for the new path
173         * @param subpath the subpath to be appended to the parent path, which must be in the form of a relative path
174         * @return the new path
175         * @throws IllegalArgumentException if the parent path reference or the segment name is null, or if the index is invalid
176         */
177        Path create( Path parentPath,
178                     String subpath );
179    
180        /**
181         * Create a path segment given the supplied segment name. The resulting segment will have no index.
182         * 
183         * @param segmentName the name of the segment
184         * @return the segment
185         * @throws IllegalArgumentException if the segment name reference is <code>null</code> or the value could not be created from
186         *         the supplied string
187         */
188        Path.Segment createSegment( String segmentName );
189    
190        /**
191         * Create a path segment given the supplied segment name. The resulting segment will have no index.
192         * 
193         * @param segmentName the name of the segment
194         * @param decoder the decoder that should be used to decode the qualified name
195         * @return the segment
196         * @throws IllegalArgumentException if the segment name reference is <code>null</code> or the value could not be created from
197         *         the supplied string
198         */
199        Path.Segment createSegment( String segmentName,
200                                    TextDecoder decoder );
201    
202        /**
203         * Create a path segment given the supplied segment name and index.
204         * 
205         * @param segmentName the name of the new segment
206         * @param index the index of the new segment
207         * @return the segment
208         * @throws IllegalArgumentException if the segment name reference is <code>null</code> or if the index is invalid
209         */
210        Path.Segment createSegment( String segmentName,
211                                    int index );
212    
213        /**
214         * Create a path segment given the supplied segment name. The resulting segment will have no index.
215         * 
216         * @param segmentName the name of the segment
217         * @return the segment
218         * @throws IllegalArgumentException if the segment name reference is null
219         */
220        Path.Segment createSegment( Name segmentName );
221    
222        /**
223         * Create a path segment given the supplied segment name and index.
224         * 
225         * @param segmentName the name of the new segment
226         * @param index the index of the new segment
227         * @return the segment
228         * @throws IllegalArgumentException if the segment name reference is null or if the index is invalid
229         */
230        Path.Segment createSegment( Name segmentName,
231                                    int index );
232    
233    }