/**************************************************************************************************
* Copyright (c) 2014 Dennis Fischer. *
* All rights reserved. This program and the accompanying materials *
* are made available under the terms of the GNU Public License v3.0+ *
* which accompanies this distribution, and is available at *
* http://www.gnu.org/licenses/gpl.html *
* *
* Contributors: Dennis Fischer *
**************************************************************************************************/
package de.chaosfisch.google.youtube.upload.metadata;
import com.google.common.base.CharMatcher;
import com.google.common.base.Charsets;
import com.google.common.base.Splitter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public final class TagParser {
public static final char TAG_DELIMITER = ',';
private static final int MAX_TAG_LENGTH = 30;
private static final int MIN_TAG_LEGNTH = 2;
private static final int MAX_TAG_BODY_LENGTH = 500;
private TagParser() {
}
public static boolean areTagsValid(final List<String> tags) {
for (final String tag : tags) {
if (!isTagValid(tag)) {
return false;
}
}
return MAX_TAG_BODY_LENGTH >= getLength(tags);
}
private static boolean isTagValid(final String tag) {
final int byteLength = tag.getBytes(Charsets.UTF_8).length;
return MIN_TAG_LEGNTH <= byteLength && MAX_TAG_LENGTH >= byteLength && !(tag.contains("<") || tag.contains(">") || tag
.contains("\""));
}
public static List<String> parse(final String input) {
final List<String> tags = Splitter.on(TAG_DELIMITER).omitEmptyStrings().splitToList(input);
final List<String> result = new ArrayList<>(tags.size());
for (final String tag : tags) {
if (!result.contains(tag.trim())) {
result.add(tag.trim());
}
}
return result;
}
private static List<String> removeInvalid(final List<String> tags) {
final Iterator<String> tagIterator = tags.iterator();
while (tagIterator.hasNext()) {
final String tag = tagIterator.next();
if (!isTagValid(tag)) {
tagIterator.remove();
}
}
return tags;
}
public static List<String> parse(final String keywords, final boolean removeInvalid) {
if (removeInvalid) {
return removeInvalid(parse(keywords));
} else {
return parse(keywords);
}
}
public static int getLength(final List<String> tags) {
int length = 0;
for (final String tag : tags) {
length += tag.getBytes().length + 1;
if (CharMatcher.WHITESPACE.matchesAnyOf(tag)) {
length += 2;
}
}
return 0 == length ? 0 : length - 1;
}
}