| 
 
/******************************************************************************* 
 * Copyright (c) 2008 Industrial TSI and Maarten Meijer. 
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Eclipse Public License v1.0 
 * which accompanies this distribution, and is available at 
 * http://www.eclipse.org/legal/epl-v10.html 
 * 
 * Contributors: 
 *     Industrial TSI - initial API and implementation 
 *******************************************************************************/ 
 
package org.eclipse.mylyn.industrial.core.persistence; 
 
import java.sql.SQLException; 
import java.util.List; 
import java.util.Map; 
 
import org.eclipse.core.runtime.CoreException; 
import org.eclipse.mylyn.industrial.core.dto.IndustrialAttachment; 
import org.eclipse.mylyn.industrial.core.dto.IndustrialComment; 
import org.eclipse.mylyn.industrial.core.dto.IndustrialQueryParams; 
import org.eclipse.mylyn.industrial.core.dto.IndustrialTask; 
import org.eclipse.mylyn.tasks.core.TaskRepository; 
 
/** 
 * @author Ahmed Aadel 
 *  
 * @since 0.8.0 
 *  
 * @implement This interface is intended to be implemented by clients. 
 */ 
public interface IPersistor { 
 
  /** 
   * This task is new, so it has no ID to be identified with among other tasks 
   * in this repository. Persist this new task and return its id. 
   *  
   * @param repository 
   *            the repository to which this task belongs. 
   * @param taskToPersist 
   *            the task to persist. 
   * @return the id of this newly created and persisted task. 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  String persistTask(TaskRepository repository, IndustrialTask taskToPersist) throws SQLException, 
      CoreException; 
 
  /** 
   * Persist this comment state 
   *  
   * @param repository 
   *            The repository to which this comment belongs. 
   * @param comment 
   *            The comment to persist 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  void persistComment(TaskRepository repository, IndustrialComment comment) throws SQLException, 
      CoreException; 
 
  /** 
   * @param repository 
   *            The repository to which this attachment belongs. 
   * @param attachment 
   *            The attachment to persist 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  void persistAttachment(TaskRepository repository, IndustrialAttachment attachment) throws SQLException, 
      CoreException; 
 
  /** 
   * Persist this existing task in the repository. 
   *  
   * @param repository 
   *            The repository to which this task belongs. 
   * @param task 
   *            The task to update 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  void updateTask(TaskRepository repository, IndustrialTask task) throws SQLException, CoreException; 
 
  /** 
   *  
   * @param repository 
   *            The repository to which this task belongs. 
   * @param key 
   *            The Key of the task to fetch. 
   * @return the task to fetch 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  IndustrialTask fetchTask(TaskRepository repository, String... taskId) throws SQLException, CoreException; 
 
  /** 
   * Given a repository and one or more task keys, return all comments 
   * belonging to the task with the given keys. 
   *  
   * @param repository 
   * @param keys 
   *            one or more keys of the tasks owning these comments 
   * @return the comments for the tasks 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  List<IndustrialComment> fetchComments(TaskRepository repository, String... taskId) throws SQLException, 
      CoreException; 
 
  /** 
   * Given a repository and a task key, return all attachments belonging to 
   * the task with the given key. 
   *  
   * @param repository 
   *            The repository to which the task owning these attachments 
   *            belongs. 
   * @param key 
   *            The key of the task owning these attachments. 
   * @return the attachment proxies for this task 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  List<IndustrialAttachment> fetchAttachments(TaskRepository repository, String... taskId) 
      throws SQLException, CoreException; 
 
  /** 
   * Fetches additional Mylyn attributes from the repository. 
   * <p> 
   * Until the Mylyn attribute <code>task.common.user.reporter.name</code> is 
   * supported by its own method, it can be supplied by this method. 
   *  
   * @param repository 
   * @param key 
   *            of the task 
   * @return Map with additional attributes and values. 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  Map<String, String> fetchAdditional(TaskRepository repository, String... taskId) throws SQLException, 
      CoreException; 
 
  /** 
   * Return the blob content of the attachment with the given key. The passed 
   * id of the attachment is read from the task so this method should not 
   * return null. 
   *  
   * @param repository 
   *            The repository to which the task owning this attachment blob 
   *            belongs. 
   * @param attachmentId 
   *            The key of the attachment whose blob must be fetched. 
   * @return byte[] which contains the attachment content, should not be null 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  byte[] fetchAttachmentBlob(TaskRepository repository, String attachmentId) throws SQLException, 
      CoreException; 
 
  /** 
   * Return all keys/id's of the tasks/issues handled by this very repository. 
   *  
   * @param repository 
   * @param criteria 
   * @return 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  /** 
   * Search for all tasks obeying the given criteria and return their keys. 
   *  
   * @param repository 
   * @param criteria 
   * @return List of keys/id's of found tasks if any. Empty list otherwise. 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  List<String> findTasks(TaskRepository repository, IndustrialQueryParams criteria) throws SQLException, 
      CoreException; 
 
  /** 
   * This list of owners is also used to populate the Owner task attribute and 
   * to query the repository. 
   *  
   * @param repository 
   * @return a list of owners' names that are valid to use in this repository. 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  List<String> getLegalOwners(TaskRepository repository) throws SQLException, CoreException; 
 
  /** 
   * This list of products is also used to populate the Product task attribute 
   * and to query the repository. 
   *  
   * @param repository 
   * @return a list of products that are valid to use in this repository. 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  List<String> getLegalProducts(TaskRepository repository) throws SQLException, CoreException; 
 
  /** 
   * This list of priorities is also used to populate a Priority task 
   * attribute and to query the repository. 
   *  
   * @param repository 
   * @return a list of priorities that are valid to be used in this 
   *         repository. 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  List<String> getLegalPriorities(TaskRepository repository) throws SQLException, CoreException; 
 
  /** 
   * This list of status is also used to populate a Status task attribute and 
   * to query the repository. 
   *  
   * @param repository 
   * @return a list of status that are valid to be used in this repository. 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  List<String> getLegalIssueStatus(TaskRepository repository) throws SQLException, CoreException; 
 
  /** 
   * Validate this repository configuration. 
   *  
   * @param repository 
   * @return true if valid, false otherwise. 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  boolean validate(TaskRepository repository) throws SQLException, CoreException; 
 
  /** 
   * Defines if this repository can be intitialized. This means that the class 
   * defined in the 
   * <code>org.eclipse.mylyn.sql.core.database.dbinitializer</code> may be 
   * called to do initialization work. Whatever that may be is up to the 
   * implementor of that class. 
   *  
   * @param repository 
   * @return true if the initialization class can be called otherwise false. 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  // FIXME is this really necessary and how do we connect the database to the 
  // extension point because multiple persistors may exist and this is not 
  // used in the extension point 
  boolean canInitialize(TaskRepository repository) throws SQLException, CoreException; 
 
  /** 
   * Initialize this repository configuration. 
   *  
   * @param repository 
   * @throws SQLException 
   * @throws CoreException 
   */ 
  // FIXME please make clear what this method is doing here. Also describe the 
  // relationship with dbinitializer extension point. 
  void initialize(TaskRepository repository) throws SQLException, CoreException; 
}
 
    |