All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fr.vergne.translation.impl.OnDemandEntry Maven / Gradle / Ivy

The newest version!
package fr.vergne.translation.impl;

import java.util.Collection;
import java.util.HashSet;

import fr.vergne.translation.TranslationEntry;
import fr.vergne.translation.TranslationMetadata;
import fr.vergne.translation.util.Reader;
import fr.vergne.translation.util.Writer;

/**
 * an {@link OnDemandEntry} retrieves the stored texts (original version and
 * translation) on demand, meaning that it does not directly store them. Only
 * the current translation is stored.
 * 
 * @author Matthieu VERGNE 
 * 
 * @param 
 */
public class OnDemandEntry implements
		TranslationEntry {

	private static final Writer> DEFAULT_SAVER = new Writer>() {

		@Override
		public void write(OnDemandEntry entry) {
			entry.saveTranslation();
			entry.getMetadata().saveAll();
		}
	};
	private final Reader originalReader;
	private final Reader translationReader;
	private final Writer translationSaver;
	private String currentTranslation;
	private final Metadata metadata;
	private final Writer> entrySaver;
	private final Collection listeners = new HashSet<>();

	/**
	 * Instantiate an {@link OnDemandEntry} with custom data retrieval and
	 * saving strategies. This is the most open solution to adapt to many
	 * situations.
	 * 
	 * @param originalReader
	 *            the {@link Reader} to use for {@link #getOriginalContent()}
	 * @param translationReader
	 *            the {@link Reader} to use for {@link #getStoredTranslation()}
	 * @param translationSaver
	 *            the {@link Writer} to use for {@link #saveTranslation()}
	 * @param metadata
	 *            the {@link TranslationMetadata} of this
	 *            {@link TranslationEntry}
	 * @param entrySaver
	 *            the {@link Writer} to use for {@link #saveAll()}
	 */
	public OnDemandEntry(Reader originalReader,
			Reader translationReader,
			Writer translationSaver, Metadata metadata,
			Writer> entrySaver) {
		this.translationReader = translationReader;
		this.translationSaver = translationSaver;
		this.originalReader = originalReader;
		this.metadata = metadata;
		this.currentTranslation = translationReader.read();
		this.entrySaver = entrySaver;
	}

	/**
	 * Instantiate a {@link OnDemandEntry} with a naive saving strategy for
	 * {@link #saveAll()}: first save the translation with
	 * {@link #saveTranslation()}, then save the metadata with
	 * {@link TranslationMetadata#saveAll()}. If you want a smarter strategy,
	 * use the most extended constructor.
	 * 
	 * @param originalReader
	 *            the {@link Reader} to use for {@link #getOriginalContent()}
	 * @param translationReader
	 *            the {@link Reader} to use for {@link #getStoredTranslation()}
	 * @param translationSaver
	 *            the {@link Writer} to use for {@link #saveTranslation()}
	 * @param metadata
	 *            the {@link TranslationMetadata} of this
	 *            {@link TranslationEntry}
	 */
	public OnDemandEntry(Reader originalReader,
			Reader translationReader,
			Writer translationSaver, Metadata metadata) {
		this(originalReader, translationReader, translationSaver, metadata,
				DEFAULT_SAVER);
	}

	@Override
	public String getOriginalContent() {
		return originalReader.read();
	}

	@Override
	public String getStoredTranslation() {
		return translationReader.read();
	}

	@Override
	public String getCurrentTranslation() {
		return currentTranslation;
	}

	@Override
	public void setCurrentTranslation(String translation) {
		if (translation == null) {
			throw new IllegalArgumentException("No translation provided");
		} else {
			this.currentTranslation = translation;
			for (TranslationListener listener : listeners) {
				listener.translationUpdated(translation);
			}
		}
	}

	@Override
	public void saveTranslation() {
		translationSaver.write(getCurrentTranslation());
	}

	@Override
	public void resetTranslation() {
		setCurrentTranslation(getStoredTranslation());
	}

	@Override
	public void saveAll() {
		entrySaver.write(this);
	}

	@Override
	public void resetAll() {
		resetTranslation();
		getMetadata().resetAll();
	}

	@Override
	public Metadata getMetadata() {
		return metadata;
	}

	@Override
	public void addTranslationListener(TranslationListener listener) {
		listeners.add(listener);
	}

	@Override
	public void removeTranslationListener(TranslationListener listener) {
		listeners.remove(listener);
	}

	@Override
	public String toString() {
		String original = format(getOriginalContent());
		String translation = format(getCurrentTranslation());
		return "\"" + original + "\" => \"" + translation + "\"";
	}

	private String format(String text) {
		String oneLineText = "";
		for (String line : text.split("\n")) {
			oneLineText += line.trim() + " ";
		}
		return oneLineText.trim();
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy