/** @author Greg Hinkle */
public class ContentRepositoryTreeDataSource extends RPCDataSource<Repo, RepoCriteria> {

  private RepoGWTServiceAsync repoService = GWTServiceLookup.getRepoService();

  public ContentRepositoryTreeDataSource() {
    super();
    List<DataSourceField> fields = addDataSourceFields();
    addFields(fields);
  }

  @Override
  protected List<DataSourceField> addDataSourceFields() {
    List<DataSourceField> fields = super.addDataSourceFields();

    DataSourceField idDataField = new DataSourceTextField("id", MSG.common_title_id());
    idDataField.setPrimaryKey(true);
    fields.add(idDataField);

    DataSourceTextField nameDataField = new DataSourceTextField("name", MSG.common_title_name());
    nameDataField.setCanEdit(false);
    fields.add(nameDataField);

    DataSourceTextField parentIdField =
        new DataSourceTextField("parentId", MSG.dataSource_ContentRepoTree_field_parentId());
    parentIdField.setForeignKey("id");
    fields.add(parentIdField);

    return fields;
  }

  @Override
  protected void executeFetch(
      final DSRequest request, final DSResponse response, final RepoCriteria criteria) {
    repoService.findReposByCriteria(
        criteria,
        new AsyncCallback<PageList<Repo>>() {
          public void onFailure(Throwable caught) {
            CoreGUI.getErrorHandler()
                .handleError(MSG.dataSource_ContentRepoTree_error_load(), caught);
          }

          public void onSuccess(PageList<Repo> result) {
            response.setData(buildRecords(result));
            processResponse(request.getRequestId(), response);
          }
        });
  }

  @Override
  protected RepoCriteria getFetchCriteria(final DSRequest request) {
    RepoCriteria criteria = new RepoCriteria();
    return criteria;
  }

  @Override
  public Repo copyValues(Record from) {
    return null; // TODO: Implement this method.
  }

  @Override
  public ListGridRecord copyValues(Repo from) {
    TreeNode record = new TreeNode();

    record.setID(String.valueOf(from.getId()));
    record.setName(from.getName());

    record.setAttribute("id", from.getId());
    record.setAttribute("name", from.getName());
    record.setAttribute("description", from.getDescription());
    record.setAttribute("syncSchedule", from.getSyncSchedule());
    record.setAttribute("syncStatus", from.getSyncStatus());

    record.setIsFolder(false); // don't attempt to load any children

    return record;
  }
}