/*
* Copyright (C) 2015, VistaTEC or third-party contributors as indicated
* by the @author tags or express copyright attribution statements applied by
* the authors. All third-party contributions are distributed under license by
* VistaTEC.
*
* This file is part of Ocelot.
*
* Ocelot 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.
*
* Ocelot 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 this program. If not, write to:
*
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301
* USA
*
* Also, see the full LGPL text here: <http://www.gnu.org/copyleft/lesser.html>
*/
package com.vistatec.ocelot.segment.model;
import java.util.ArrayList;
import java.util.List;
import com.vistatec.ocelot.its.model.ITSMetadata;
import com.vistatec.ocelot.its.model.LanguageQualityIssue;
import com.vistatec.ocelot.its.model.OtherITSMetadata;
import com.vistatec.ocelot.its.model.Provenance;
import com.vistatec.ocelot.its.model.TerminologyMetaData;
import com.vistatec.ocelot.its.model.TextAnalysisMetaData;
import com.vistatec.ocelot.segment.editdistance.EditDistance;
import com.vistatec.ocelot.segment.model.okapi.Notes;
/**
* Provides generic functionality for manipulating Ocelot segments that is
* sufficient for most cases. Does not implement how to determine if a segment
* is editable.
*/
public abstract class BaseSegment implements OcelotSegment {
protected final int segmentNumber;
protected final SegmentVariant source;
protected SegmentVariant target, originalTarget;
protected boolean setOriginalTarget = false;
protected boolean dirtyEditDistance = true;
protected int editDistance;
protected Notes notes;
protected boolean dirtyTargetDiff = true;
protected List<String> targetDiff = new ArrayList<>();
protected final List<LanguageQualityIssue> lqiList = new ArrayList<>();
protected final List<Provenance> provList = new ArrayList<>();
protected final List<TextAnalysisMetaData> taList = new ArrayList<TextAnalysisMetaData>();
protected final List<TerminologyMetaData> termList = new ArrayList<TerminologyMetaData>();
private boolean addedOcelotProvenance = false;
protected final List<OtherITSMetadata> otherITSList = new ArrayList<>();
public BaseSegment(int segmentNumber, SegmentVariant source,
SegmentVariant target, SegmentVariant originalTarget) {
this.segmentNumber = segmentNumber;
this.source = source;
this.target = target;
this.notes = new Notes();
if (originalTarget != null) {
setOriginalTarget(originalTarget);
} else {
this.originalTarget = source.createEmptyTarget();
}
}
@Override
public int getSegmentNumber() {
return this.segmentNumber;
}
@Override
public SegmentVariant getSource() {
return this.source;
}
@Override
public SegmentVariant getTarget() {
return this.target;
}
@Override
public SegmentVariant getOriginalTarget() {
return this.originalTarget;
}
@Override
public final void setOriginalTarget(SegmentVariant originalTarget) {
if (!this.setOriginalTarget) {
this.originalTarget = originalTarget;
}
this.setOriginalTarget = true;
}
@Override
public boolean hasOriginalTarget() {
return this.setOriginalTarget;
}
public void setNotes(Notes notes){
this.notes = notes;
}
public Notes getNotes(){
return notes;
}
/**
* Update the segment target if there are differences, and make sure to
* set the original target and refresh the edit distance and target diff.
* @param updatedTarget
* @return Whether the target needed to be updated or not.
*/
@Override
public boolean updateTarget(SegmentVariant updatedTarget) {
if (!updatedTarget.getDisplayText().equals(target.getDisplayText())) {
if (!hasOriginalTarget()) {
setOriginalTarget(target);
}
target = updatedTarget;
dirtyEditDistance = true;
dirtyTargetDiff = true;
return true;
} else {
return false;
}
}
@Override
public boolean resetTarget() {
if (hasOriginalTarget()) {
updateTarget(getOriginalTarget());
return true;
} else {
return false;
}
}
@Override
public List<String> getTargetDiff() {
if (hasOriginalTarget() && dirtyTargetDiff) {
this.targetDiff = EditDistance.styleTextDifferences(getTarget(), getOriginalTarget());
dirtyTargetDiff = false;
}
return this.targetDiff;
}
@Override
public int getEditDistance() {
if (dirtyEditDistance) {
editDistance = hasOriginalTarget() ?
EditDistance.calcEditDistance(getTarget(), getOriginalTarget()) : 0;
dirtyEditDistance = false;
}
return editDistance;
}
@Override
public List<LanguageQualityIssue> getLQI() {
return lqiList;
}
@Override
public void addLQI(LanguageQualityIssue lqi) {
lqiList.add(lqi);
}
@Override
public void addAllLQI(List<LanguageQualityIssue> lqis) {
this.lqiList.addAll(lqis);
}
@Override
public void removeLQI(LanguageQualityIssue removeLQI) {
lqiList.remove(removeLQI);
}
@Override
public List<Provenance> getProvenance() {
return provList;
}
@Override
public void addProvenance(Provenance prov) {
provList.add(prov);
}
@Override
public void addAllProvenance(List<Provenance> provs) {
this.provList.addAll(provs);
}
@Override
public boolean hasOcelotProvenance() {
return addedOcelotProvenance;
}
@Override
public void setOcelotProvenance(boolean flag) {
addedOcelotProvenance = flag;
}
@Override
public List<TextAnalysisMetaData> getTextAnalysis() {
return taList;
}
@Override
public void addTextAnalysis(TextAnalysisMetaData ta) {
taList.add(ta);
}
@Override
public void addAllTextAnalysis(List<TextAnalysisMetaData> tas) {
if(tas != null){
taList.addAll(tas);
}
}
@Override
public void removeTextAnalysis(TextAnalysisMetaData ta) {
if(taList != null && ta != null){
taList.remove(ta);
}
}
@Override
public java.util.List<TerminologyMetaData> getTerms() {
return termList;
}
@Override
public void addTerm(TerminologyMetaData term) {
termList.add(term);
}
@Override
public void addAllTerms(List<TerminologyMetaData> terms) {
if(terms != null){
termList.addAll(terms);
}
}
@Override
public void removeTerm(TerminologyMetaData term) {
if(termList != null && term != null){
termList.remove(term);
}
}
@Override
public List<OtherITSMetadata> getOtherITSMetadata() {
return this.otherITSList;
}
@Override
public void addAllOtherITSMetadata(List<OtherITSMetadata> otherITS) {
this.otherITSList.addAll(otherITS);
}
@Override
public List<ITSMetadata> getITSMetadata() {
List<ITSMetadata> its = new ArrayList<>();
its.addAll(lqiList);
its.addAll(provList);
its.addAll(otherITSList);
its.addAll(taList);
its.addAll(termList);
return its;
}
}