/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.rf.ide.core.testdata.text.read;
import java.util.ArrayList;
import java.util.List;
import org.rf.ide.core.testdata.model.FilePosition;
import org.rf.ide.core.testdata.text.read.LineReader.Constant;
import org.rf.ide.core.testdata.text.read.VersionAvailabilityInfo.VersionAvailabilityInfoBuilder;
public class EndOfLineBuilder {
private List<Constant> constant = new ArrayList<>(0);
private int lineNumber = IRobotLineElement.NOT_SET;
private int startColumn = IRobotLineElement.NOT_SET;
private int startOffset = IRobotLineElement.NOT_SET;
public static EndOfLineBuilder newInstance() {
return new EndOfLineBuilder();
}
public EndOfLineBuilder setEndOfLines(final List<Constant> constant) {
if (constant == null) {
this.constant = new ArrayList<>(0);
} else {
this.constant.clear();
this.constant.addAll(constant);
}
return this;
}
public EndOfLineBuilder setLineNumber(final int lineNumber) {
if (lineNumber > IRobotLineElement.NOT_SET) {
this.lineNumber = lineNumber;
} else {
this.lineNumber = IRobotLineElement.NOT_SET;
}
return this;
}
public EndOfLineBuilder setStartColumn(final int startColumn) {
if (startColumn > IRobotLineElement.NOT_SET) {
this.startColumn = startColumn;
} else {
this.startColumn = IRobotLineElement.NOT_SET;
}
return this;
}
public EndOfLineBuilder setStartOffset(final int startOffset) {
if (startOffset > IRobotLineElement.NOT_SET) {
this.startOffset = startOffset;
} else {
this.startOffset = IRobotLineElement.NOT_SET;
}
return this;
}
public IRobotLineElement buildEOL() {
IRobotLineElement eol = null;
if (constant.size() == 1) {
final Constant myEol = constant.get(0);
if (myEol == Constant.CR) {
eol = new CarritageReturnEndOfLine(startOffset, lineNumber, startColumn);
} else if (myEol == Constant.LF) {
eol = new LineFeedEndOfLine(startOffset, lineNumber, startColumn);
} else if (myEol == Constant.EOF) {
eol = new EndOfFile(startOffset, lineNumber, startColumn);
}
} else if (constant.size() == 2) {
final Constant myEol1 = constant.get(0);
final Constant myEol2 = constant.get(1);
if (myEol1 == Constant.CR && myEol2 == Constant.LF) {
eol = new CRLFEndOfLine(startOffset, lineNumber, startColumn);
} else if (myEol1 == Constant.LF && myEol2 == Constant.CR) {
eol = new LFCREndOfLine(startOffset, lineNumber, startColumn);
}
}
if (eol == null) {
eol = new UndeclaredEndOfLine(startOffset, lineNumber, startColumn);
}
return eol;
}
private static class LFCREndOfLine extends AEndOfLine {
public LFCREndOfLine(final int startOffset, final int lineNumber, final int startColumn) {
super(EndOfLineTypes.LFCR, startOffset, lineNumber, startColumn);
}
}
private static class CRLFEndOfLine extends AEndOfLine {
public CRLFEndOfLine(final int startOffset, final int lineNumber, final int startColumn) {
super(EndOfLineTypes.CRLF, startOffset, lineNumber, startColumn);
}
}
private static class EndOfFile extends AEndOfLine {
public EndOfFile(final int startOffset, final int lineNumber, final int startColumn) {
super(EndOfLineTypes.EOF, startOffset, lineNumber, startColumn);
}
}
private static class LineFeedEndOfLine extends AEndOfLine {
public LineFeedEndOfLine(final int startOffset, final int lineNumber, final int startColumn) {
super(EndOfLineTypes.LF, startOffset, lineNumber, startColumn);
}
}
private static class CarritageReturnEndOfLine extends AEndOfLine {
public CarritageReturnEndOfLine(final int startOffset, final int lineNumber, final int startColumn) {
super(EndOfLineTypes.CR, startOffset, lineNumber, startColumn);
}
}
private static class UndeclaredEndOfLine extends AEndOfLine {
public UndeclaredEndOfLine(final int startOffset, final int lineNumber, final int startColumn) {
super(EndOfLineTypes.NON, startOffset, lineNumber, startColumn);
}
}
private static abstract class AEndOfLine implements IRobotLineElement {
private final int lineNumber;
private final int startColumn;
private final int startOffset;
private final List<IRobotTokenType> types;
public AEndOfLine(final EndOfLineTypes type, final int startOffset, final int lineNumber,
final int startColumn) {
this.lineNumber = lineNumber;
this.startColumn = startColumn;
this.startOffset = startOffset;
this.types = new ArrayList<>(0);
this.types.add(type);
}
@Override
public int getLineNumber() {
return lineNumber;
}
@Override
public int getStartColumn() {
return startColumn;
}
@Override
public int getEndColumn() {
return startColumn + getText().length();
}
@Override
public int getStartOffset() {
return startOffset;
}
@Override
public FilePosition getFilePosition() {
return new FilePosition(lineNumber, getStartColumn(), getStartOffset());
}
@Override
public String getText() {
return !getTypes().isEmpty() && !getTypes().get(0).getRepresentation().isEmpty()
? getTypes().get(0).getRepresentation().get(0) : "";
}
@Override
public String getRaw() {
return !getTypes().isEmpty() && !getTypes().get(0).getRepresentation().isEmpty()
? getTypes().get(0).getRepresentation().get(0) : "";
}
@Override
public List<IRobotTokenType> getTypes() {
return types;
}
@Override
public boolean isDirty() {
return false;
}
@Override
public String toString() {
return String.format("%s [lineNumber=%s, startColumn=%s, startOffset=%s, types=%s]", this.getClass(),
lineNumber, startColumn, startOffset, types);
}
@Override
public VersionAvailabilityInfo getVersionInformation() {
VersionAvailabilityInfo var = null;
if (!types.isEmpty()) {
var = types.get(0).findVersionAvailablilityInfo(getRaw());
}
return var;
}
@Override
public AEndOfLine copyWithoutPosition() {
return copy(false);
}
@Override
public AEndOfLine copy() {
return copy(true);
}
private AEndOfLine copy(final boolean posInclude) {
final EndOfLineBuilder builder = EndOfLineBuilder.newInstance().setEndOfLines(LineReader.Constant.get(this));
if (posInclude) {
builder.setLineNumber(this.getLineNumber());
builder.setStartColumn(this.getStartColumn());
builder.setStartOffset(this.getStartOffset());
}
return (AEndOfLine) builder.buildEOL();
}
@Override
public final int hashCode() {
return super.hashCode();
}
@Override
public final boolean equals(final Object obj) {
return super.equals(obj);
}
}
public static enum EndOfLineTypes implements IRobotTokenType {
/**
*/
NON,
/**
*/
CR(VersionAvailabilityInfoBuilder.create().addRepresentation("\r").build()),
/**
*/
LF(VersionAvailabilityInfoBuilder.create().addRepresentation("\n").build()),
/**
*/
CRLF(VersionAvailabilityInfoBuilder.create().addRepresentation("\r\n").build()),
/**
*/
LFCR(VersionAvailabilityInfoBuilder.create().addRepresentation("\n\r").build()),
/**
*/
EOF;
private final List<String> text = new ArrayList<>(0);
private final List<VersionAvailabilityInfo> representation = new ArrayList<>(0);
private EndOfLineTypes(final VersionAvailabilityInfo... representations) {
for (final VersionAvailabilityInfo vInfo : representations) {
representation.add(vInfo);
text.add(vInfo.getRepresentation());
}
}
@Override
public List<String> getRepresentation() {
return text;
}
@Override
public List<VersionAvailabilityInfo> getVersionAvailabilityInfos() {
return representation;
}
@Override
public VersionAvailabilityInfo findVersionAvailablilityInfo(final String text) {
VersionAvailabilityInfo vaiResult = null;
for (final VersionAvailabilityInfo vai : representation) {
if (vai.getRepresentation().equals(text)) {
vaiResult = vai;
break;
}
}
return vaiResult;
}
}
}