replaced <code></code> with more concise {@code}
[idea/community.git] / plugins / svn4idea / src / org / jetbrains / idea / svn / status / PortableStatus.java
1 /*
2  * Copyright 2000-2012 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.jetbrains.idea.svn.status;
17
18 import com.intellij.openapi.util.Getter;
19 import org.jetbrains.annotations.NotNull;
20 import org.jetbrains.annotations.Nullable;
21 import org.jetbrains.idea.svn.api.NodeKind;
22 import org.jetbrains.idea.svn.conflict.TreeConflictDescription;
23 import org.jetbrains.idea.svn.info.Info;
24 import org.jetbrains.idea.svn.lock.Lock;
25 import org.tmatesoft.svn.core.SVNURL;
26 import org.tmatesoft.svn.core.wc.SVNRevision;
27
28 import java.io.File;
29 import java.util.Date;
30 import java.util.Map;
31
32 /**
33  * TODO: Merge PortableStatus and Status to single class.
34  *
35  * Created by IntelliJ IDEA.
36  * User: Irina.Chernushina
37  * Date: 1/24/12
38  * Time: 12:29 PM
39  */
40 public class PortableStatus extends Status {
41
42   private boolean myConflicted;
43   private Getter<Info> myInfoGetter;
44   private Info myInfo;
45   private String myPath;
46   private boolean myFileExists;
47
48   /**
49    * Constructs an <b>SVNStatus</b> object filling it with status information
50    * details.
51    * <p/>
52    * <p/>
53    * Used by SVNKit internals to construct and initialize an <b>SVNStatus</b>
54    * object. It's not intended for users (from an API point of view).
55    *
56    * @param url                    item's repository location
57    * @param file                   item's path in a File representation
58    * @param kind                   item's node kind
59    * @param revision               item's working revision
60    * @param committedRevision      item's last changed revision
61    * @param committedDate          item's last changed date
62    * @param author                 item's last commit author
63    * @param contentsStatus         local status of item's contents
64    * @param propertiesStatus       local status of item's properties
65    * @param remoteContentsStatus   status of item's contents against a repository
66    * @param remotePropertiesStatus status of item's properties against a repository
67    * @param isLocked               if the item is locked by the driver (not a user lock)
68    * @param isCopied               if the item is added with history
69    * @param isSwitched             if the item is switched to a different URL
70    * @param isFileExternal         tells if the item is an external file
71    * @param conflictNewFile        temp file with latest changes from the repository
72    * @param conflictOldFile        temp file just as the conflicting one was at the BASE revision
73    * @param conflictWrkFile        temp file with all user's current local modifications
74    * @param projRejectFile         temp file describing properties conflicts
75    * @param copyFromURL            url of the item's ancestor from which the item was copied
76    * @param copyFromRevision       item's ancestor revision from which the item was copied
77    * @param remoteLock             item's lock in the repository
78    * @param localLock              item's local lock
79    * @param entryProperties        item's SVN specific '&lt;entry' properties
80    * @param changelistName         changelist name which the item belongs to
81    * @param wcFormatVersion        working copy format number
82    * @param treeConflict           tree conflict description
83    * @since 1.3
84    */
85   public PortableStatus(SVNURL url,
86                         File file,
87                         @NotNull NodeKind kind,
88                         SVNRevision revision,
89                         SVNRevision committedRevision,
90                         Date committedDate,
91                         String author,
92                         StatusType contentsStatus,
93                         StatusType propertiesStatus,
94                         StatusType remoteContentsStatus,
95                         StatusType remotePropertiesStatus,
96                         boolean isLocked,
97                         boolean isCopied,
98                         boolean isSwitched,
99                         boolean isFileExternal,
100                         @Nullable Lock remoteLock,
101                         @Nullable Lock localLock,
102                         Map entryProperties,
103                         String changelistName,
104                         int wcFormatVersion,
105                         boolean isConflicted,
106                         Getter<Info> infoGetter) {
107     super(url, file, kind, revision, committedRevision, contentsStatus, propertiesStatus, remoteContentsStatus,
108           remotePropertiesStatus, isLocked, isCopied, isSwitched, null, remoteLock,
109           localLock, changelistName, null);
110     myConflicted = isConflicted;
111     myInfoGetter = infoGetter == null ? () -> null : infoGetter;
112   }
113
114   public PortableStatus() {
115     myInfoGetter = () -> null;
116     setCommittedRevision(SVNRevision.UNDEFINED);
117   }
118
119   @Override
120   public void setIsConflicted(boolean isConflicted) {
121     myConflicted = isConflicted;
122     super.setIsConflicted(isConflicted);
123   }
124
125   public void setInfoGetter(Getter<Info> infoGetter) {
126     myInfoGetter = infoGetter;
127   }
128
129   @Override
130   public boolean isConflicted() {
131     return myConflicted;
132   }
133
134   private Info initInfo() {
135     if (myInfo == null) {
136       final StatusType contentsStatus = getContentsStatus();
137       if (contentsStatus == null || StatusType.UNKNOWN.equals(contentsStatus)) {
138         return null;
139       }
140       myInfo = myInfoGetter.get();
141     }
142     return myInfo;
143   }
144
145   public Info getInfo() {
146     return initInfo();
147   }
148
149   @Override
150   @NotNull
151   public NodeKind getKind() {
152     if (myFileExists) return super.getKind();
153     final Info info = initInfo();
154     if (info != null) {
155       return info.getKind();
156     }
157     return super.getKind();
158   }
159
160   /**
161    * Gets the URL (repository location) of the ancestor from which the item
162    * was copied. That is when the item is added with history.
163    *
164    * @return the item ancestor's URL
165    */
166   @Override
167   public String getCopyFromURL() {
168     if (! isCopied()) return null;
169     final Info info = initInfo();
170     if (info == null) return null;
171     SVNURL url = initInfo().getCopyFromURL();
172     return url == null ? null : url.toString();
173   }
174
175   @Override
176   public SVNURL getURL() {
177     SVNURL url = super.getURL();
178
179     if (url == null) {
180       Info info = initInfo();
181       url = info != null ? info.getURL() : url;
182     }
183
184     return url;
185   }
186
187   @Override
188   public SVNURL getRepositoryRootURL() {
189     SVNURL url = super.getRepositoryRootURL();
190
191     if (url == null) {
192       Info info = initInfo();
193       url = info != null ? info.getRepositoryRootURL() : url;
194     }
195
196     return url;
197   }
198
199   @Override
200   public File getFile() {
201     File file = super.getFile();
202
203     if (file == null) {
204       Info info = initInfo();
205       file = info != null ? info.getFile() : file;
206     }
207
208     return file;
209   }
210
211   @NotNull
212   @Override
213   public SVNRevision getRevision() {
214     final SVNRevision revision = super.getRevision();
215     if (revision.isValid()) return revision;
216
217     final StatusType status = getContentsStatus();
218     if (StatusType.STATUS_NONE.equals(status) || StatusType.STATUS_UNVERSIONED.equals(status) ||
219         StatusType.STATUS_ADDED.equals(status)) return revision;
220
221     final Info info = initInfo();
222     return info == null ? revision : info.getRevision();
223   }
224
225   /**
226    * Returns a tree conflict description.
227    *
228    * @return tree conflict description; {@code null} if no conflict
229    *         description exists on this item
230    * @since 1.3
231    */
232   @Override
233   @Nullable
234   public TreeConflictDescription getTreeConflict() {
235     if (! isConflicted()) return null;
236     final Info info = initInfo();
237     return info == null ? null : info.getTreeConflict();
238   }
239
240   public void setPath(String path) {
241     myPath = path;
242   }
243
244   public String getPath() {
245     return myPath;
246   }
247
248   public void setKind(boolean exists, @NotNull NodeKind kind) {
249     myFileExists = exists;
250     setKind(kind);
251   }
252 }