/* * ==================================================================== * Copyright (c) 2004-2008 TMate Software Ltd. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://svnkit.com/license.html. * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * ==================================================================== */ package org.tmatesoft.svn.core.internal.server.dav; import org.tmatesoft.svn.core.SVNErrorCode; import org.tmatesoft.svn.core.SVNErrorMessage; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.internal.util.SVNPathUtil; import org.tmatesoft.svn.core.internal.wc.SVNErrorManager; import org.tmatesoft.svn.util.SVNDebugLog; import org.tmatesoft.svn.util.SVNLogType; /** * @author TMate Software Ltd. * @version 1.2.0 */ public class DAVResourceURI { public static final String SPECIAL_URI = "!svn"; public static final String DEDAULT_VCC_NAME = "default"; private String myURI; private String myContext; private DAVResourceType myType; private DAVResourceKind myKind; private long myRevision; private String myPath; private String myActivityID; private boolean myIsExists = false; private boolean myIsVersioned = false; private boolean myIsBaseLined = false; private boolean myIsWorking = false; public DAVResourceURI(String context, String uri, String label, boolean useCheckedIn) throws SVNException { StringBuffer logBuffer = new StringBuffer(); logBuffer.append('\n'); logBuffer.append("uri: " + uri); logBuffer.append('\n'); logBuffer.append("label: " + label); logBuffer.append('\n'); logBuffer.append("context: " + context); SVNDebugLog.getDefaultLog().logFine(SVNLogType.DEFAULT, logBuffer.toString()); myURI = uri == null ? "" : uri; myContext = context; myRevision = DAVResource.INVALID_REVISION; parseURI(label, useCheckedIn); logBuffer.delete(0, logBuffer.length()); logBuffer.append('\n'); logBuffer.append("DAVResourceURI.getRequestURI(): " + getRequestURI()); logBuffer.append('\n'); logBuffer.append("DAVResourceURI.getURI(): " + getURI()); logBuffer.append('\n'); logBuffer.append("DAVResourceURI.getPath(): " + getPath()); logBuffer.append('\n'); logBuffer.append("DAVResourceURI.getContext(): " + getContext()); SVNDebugLog.getDefaultLog().logFine(SVNLogType.DEFAULT, logBuffer.toString()); } public DAVResourceURI(String context, String uri, String path, long revision, DAVResourceKind kind, DAVResourceType type, String activityID, boolean exists, boolean isVersioned, boolean isBaseLined, boolean isWorking) { myContext = context; myURI = uri; myPath = path; myActivityID = activityID; myRevision = revision; myType = type; myKind = kind; myIsExists = exists; myIsVersioned = isVersioned; myIsBaseLined = isBaseLined; myIsWorking = isWorking; } public DAVResourceURI() { } public DAVResourceURI dup() { return new DAVResourceURI(myContext, myURI, myPath, myRevision, myKind, myType, myActivityID, myIsExists, myIsVersioned, myIsBaseLined, myIsWorking); } public String getRequestURI() { return SVNPathUtil.append(getContext(), getURI()); } public String getContext() { return myContext; } public String getURI() { return myURI; } public void setURI(String uri) { myURI = uri; } public DAVResourceType getType() { return myType; } public DAVResourceKind getKind() { return myKind; } public long getRevision() { return myRevision; } public String getPath() { return myPath; } public String getActivityID() { return myActivityID; } public boolean exists() { return myIsExists; } public boolean isVersioned() { return myIsVersioned; } public boolean isBaseLined() { return myIsBaseLined; } public boolean isWorking() { return myIsWorking; } public void setExists(boolean isExist) { myIsExists = isExist; } public void setPath(String path) { myPath = DAVPathUtil.standardize(path); } public void setVersioned(boolean isVersioned) { myIsVersioned = isVersioned; } public void setKind(DAVResourceKind kind) { myKind = kind; } public void setType(DAVResourceType type) { myType = type; } public void setRevision(long revisionNumber) { myRevision = revisionNumber; } public void setWorking(boolean isWorking) { myIsWorking = isWorking; } public void setActivityID(String activityID) { myActivityID = activityID; } public void setBaseLined(boolean isBaseLined) { myIsBaseLined = isBaseLined; } private void parseURI(String label, boolean useCheckedIn) throws SVNException { if (!SPECIAL_URI.equals(DAVPathUtil.head(getURI()))) { setKind(DAVResourceKind.PUBLIC); setType(DAVResourceType.REGULAR); setPath(getURI()); setVersioned(true); } else { String specialPart = DAVPathUtil.removeHead(getURI(), false); if (specialPart.length() == 0) { // root/!svn setType(DAVResourceType.PRIVATE); setKind(DAVResourceKind.ROOT_COLLECTION); } else { specialPart = DAVPathUtil.dropLeadingSlash(specialPart); if (!specialPart.endsWith("/") && SVNPathUtil.getSegmentsCount(specialPart) == 1) { // root/!svn/XXX setType(DAVResourceType.PRIVATE); } else { DAVResourceKind kind = DAVResourceKind.parseKind(DAVPathUtil.head(specialPart)); if (kind != DAVResourceKind.UNKNOWN) { setKind(kind); String parameter = DAVPathUtil.removeHead(specialPart, false); parameter = DAVPathUtil.dropLeadingSlash(parameter); if (kind == DAVResourceKind.VCC) { parseVCC(parameter, label, useCheckedIn); } else if (kind == DAVResourceKind.VERSION) { parseVersion(parameter); } else if (kind == DAVResourceKind.BASELINE) { parseBaseline(parameter); } else if (kind == DAVResourceKind.BASELINE_COLL) { parseBaselineCollection(parameter); } else if (kind == DAVResourceKind.ACT_COLLECTION) { parseActivity(parameter); } else if (kind == DAVResourceKind.HISTORY) { parseHistory(parameter); } else if (kind == DAVResourceKind.WRK_BASELINE) { parseWorkingBaseline(parameter); } else if (kind == DAVResourceKind.WORKING) { parseWorking(parameter); } } } } } } private void parseWorking(String parameter) { setType(DAVResourceType.WORKING); setVersioned(true); setWorking(true); if (SVNPathUtil.getSegmentsCount(parameter) == 1) { setActivityID(parameter); setPath("/"); } else { setActivityID(DAVPathUtil.head(parameter)); setPath(DAVPathUtil.removeHead(parameter, false)); } } private void parseWorkingBaseline(String parameter) throws SVNException { setType(DAVResourceType.WORKING); setWorking(true); setVersioned(true); setBaseLined(true); if (SVNPathUtil.getSegmentsCount(parameter) == 1) { SVNErrorManager.error(SVNErrorMessage.create(SVNErrorCode.RA_ILLEGAL_URL, "Invalid URI ''{0}''", getRequestURI()), SVNLogType.NETWORK); } setActivityID(DAVPathUtil.head(parameter)); try { String revisionParameter = DAVPathUtil.removeHead(parameter, false); long revision = Long.parseLong(DAVPathUtil.dropLeadingSlash(revisionParameter)); setRevision(revision); } catch (NumberFormatException e) { SVNErrorManager.error(SVNErrorMessage.create(SVNErrorCode.RA_ILLEGAL_URL, e), e, SVNLogType.NETWORK); } } private void parseHistory(String parameter) { setType(DAVResourceType.HISTORY); setPath(parameter); } private void parseActivity(String parameter) { setType(DAVResourceType.ACTIVITY); setActivityID(parameter); } private void parseBaselineCollection(String parameter) throws SVNException { long revision = DAVResource.INVALID_REVISION; String parameterPath; if (SVNPathUtil.getSegmentsCount(parameter) == 1) { parameterPath = "/"; try { revision = Long.parseLong(parameter); } catch (NumberFormatException e) { SVNErrorManager.error(SVNErrorMessage.create(SVNErrorCode.RA_ILLEGAL_URL, e.getMessage()), e, SVNLogType.NETWORK); } } else { try { revision = Long.parseLong(DAVPathUtil.head(parameter)); } catch (NumberFormatException e) { SVNErrorManager.error(SVNErrorMessage.create(SVNErrorCode.RA_ILLEGAL_URL, e.getMessage()), e, SVNLogType.NETWORK); } parameterPath = DAVPathUtil.removeHead(parameter, false); } setType(DAVResourceType.REGULAR); setVersioned(true); setRevision(revision); setPath(parameterPath); } private void parseBaseline(String parameter) throws SVNException { try { setRevision(Long.parseLong(parameter)); } catch (NumberFormatException e) { SVNErrorManager.error(SVNErrorMessage.create(SVNErrorCode.RA_ILLEGAL_URL, e.getMessage()), e, SVNLogType.NETWORK); } setVersioned(true); setBaseLined(true); setType(DAVResourceType.VERSION); } private void parseVersion(String parameter) throws SVNException { setVersioned(true); setType(DAVResourceType.VERSION); if (SVNPathUtil.getSegmentsCount(parameter) == 1) { try { setRevision(Long.parseLong(parameter)); } catch (NumberFormatException e) { SVNErrorManager.error(SVNErrorMessage.create(SVNErrorCode.RA_ILLEGAL_URL, "Invalid URI ''{0}''", e.getMessage()), e, SVNLogType.NETWORK); } setPath("/"); } else { try { setRevision(Long.parseLong(DAVPathUtil.head(parameter))); } catch (NumberFormatException e) { SVNErrorManager.error(SVNErrorMessage.create(SVNErrorCode.RA_ILLEGAL_URL, e.getMessage()), e, SVNLogType.NETWORK); } setPath(DAVPathUtil.removeHead(parameter, false)); } } private void parseVCC(String parameter, String label, boolean useCheckedIn) throws SVNException { if (!DEDAULT_VCC_NAME.equals(parameter)) { SVNErrorManager.error(SVNErrorMessage.create(SVNErrorCode.RA_DAV_REQUEST_FAILED, "Invalid VCC name ''{0}''", parameter), SVNLogType.NETWORK); } if (label == null && !useCheckedIn) { setType(DAVResourceType.PRIVATE); setExists(true); setVersioned(true); setBaseLined(true); } else { long revision = DAVResource.INVALID_REVISION; if (label != null) { try { revision = Long.parseLong(label); } catch (NumberFormatException e) { SVNErrorManager.error(SVNErrorMessage.create(SVNErrorCode.RA_ILLEGAL_URL, "Invalid label header ''{0}''", label), SVNLogType.NETWORK); } } setType(DAVResourceType.VERSION); setRevision(revision); setVersioned(true); setBaseLined(true); setPath(null); } } }