001package org.apache.maven.scm.provider.jazz.repository;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 * http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import org.apache.maven.scm.provider.ScmProviderRepositoryWithHost;
023import org.codehaus.plexus.util.StringUtils;
024
025/**
026 * @author <a href="mailto:ChrisGWarp@gmail.com">Chris Graham</a>
027 */
028public class JazzScmProviderRepository
029    extends ScmProviderRepositoryWithHost
030{
031    /**
032     * The URI of the repository server.
033     * Of the form <protocol>://<server>:<port>/<path>
034     * For example:
035     * https://rtc:9444/jazz
036     */
037    private String fRepositoryURI;
038
039    /**
040     * The name of the remote repository workspace (as set from the URL).
041     */
042    private String fRepositoryWorkspace;
043
044    // Fields that are *only* set when parsing the output of the "scm status" command.
045    // So, in essence, they are the 'real' values, as returned from the system.
046    // What is in the URL, via the pom, may not be correct.
047    // If the "scm status" command has not been called, then these values will be zero/null.
048
049    /**
050     * The alias of the repository workspace, as returned from the "scm status" command.
051     */
052    private int fWorkspaceAlias;
053
054    /**
055     * The name of the repository workspace, as returned from the "scm status" command.
056     */
057    private String fWorkspace;
058
059    // Note: If there are no flow targets defined, then the repository workspace points to itself,
060    //       so fWorkspaceAlias = fStreamAlias and fWorkspace = fStream
061
062    // TODO: Change to enable multiple flow targets, via a List (?).
063
064    // NOTE: We are not parsing the Component Alias nor the Baseline Alias, as they are not currently needed.
065
066    /**
067     * The alias of the flow target, as returned from the "scm status" command.
068     */
069    private int fFlowTargetAlias;
070
071    /**
072     * The name of the flow target, as returned from the "scm status" command.
073     */
074    private String fFlowTarget;     // Can also be a repository workspace, possibly the same as fWorkspace
075
076    /**
077     * The name of the component, as returned from the "scm status" command.
078     */
079    private String fComponent;
080
081    /**
082     * The name of the baseline, as returned from the "scm status" command.
083     */
084    private String fBaseline;
085
086    // TODO In the future we might expand the details of this repository.
087    // For example we might extend the scm url to include a stream (as well as the repository workspace)
088    // This stream could represent the desired flow target of the repository workspace.
089    // We would also need to cater for multiple streams/flow targets.
090    public JazzScmProviderRepository( String repositoryURI, String userName, String password, String hostName, int port,
091                                      String repositoryWorkspace )
092    {
093        this.fRepositoryURI = repositoryURI;
094        setUser( userName );
095        setPassword( password );
096        setHost( hostName );
097        setPort( port );
098        this.fRepositoryWorkspace = repositoryWorkspace;
099    }
100
101    /**
102     * Return <code>true</code> if we have a valid flow target and pushChanges is <code>true</code>.
103     */
104    public boolean isPushChangesAndHaveFlowTargets()
105    {
106        if ( !isPushChanges() )
107        {
108            return isPushChanges();
109        }
110
111        return isHaveFlowTargets();
112    }
113
114    /**
115     * Return <code>true</code> if we have a valid flow target.
116     * A valid flow target is a destination other than ourselves.
117     * To determine this, we need to parse the output of the 'scm status' command.
118     */
119    public boolean isHaveFlowTargets()
120    {
121        if ( !StringUtils.isEmpty( getWorkspace() ) &&                          // We have a workspace
122            !StringUtils.isEmpty( getFlowTarget() ) &&                          // and a flow target
123            !getWorkspace().equals( getFlowTarget() ) &&                        // and they are not the same
124            getWorkspaceAlias() != getFlowTargetAlias() )                       // nor are their aliases.
125        {
126            // The workspace and stream are not null, not empty and not equal to each other.
127            return true;
128        }
129        else
130        {
131            // We're the same, so no flow targets.
132            return false;
133        }
134    }
135
136    /**
137     * Return the URI of the repository server, as parsed from the URL.
138     *
139     * @return The URI of the repository server, as parsed from the URL.
140     */
141    public String getRepositoryURI()
142    {
143        return fRepositoryURI;
144    }
145
146    /**
147     * Return the name of the remote repository workspace, as parsed from the URL.
148     *
149     * @return The name of the remote repository workspace, as parsed from the URL.
150     */
151    public String getRepositoryWorkspace()
152    {
153        return fRepositoryWorkspace;
154    }
155
156    // NOTE: The following getter/setters are only used when the "scm status" command
157    //       has been called. Those commands that need it, need to call the status()
158    //       command first. Otherwise these values will be zero or null.
159
160    /**
161     * @return The alias of the repository workspace, as returned from the "scm status" command.
162     */
163    public int getWorkspaceAlias()
164    {
165        return fWorkspaceAlias;
166    }
167
168    /**
169     * @param workspaceAlias the workspaceAlias to set
170     */
171    public void setWorkspaceAlias( int workspaceAlias )
172    {
173        this.fWorkspaceAlias = workspaceAlias;
174    }
175
176    /**
177     * @return The name of the repository workspace, as returned from the "scm status" command.
178     */
179    public String getWorkspace()
180    {
181        return fWorkspace;
182    }
183
184    /**
185     * @param fWorkspace The fWorkspace to set.
186     */
187    public void setWorkspace( String fWorkspace )
188    {
189        this.fWorkspace = fWorkspace;
190    }
191
192    /**
193     * @return The alias of the flow target, as returned from the "scm status" command.
194     */
195    public int getFlowTargetAlias()
196    {
197        return fFlowTargetAlias;
198    }
199
200    /**
201     * @param streamAlias the streamAlias to set
202     */
203    public void setFlowTargetAlias( int flowTargetAlias )
204    {
205        this.fFlowTargetAlias = flowTargetAlias;
206    }
207
208    /**
209     * @return The name of the flow target, as returned from the "scm status" command.
210     */
211    public String getFlowTarget()
212    {
213        return fFlowTarget;
214    }
215
216    /**
217     * @param flowTarget The flowTarget to set.
218     */
219    public void setFlowTarget( String flowTarget )
220    {
221        this.fFlowTarget = flowTarget;
222    }
223
224    /**
225     * @return The name of the component, as returned from the "scm status" command.
226     */
227    public String getComponent()
228    {
229        return fComponent;
230    }
231
232    /**
233     * @param component The component to set.
234     */
235    public void setComponent( String component )
236    {
237        this.fComponent = component;
238    }
239
240    /**
241     * @return The name of the baseline, as returned from the "scm status" command.
242     */
243    public String getBaseline()
244    {
245        return fBaseline;
246    }
247
248    /**
249     * @param baseline The baseline to set.
250     */
251    public void setBaseline( String baseline )
252    {
253        this.fBaseline = baseline;
254    }
255
256    /**
257     * {@inheritDoc}
258     */
259    public String toString()
260    {
261        return getRepositoryURI() + ":" + getRepositoryWorkspace();
262    }
263}