public void handleLogEntry(SVNLogEntry logEntry) throws SVNException {
   listener.getLogger().println("SVNLogEntry=" + logEntry);
   core.handleLogEntry(logEntry);
 }
  public long log(
      String[] targetPaths,
      long startRevision,
      long endRevision,
      boolean changedPaths,
      boolean strictNode,
      long limit,
      ISVNLogEntryHandler handler)
      throws SVNException {
    long count = 0;

    long latestRev = -1;
    if (isInvalidRevision(startRevision)) {
      startRevision = latestRev = getLatestRevision();
    }
    if (isInvalidRevision(endRevision)) {
      endRevision = latestRev != -1 ? latestRev : getLatestRevision();
    }

    try {
      openConnection();
      String[] repositoryPaths = getRepositoryPaths(targetPaths);
      if (repositoryPaths == null || repositoryPaths.length == 0) {
        repositoryPaths = new String[] {""};
      }
      Object[] buffer =
          new Object[] {
            "log",
            repositoryPaths,
            getRevisionObject(startRevision),
            getRevisionObject(endRevision),
            Boolean.valueOf(changedPaths),
            Boolean.valueOf(strictNode),
            limit > 0 ? new Long(limit) : null
          };
      write("(w((*s)(n)(n)wwn))", buffer);
      authenticate();
      while (true) {
        try {
          read("((", buffer, false);
          Map changedPathsMap = null;
          if (changedPaths) {
            changedPathsMap = handler != null ? new HashMap() : null;
            while (true) {
              try {
                read("(SW(?S?N))", buffer, false);
                if (changedPathsMap != null) {
                  String path = SVNReader.getString(buffer, 0);
                  if (path != null && !"".equals(path.trim())) {
                    String type = SVNReader.getString(buffer, 1);
                    String copyPath = SVNReader.getString(buffer, 2);
                    long copyRev = SVNReader.getLong(buffer, 3);
                    changedPathsMap.put(
                        path, new SVNLogEntryPath(path, type.charAt(0), copyPath, copyRev));
                  }
                }
              } catch (SVNException e) {
                break;
              }
            }
          }
          read(")N(?S)(?S)(?S))", buffer, false);
          count++;
          if (handler != null && (limit <= 0 || count <= limit)) {
            long revision = SVNReader.getLong(buffer, 0);
            String author = SVNReader.getString(buffer, 1);
            Date date = SVNReader.getDate(buffer, 2);
            String message = SVNReader.getString(buffer, 3);
            // remove all
            handler.handleLogEntry(
                new SVNLogEntry(changedPathsMap, revision, author, date, message));
          }
        } catch (SVNException e) {
          if (e instanceof SVNCancelException || e instanceof SVNAuthenticationException) {
            throw e;
          }
          read("x", buffer, true);
          if (limit <= 0 || (limit > 0 && count <= limit)) {
            read("[()]", buffer, true);
          }
          return count;
        }
      }
    } catch (SVNException e) {
      closeSession();
      throw e;
    } finally {
      closeConnection();
    }
  }