private SVNEntry readEntry(BufferedReader reader, int entryNumber) throws IOException, SVNException {
private SVNEntry2 readEntry(BufferedReader reader, int entryNumber) throws IOException, SVNException {
    private SVNEntry readEntry(BufferedReader reader, int entryNumber) throws IOException, SVNException {        String line = reader.readLine();        if (line == null && entryNumber > 1) {            return null;        }        String name = parseString(line);        name = name != null ? name : getThisDirName();        Map entryAttrs = new HashMap();        entryAttrs.put(SVNProperty.NAME, name);        SVNEntry entry = new SVNEntry(entryAttrs, this, name);                line = reader.readLine();        String kind = parseValue(line);        if (kind != null) {            SVNNodeKind parsedKind = SVNNodeKind.parseKind(kind);             if (parsedKind != SVNNodeKind.UNKNOWN && parsedKind != SVNNodeKind.NONE) {                entryAttrs.put(SVNProperty.KIND, kind);            } else {                SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.NODE_UNKNOWN_KIND, "Entry ''{0}'' has invalid node kind", name);                SVNErrorManager.error(err);            }        } else {            entryAttrs.put(SVNProperty.KIND, SVNNodeKind.NONE.toString());        }                line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String revision = parseValue(line);        if (revision != null) {            entryAttrs.put(SVNProperty.REVISION, revision);        }                line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String url = parseString(line);        if (url == null) {            entryAttrs.put(SVNProperty.URL, url);        }                line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String reposRoot = parseString(line);        if (reposRoot != null && url != null && !SVNPathUtil.isAncestor(reposRoot, url)) {            SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.WC_CORRUPT, "Entry for ''{0}'' has invalid repository root", name);            SVNErrorManager.error(err);        } else if (reposRoot != null) {            entryAttrs.put(SVNProperty.REPOS, reposRoot);        }                line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String schedule = parseValue(line);        if (schedule != null) {            if (SVNProperty.SCHEDULE_ADD.equals(schedule) || SVNProperty.SCHEDULE_DELETE.equals(schedule) || SVNProperty.SCHEDULE_REPLACE.equals(schedule)) {                entryAttrs.put(SVNProperty.SCHEDULE, schedule);            } else {                SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.ENTRY_ATTRIBUTE_INVALID, "Entry ''{0}'' has invalid ''{1}'' value", new Object[]{name, SVNProperty.SCHEDULE});                SVNErrorManager.error(err);            }        }                line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String timestamp = parseValue(line);        if (timestamp != null) {            entryAttrs.put(SVNProperty.TEXT_TIME, timestamp);        }                line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String checksum = parseString(line);        if (checksum != null) {            entryAttrs.put(SVNProperty.CHECKSUM, checksum);        }        line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String committedDate = parseValue(line);        if (committedDate != null) {            entryAttrs.put(SVNProperty.COMMITTED_DATE, committedDate);        }        line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String committedRevision = parseValue(line);        if (committedRevision != null) {            entryAttrs.put(SVNProperty.COMMITTED_REVISION, committedRevision);        }                line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String committedAuthor = parseString(line);        if (committedAuthor != null) {            entryAttrs.put(SVNProperty.LAST_AUTHOR, checksum);        }                line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        boolean hasProps = parseBoolean(line, SVNProperty.HAS_PROPS);        if (hasProps) {            entryAttrs.put(SVNProperty.HAS_PROPS, SVNProperty.toString(hasProps));        }        line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        boolean hasPropMods = parseBoolean(line, SVNProperty.HAS_PROP_MODS);        if (hasPropMods) {            entryAttrs.put(SVNProperty.HAS_PROP_MODS, SVNProperty.toString(hasPropMods));        }        line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String cachablePropsStr = parseValue(line);        if (cachablePropsStr != null) {            String[] cachableProps = fromString(cachablePropsStr, " ");            entryAttrs.put(SVNProperty.CACHABLE_PROPS, cachableProps);        }                line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String presentPropsStr = parseValue(line);        if (presentPropsStr != null) {            String[] presentProps = fromString(presentPropsStr, " ");            entryAttrs.put(SVNProperty.PRESENT_PROPS, presentProps);        }                line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String prejFile = parseString(line);        if (prejFile != null) {            entryAttrs.put(SVNProperty.PROP_REJECT_FILE, prejFile);        }        line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String conflictOldFile = parseString(line);        if (conflictOldFile != null) {            entryAttrs.put(SVNProperty.CONFLICT_OLD, conflictOldFile);        }        line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String conflictNewFile = parseString(line);        if (conflictNewFile != null) {            entryAttrs.put(SVNProperty.CONFLICT_NEW, conflictNewFile);        }        line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String conflictWorkFile = parseString(line);        if (conflictWorkFile != null) {            entryAttrs.put(SVNProperty.CONFLICT_WRK, conflictWorkFile);        }        line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        boolean isCopied = parseBoolean(line, ATTRIBUTE_COPIED);        if (isCopied) {            entryAttrs.put(SVNProperty.COPIED, SVNProperty.toString(isCopied));        }        line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String copyfromURL = parseString(line);        if (copyfromURL != null) {            entryAttrs.put(SVNProperty.COPYFROM_URL, copyfromURL);        }                line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String copyfromRevision = parseValue(line);        if (copyfromRevision != null) {            entryAttrs.put(SVNProperty.COPYFROM_REVISION, copyfromRevision);        }                line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        boolean isDeleted = parseBoolean(line, ATTRIBUTE_DELETED);        if (isDeleted) {            entryAttrs.put(SVNProperty.DELETED, SVNProperty.toString(isDeleted));        }        line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        boolean isAbsent = parseBoolean(line, ATTRIBUTE_ABSENT);        if (isAbsent) {            entryAttrs.put(SVNProperty.ABSENT, SVNProperty.toString(isAbsent));        }        line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        boolean isIncomplete = parseBoolean(line, ATTRIBUTE_INCOMPLETE);        if (isIncomplete) {            entryAttrs.put(SVNProperty.INCOMPLETE, SVNProperty.toString(isIncomplete));        }        line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String uuid = parseString(line);        if (uuid != null) {            entryAttrs.put(SVNProperty.UUID, uuid);        }                line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String lockToken = parseString(line);        if (lockToken != null) {            entryAttrs.put(SVNProperty.LOCK_TOKEN, lockToken);        }                line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String lockOwner = parseString(line);        if (lockOwner != null) {            entryAttrs.put(SVNProperty.LOCK_OWNER, lockOwner);        }                line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String lockComment = parseString(line);        if (lockComment != null) {            entryAttrs.put(SVNProperty.LOCK_COMMENT, lockComment);        }                line = reader.readLine();        if (isEntryFinished(line)) {            return entry;        }        String lockCreationDate = parseValue(line);        if (lockCreationDate != null) {            entryAttrs.put(SVNProperty.LOCK_CREATION_DATE, lockCreationDate);        }        line = reader.readLine();        if (line == null || line.length() != 1) {            SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.WC_CORRUPT, "Missing entry terminator");            SVNErrorManager.error(err);        } else if (line.length() == 1 && line.charAt(0) != '\f') {            SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.WC_CORRUPT, "Invalid entry terminator");            SVNErrorManager.error(err);        }        return entry;    }