001: /*
002: * ====================================================================
003: * Copyright (c) 2004-2008 TMate Software Ltd. All rights reserved.
004: *
005: * This software is licensed as described in the file COPYING, which
006: * you should have received as part of this distribution. The terms
007: * are also available at http://svnkit.com/license.html
008: * If newer versions of this license are posted there, you may use a
009: * newer version instead, at your option.
010: * ====================================================================
011: */
012: package org.tmatesoft.svn.core.internal.wc.admin;
013:
014: import java.io.File;
015: import java.util.ArrayList;
016: import java.util.Collection;
017: import java.util.Collections;
018: import java.util.Iterator;
019: import java.util.List;
020: import java.util.Map;
021: import java.util.StringTokenizer;
022: import java.util.TreeMap;
023:
024: import org.tmatesoft.svn.core.SVNException;
025: import org.tmatesoft.svn.core.SVNURL;
026: import org.tmatesoft.svn.core.internal.util.SVNPathUtil;
027: import org.tmatesoft.svn.core.internal.wc.SVNExternalInfo;
028:
029: /**
030: * @version 1.1.1
031: * @author TMate Software Ltd.
032: */
033: public class SVNAdminAreaInfo {
034:
035: private String myTargetName;
036: private SVNAdminArea myTarget;
037: private SVNAdminArea myAnchor;
038: private SVNWCAccess myAccess;
039: private Map myExternals;
040:
041: protected SVNAdminAreaInfo(SVNWCAccess access, SVNAdminArea anchor,
042: SVNAdminArea target, String targetName) {
043: myAccess = access;
044: myAnchor = anchor;
045: myTarget = target;
046: myTargetName = targetName;
047: }
048:
049: public SVNAdminArea getAnchor() {
050: return myAnchor;
051: }
052:
053: public SVNAdminArea getTarget() {
054: return myTarget;
055: }
056:
057: public String getTargetName() {
058: return myTargetName;
059: }
060:
061: public SVNWCAccess getWCAccess() {
062: return myAccess;
063: }
064:
065: public SVNExternalInfo[] addExternals(SVNAdminArea adminArea,
066: String externals) {
067: if (externals == null) {
068: return null;
069: }
070: Collection result = new ArrayList();
071:
072: String relPath = adminArea.getRelativePath(myAnchor);
073: SVNExternalInfo[] parsed = parseExternals(relPath, externals);
074: for (int i = 0; i < parsed.length; i++) {
075: SVNExternalInfo info = addExternal(adminArea, parsed[i]
076: .getPath(), parsed[i].getOldURL(), parsed[i]
077: .getOldRevision());
078: result.add(info);
079: }
080: // get existing externals and update all that are not in result but in
081: // this dir.
082: for (Iterator exts = externals(); exts.hasNext();) {
083: SVNExternalInfo info = (SVNExternalInfo) exts.next();
084: if (!result.contains(info)
085: && relPath.equals(info.getOwnerPath())) {
086: info.setNewExternal(null, -1);
087: }
088: }
089: return (SVNExternalInfo[]) result
090: .toArray(new SVNExternalInfo[result.size()]);
091: }
092:
093: public static SVNExternalInfo[] parseExternals(String rootPath,
094: String externals) {
095: Collection result = new ArrayList();
096: if (externals == null) {
097: return (SVNExternalInfo[]) result
098: .toArray(new SVNExternalInfo[result.size()]);
099: }
100:
101: for (StringTokenizer lines = new StringTokenizer(externals,
102: "\n\r"); lines.hasMoreTokens();) {
103: String line = lines.nextToken().trim();
104: if (line.length() == 0 || line.startsWith("#")) {
105: continue;
106: }
107: String url = null;
108: String path;
109: long rev = -1;
110: List parts = new ArrayList(4);
111: for (StringTokenizer tokens = new StringTokenizer(line,
112: " \t"); tokens.hasMoreTokens();) {
113: String token = tokens.nextToken().trim();
114: parts.add(token);
115: }
116: if (parts.size() < 2) {
117: continue;
118: }
119: path = SVNPathUtil.append(rootPath, (String) parts.get(0));
120: if (path.endsWith("/")) {
121: path = path.substring(0, path.length() - 1);
122: }
123: if (parts.size() == 2) {
124: url = (String) parts.get(1);
125: } else if (parts.size() == 3
126: && parts.get(1).toString().startsWith("-r")) {
127: String revStr = parts.get(1).toString();
128: revStr = revStr.substring("-r".length());
129: if (!"HEAD".equals(revStr)) {
130: try {
131: rev = Long.parseLong(revStr);
132: } catch (NumberFormatException nfe) {
133: continue;
134: }
135: }
136: url = (String) parts.get(2);
137: } else if (parts.size() == 4 && "-r".equals(parts.get(1))) {
138: String revStr = parts.get(2).toString();
139: if (!"HEAD".equals(revStr)) {
140: try {
141: rev = Long.parseLong(revStr);
142: } catch (NumberFormatException nfe) {
143: continue;
144: }
145: }
146: url = (String) parts.get(3);
147: }
148: if (path != null && url != null) {
149: if ("".equals(rootPath)
150: && ((String) parts.get(0)).startsWith("/")) {
151: path = "/" + path;
152: }
153: try {
154: url = SVNURL.parseURIEncoded(url).toString();
155: } catch (SVNException e) {
156: continue;
157: }
158:
159: try {
160: SVNExternalInfo info = new SVNExternalInfo("",
161: null, path, SVNURL.parseURIEncoded(url),
162: rev);
163: result.add(info);
164: } catch (SVNException e) {
165: }
166: }
167: }
168: return (SVNExternalInfo[]) result
169: .toArray(new SVNExternalInfo[result.size()]);
170: }
171:
172: private SVNExternalInfo addExternal(SVNAdminArea adminArea,
173: String path, SVNURL url, long revision) {
174: if (myExternals == null) {
175: myExternals = new TreeMap();
176: }
177:
178: SVNExternalInfo info = (SVNExternalInfo) myExternals.get(path);
179: if (info == null) {
180: info = new SVNExternalInfo(adminArea
181: .getRelativePath(myAnchor), new File(getAnchor()
182: .getRoot(), path), path, null, -1);
183: myExternals.put(path, info);
184: }
185: info.setNewExternal(url, revision);
186: return info;
187: }
188:
189: public Iterator externals() {
190: if (myExternals == null) {
191: return Collections.EMPTY_LIST.iterator();
192: }
193: return myExternals.values().iterator();
194: }
195:
196: }
|