com.octo.captcha.image.fisheye.FishEye Maven / Gradle / Ivy
/*
* JCaptcha, the open source java framework for captcha definition and integration
* Copyright (c) 2007 jcaptcha.net. All Rights Reserved.
* See the LICENSE.txt file distributed with this package.
*/
package com.octo.captcha.image.fisheye;
import com.octo.captcha.image.ImageCaptcha;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.StringTokenizer;
/**
* FishEye is an ImageCaptcha
*
* - Challenge type : image
* - Response type : a point position, in pixels from the bottom left, can be
* : a String with two numbers separated with a comma or a java.awt.Point
* - Description : An image of a distorded picture. User have to point the
* center of the deformation and to submit it.
*
*
* @author Marc-Antoine Garrigue
* @version 1.0
*/
public class FishEye extends ImageCaptcha {
/**
*
*/
private static final long serialVersionUID = 1L;
private Point deformationCenter;
private Integer tolerance;
/**
* @param question
* the question
* @param challenge
* the imageChallenge
* @param deformationCenter
* the center of the deformation that has been applied to the
* image in order to validate the answer
* @param tolerance
* the max distance to the center of the deformation accepted by
* the validation routine in pixels.
*/
protected FishEye(String question, BufferedImage challenge, Point deformationCenter, Integer tolerance) {
super(question, challenge);
this.deformationCenter = deformationCenter;
this.tolerance = tolerance;
}
/**
* Validation routine for the response.
*
* @param response
* to the question concerning the chalenge
*
* @return true if the answer is correct, false otherwise.
*/
public Boolean validateResponse(Object response) {
// if a point go
if (response instanceof Point) {
Point point = (Point) response;
return validateResponse(point);
// else if string response
}
else if (response instanceof String) {
String s = (String) response;
// ty to parse it
try {
// String[] coordonates = new String[2];
StringTokenizer token = new StringTokenizer(s, ",");
Point point = new Point(Integer.parseInt(token.nextToken()), Integer.parseInt(token.nextToken()));
return validateResponse(point);
}
catch (Throwable e) {
// catch all and return false
return Boolean.FALSE;
}
}
else {
return Boolean.FALSE;
}
}
/**
* Real validation
*
* @param point
* the given point
*
* @return true if distance from the given point and the deformation center
* is less than tolerance, false otherwise
*/
private Boolean validateResponse(Point point) {
if (point.distance(deformationCenter) <= tolerance.doubleValue()) {
return Boolean.TRUE;
}
return Boolean.FALSE;
}
}