content: // This file is part of AceWiki.
  // Copyright 2008-2013, AceWiki developers.
  // 
  // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU
  // Lesser General Public License as published by the Free Software Foundation, either version 3 of
  // the License, or (at your option) any later version.
  // 
  // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
  // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  // Lesser General Public License for more details.
  // 
  // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If
  // not, see http://www.gnu.org/licenses/.
  
  package ch.uzh.ifi.attempto.acewiki.core;
  
  import java.io.BufferedWriter;
  import java.io.IOException;
  import java.io.OutputStream;
  import java.io.OutputStreamWriter;
  import java.io.Writer;
  import java.util.List;
  
  /**
   * This abstract class is used to export AceWiki ontologies in different formats.
   * 
   * @author Tobias Kuhn
   */
  public abstract class OntologyExporter {
  	
  	private Ontology ontology;
  	private OutputStream outputStream;
  	private Writer writer;
  	
  	/**
  	 * Creates a new exporter.
  	 */
  	protected OntologyExporter() {
  	}
  	
  	void init(Ontology ontology) {
  		this.ontology = ontology;
  	}
  	
  	/**
  	 * Writes the export content into the given output stream. The stream is closed at the end.
  	 * 
  	 * @param outputStream The output stream.
  	 * @param language The language used for exporting (ignored by many exporters).
  	 */
  	public void export(OutputStream outputStream, String language) {
  		this.outputStream = outputStream;
  		try {
  			writeContent(language);
  			if (writer != null) writer.close();
  			outputStream.close();
  			this.writer = null;
  			this.outputStream = null;
  		} catch (IOException ex) {
  			ex.printStackTrace();
  		}
  	}
  	
  	/**
  	 * Returns whether this ontology exporter is applicable in the current context.
  	 * 
  	 * @return true if this ontology exporter is applicable.
  	 */
  	public abstract boolean isApplicable();
  	
  	/**
  	 * Returns the name of this exporter as shown to the user, or a text key for localization.
  	 * 
  	 * @return The name of this exporter.
  	 */
  	public abstract String getName();
  	
  	/**
  	 * This internal method should write the export content.
  	 * 
  	 * @param language The current language.
  	 * @throws IOException when an IO problem occurs.
  	 */
  	protected abstract void writeContent(String language) throws IOException;
  	
  	/**
  	 * Returns the file suffix for the given export type.
  	 * 
  	 * @return The file suffix.
  	 */
  	public abstract String getFileSuffix();
  	
  	/**
  	 * Returns the content type for the given export type.
  	 * 
  	 * @return The content type.
  	 */
  	public abstract String getContentType();
  	
  	/**
  	 * Returns the AceWiki ontology for this exporter.
  	 * 
  	 * @return The AceWiki ontology.
  	 */
  	protected Ontology getOntology()  {
  		return ontology;
  	}
  	
  	/**
  	 * Returns the list of all ontology elements.
  	 * 
  	 * @return The ontology elements.
  	 */
  	protected List<OntologyElement> getOntologyElements() {
  		return ontology.getOntologyElements();
  	}
  
  	/**
  	 * Returns all instances of class <code>type</code> in the current list of ontology elements.
  	 * The returned iterable has elements whose class is <code>type</code> or a subclass of <code>type</code>.
  	 * The returned iterable's iterator does not support <code>remove()</code>.
  	 *
  	 * @param type the type of ontology elements desired
  	 * @return an unmodifiable iterable containing all the ontology elements that are of the requested type
  	 */
  	protected <T> Iterable<T> getOntologyElements(Class<T> type) {
  		return ontology.getOntologyElements(type);
  	}
  
  	/**
  	 * Returns the current output stream.
  	 * 
  	 * @return The current output stream.
  	 */
  	protected OutputStream getOutputStream() {
  		return outputStream;
  	}
  	
  	/**
  	 * Writes the given string into the current output stream.
  	 * 
  	 * @param str The string to be written.
  	 * @throws IOException when an IO problem occurs.
  	 */
  	protected void write(String str) throws IOException {
  		if (writer == null) {
  			writer = new BufferedWriter(new OutputStreamWriter(outputStream));
  		}
  		writer.write(str);
  	}
  
  }
  