/**
 * This file is part of pwt.
 *
 * pwt 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.
 *
 * pwt 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 pwt. If not,
 * see <http://www.gnu.org/licenses/>.
 */
package fr.putnami.pwt.core.editor.client.validator;

import com.google.gwt.regexp.shared.MatchResult;
import com.google.gwt.regexp.shared.RegExp;

import java.util.Collection;

public class PatternValidator<T> extends AbstractValidator<T> {

	private RegExp pattern;
	private String regexp;

	public PatternValidator(String message, String regexp) {
		super(message);
		String flagString = "";
		this.pattern = RegExp.compile(regexp, flagString);
		this.regexp = regexp;
	}

	@Override
	protected boolean isValid(T value) {
		if (value == null) {
			return true;
		}
		if (value instanceof String) {
			return this.regExMatch((String) value);
		}
		if (value instanceof Collection) {
			for (Object val : (Collection<?>) value) {
				if (!(val instanceof String)) {
					return false;
				}
				if (!this.regExMatch((String) val)) {
					return false;
				}
			}
			return true;
		}
		return false;
	}

	private boolean regExMatch(String value) {
		MatchResult match = this.pattern.exec(value);
		if (match == null) {
			return false;
		}
		return match.getGroup(0).length() == value.length();
	}

	@Override
	protected Object[] getParrameters() {
		return new Object[] {this.regexp};
	}

}