public String packLogEntries(Project project, List<LogEntry<? extends ILogable>> logs) {

    StringBuffer sb = new StringBuffer(getUUIDStringForProject(project)).append(LOGENTRIES_MESSAGE);
    StringBuffer partResult = new StringBuffer();

    log.debug("Starting to process log entries...");
    for (LogEntry<? extends ILogable> l : logs) {
      try {
        // clear partResult
        partResult.delete(0, partResult.length());

        // build serialized version of l
        partResult
            .append(BEGIN_LOGENTRY)
            .append(this.logEntrySerializer.serialize(l, project))
            .append(END_LOGENTRY);

        log.debug("Serialised log entry " + partResult.toString());
        // only if building succeeded, add the logEntry to sb
        sb.append(partResult);
        log.debug("New sb content: " + sb.toString());
      } catch (Throwable e) {
        log.warn(
            "Failed to serialize log entry: "
                + l.getLogAction().toString()
                + "("
                + l.toString()
                + ")",
            e);
      }
    }
    log.debug("Finished processing log entries! Now sending.");

    return sb.toString();
  }
  public List<LogEntry<? extends ILogable>> unpackLogEntries(String les) {
    log.debug("unpacking string " + les);
    List<LogEntry<? extends ILogable>> results = new ArrayList<LogEntry<? extends ILogable>>();
    String[] logentries = les.split(END_LOGENTRY + BEGIN_LOGENTRY);

    for (String l : logentries) {
      try {
        log.debug("unpacking substring " + l);
        LogEntry<? extends ILogable> logentry = this.logEntrySerializer.deserialize(l);
        log.debug("got logentry: " + logentry.toString());
        results.add(logentry);
      } catch (Throwable t) {
        log.warn("Failed to deserialize and/or save", t);
      }
    }
    return results;
  }
 public String requestFile(Project project, LogEntry<JakeObject> le) {
   // can't use XML characters
   return project.getProjectId() + "." + le.getUuid();
 }