/**************************************************************************
OmegaT - Computer Assisted Translation (CAT) tool
with fuzzy matching, translation memory, keyword search,
glossaries, and translation leveraging into updated projects.
Copyright (C) 2016 Chihiro Hio, Aaron Madlon-Kay
Home page: http://www.omegat.org/
Support center: http://groups.yahoo.com/group/OmegaT/
This file is part of OmegaT.
OmegaT is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OmegaT 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
**************************************************************************/
package org.omegat.externalfinder.item;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.regex.Pattern;
import org.omegat.util.OStrings;
/**
* A data class representing an ExternalFinder "command". Immutable. Optionally
* use {@link Builder} to construct.
*/
public class ExternalFinderItemCommand {
private final String command;
private final ExternalFinderItem.TARGET target;
private final ExternalFinderItem.ENCODING encoding;
private final String delimiter;
public ExternalFinderItemCommand(String command, ExternalFinderItem.TARGET target, ExternalFinderItem.ENCODING encoding, String delimiter) {
this.command = command;
this.target = target;
this.encoding = encoding;
this.delimiter = delimiter;
}
public String getCommand() {
return command;
}
public ExternalFinderItem.TARGET getTarget() {
return target;
}
public ExternalFinderItem.ENCODING getEncoding() {
return encoding;
}
public String getDelimiter() {
return delimiter;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((command == null) ? 0 : command.hashCode());
result = prime * result + ((delimiter == null) ? 0 : delimiter.hashCode());
result = prime * result + ((encoding == null) ? 0 : encoding.hashCode());
result = prime * result + ((target == null) ? 0 : target.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
ExternalFinderItemCommand other = (ExternalFinderItemCommand) obj;
if (command == null) {
if (other.command != null) {
return false;
}
} else if (!command.equals(other.command)) {
return false;
}
if (delimiter == null) {
if (other.delimiter != null) {
return false;
}
} else if (!delimiter.equals(other.delimiter)) {
return false;
}
if (encoding != other.encoding) {
return false;
}
if (target != other.target) {
return false;
}
return true;
}
public final String[] generateCommand(String findingWords) throws UnsupportedEncodingException {
return generateCommand(command, delimiter, encoding, findingWords);
}
private static final String[] generateCommand(String command, String delimiter,
ExternalFinderItem.ENCODING encoding, String findingWords) throws UnsupportedEncodingException {
String encodedWords;
if (encoding == ExternalFinderItem.ENCODING.NONE) {
encodedWords = findingWords;
} else {
encodedWords = URLEncoder.encode(findingWords, StandardCharsets.UTF_8.name());
if (encoding == ExternalFinderItem.ENCODING.ESCAPE) {
encodedWords = encodedWords.replace("+", "%20");
}
}
String[] ret = command.split(Pattern.quote(delimiter));
for (int i = 0; i < ret.length; i++) {
String s = ret[i];
ret[i] = s.replace(ExternalFinderItem.PLACEHOLDER_TARGET, encodedWords);
}
return ret;
}
public static class Builder {
private String command;
private ExternalFinderItem.TARGET target = ExternalFinderItem.TARGET.BOTH;
private ExternalFinderItem.ENCODING encoding = ExternalFinderItem.ENCODING.NONE;
private String delimiter = "|";
public static Builder from(ExternalFinderItemCommand item) {
return new Builder().setCommand(item.getCommand()).setTarget(item.getTarget())
.setEncoding(item.getEncoding()).setDelimiter(item.getDelimiter());
}
public Builder setCommand(String command) {
this.command = command;
return this;
}
public String getCommand() {
return command;
}
public Builder setTarget(ExternalFinderItem.TARGET target) {
this.target = target;
return this;
}
public ExternalFinderItem.TARGET getTarget() {
return target;
}
public Builder setEncoding(ExternalFinderItem.ENCODING encoding) {
this.encoding = encoding;
return this;
}
public ExternalFinderItem.ENCODING getEncoding() {
return encoding;
}
public Builder setDelimiter(String delimiter) {
this.delimiter = delimiter;
return this;
}
public String getDelimiter() {
return delimiter;
}
public ExternalFinderItemCommand build() throws ExternalFinderValidationException {
validate();
return new ExternalFinderItemCommand(command, target, encoding, delimiter);
}
/**
* Check the current builder parameters to see if they constitute a valid command.
*
* @return A sample array of arguments illustrating what the output will look like
* @throws ExternalFinderValidationException
* If any parameter is not valid
*/
public String[] validate() throws ExternalFinderValidationException {
if (command == null) {
throw new ExternalFinderValidationException(
OStrings.getString("EXTERNALFINDER_COMMAND_ERROR_NOCOMMAND"));
}
if (!command.contains(ExternalFinderItem.PLACEHOLDER_TARGET)) {
throw new ExternalFinderValidationException(OStrings.getString(
"EXTERNALFINDER_COMMAND_ERROR_NOTOKEN", ExternalFinderItem.PLACEHOLDER_TARGET));
}
if (target == null) {
throw new ExternalFinderValidationException(
OStrings.getString("EXTERNALFINDER_COMMAND_ERROR_NOTARGET"));
}
if (encoding == null) {
throw new ExternalFinderValidationException(
OStrings.getString("EXTERNALFINDER_COMMAND_ERROR_NOENCODING"));
}
if (delimiter == null) {
throw new ExternalFinderValidationException(
OStrings.getString("EXTERNALFINDER_COMMAND_ERROR_NODELIMITER"));
}
if (delimiter.isEmpty()) {
throw new ExternalFinderValidationException(
OStrings.getString("EXTERNALFINDER_COMMAND_ERROR_DELIMITEREMPTY"));
}
try {
return generateSampleCommand();
} catch (Throwable e) {
throw new ExternalFinderValidationException(e);
}
}
public String[] generateSampleCommand() throws UnsupportedEncodingException {
String findingWords = target == ExternalFinderItem.TARGET.NON_ASCII_ONLY
? "f\u00f8\u00f8 b\u00e5r" : "foo bar";
return generateCommand(command, delimiter, encoding, findingWords);
}
}
}