content: /**
   *  Copyright (c) 2013-2016 Angelo ZERR.
   *  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:
   *  Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
   */
  package tern.repository;
  
  import java.io.File;
  import java.io.IOException;
  
  import tern.TernException;
  import tern.metadata.TernModuleMetadata;
  import tern.server.ITernModule;
  import tern.server.ITernPlugin;
  
  /**
   * Tern repository is a local base dir which contains the tern.js JS files :
   * 
   * <ul>
   * <li>metadata</li>
   * <li>node_modules
   *   <ul>
   *     <li>tern
   *       <ul>
   * 			<li>bin</li>
   * 			<li>defs</li>
   * 			<li>plugin</li>
   *       </ul>
   *     </li>
   *   </ul>
   * </li>
   * </ul>
   *
   */
  public interface ITernRepository {
  
  	/**
  	 * Returns the tern repository name.
  	 * 
  	 * @return the tern repository name.
  	 */
  	String getName();
  
  	/**
  	 * Returns the base directory of the tern repository.
  	 * 
  	 * @return the base directory of the tern repository.
  	 */
  	File getBaseDir();
  
  	/**
  	 * Update the tbase directory of the tern repository.
  	 * 
  	 * @param baseDir
  	 */
  	void setBaseDir(File baseDir);
  	
  	/**
  	 * Returns the node_modules directory.
  	 * 
  	 * @return the node_modules directory.
  	 */
  	File getNodeModulesDir();
  	
  	/**
  	 * Returns the tern base dir (node_modules/tern) which contains ternjs and their custom plugins.
  	 * 
  	 * @return the tern base dir (node_modules/tern) which contains ternjs and their custom plugins.
  	 */
  	File getTernBaseDir();
  
  	/**
  	 * Returns the tern base dir which contains ternjs and their custom plugins
  	 * as string.
  	 * 
  	 * @return the tern base dir which contains ternjs and their custom plugins
  	 *         as string.
  	 */
  	String getTernBaseDirAsString();
  
  	/**
  	 * Returns true if the repository is a default repository and false
  	 * otherwise (custom repository).
  	 * 
  	 * @return true if the repository is a default repository and false
  	 *         otherwise (custom repository).
  	 */
  	boolean isDefault();
  
  	/**
  	 * Refresh the tern modules of this repository;
  	 */
  	void refresh();
  
  	/**
  	 * Returns the tern modules (plugins and JSON type defitions).
  	 * 
  	 * @return the tern modules (plugins and JSON type defitions).
  	 * @throws TernException
  	 */
  	ITernModule[] getModules() throws TernException;
  
  	/**
  	 * Returns the file of the given module and null otherwise.
  	 * 
  	 * @param module
  	 * @return the file of the given module and null otherwise.
  	 */
  	File getFile(ITernModule module);
  
  	/**
  	 * Returns the module by name and null otherwise.
  	 * 
  	 * @param name
  	 * @return the module by name and null otherwise.
  	 */
  	ITernModule getModule(String name);
  
  	/**
  	 * Returns the module by origin and null otherwise.
  	 * 
  	 * @param origin
  	 * @return the module by origin and null otherwise.
  	 */
  	ITernModule getModuleByOrigin(String origin);
  
  	/**
  	 * Returns the list fo tern plugin which are linter.
  	 * 
  	 * @return the list fo tern plugin which are linter.
  	 */
  	ITernPlugin[] getLinters();
  
  	/**
  	 * Install the given module file to the repository.
  	 * 
  	 * @param moduleFile
  	 *            module file which is a zip/jar or folder which contains tern
  	 *            module.
  	 * @throws IOException
  	 * @throws TernException
  	 */
  	void install(File moduleFile) throws IOException, TernException;
  
  	/**
  	 * Returns the {@link TernModuleMetadata} from the given module name and
  	 * null otherwise.
  	 * 
  	 * @param moduleName
  	 * @return the {@link TernModuleMetadata} from the given module name and
  	 *         null otherwise.
  	 */
  	TernModuleMetadata getDefaultMetadata(String moduleName);
  	
  }
  