KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > mvnforum > common > MVNCaptchaService


1 /*
2  * $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/common/MVNCaptchaService.java,v 1.7 2006/04/14 17:05:26 minhnn Exp $
3  * $Author: minhnn $
4  * $Revision: 1.7 $
5  * $Date: 2006/04/14 17:05:26 $
6  *
7  * ====================================================================
8  *
9  * Copyright (C) 2002-2006 by MyVietnam.net
10  *
11  * All copyright notices regarding mvnForum MUST remain
12  * intact in the scripts and in the outputted HTML.
13  * The "powered by" text/logo with a link back to
14  * http://www.mvnForum.com and http://www.MyVietnam.net in
15  * the footer of the pages MUST remain visible when the pages
16  * are viewed on the internet or intranet.
17  *
18  * This program is free software; you can redistribute it and/or modify
19  * it under the terms of the GNU General Public License as published by
20  * the Free Software Foundation; either version 2 of the License, or
21  * any later version.
22  *
23  * This program is distributed in the hope that it will be useful,
24  * but WITHOUT ANY WARRANTY; without even the implied warranty of
25  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26  * GNU General Public License for more details.
27  *
28  * You should have received a copy of the GNU General Public License
29  * along with this program; if not, write to the Free Software
30  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31  *
32  * Support can be obtained from support forums at:
33  * http://www.mvnForum.com/mvnforum/index
34  *
35  * Correspondence and Marketing Questions can be sent to:
36  * info at MyVietnam net
37  *
38  * @author: Minh Nguyen
39  * @author: Mai Nguyen
40  */

41 package com.mvnforum.common;
42
43 import java.awt.Color JavaDoc;
44 import java.awt.image.BufferedImage JavaDoc;
45 import java.io.IOException JavaDoc;
46 import java.io.OutputStream JavaDoc;
47 import java.util.ArrayList JavaDoc;
48 import java.util.Iterator JavaDoc;
49
50 import javax.servlet.http.HttpServletRequest JavaDoc;
51 import javax.servlet.http.HttpServletResponse JavaDoc;
52
53 import com.mvnforum.auth.AuthenticationException;
54 import com.mvnforum.auth.OnlineUserManager;
55 import com.octo.captcha.component.image.backgroundgenerator.*;
56 import com.octo.captcha.component.image.fontgenerator.FontGenerator;
57 import com.octo.captcha.component.image.fontgenerator.TwistedAndShearedRandomFontGenerator;
58 import com.octo.captcha.component.image.textpaster.*;
59 import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage;
60 import com.octo.captcha.component.image.wordtoimage.WordToImage;
61 import com.octo.captcha.component.wordgenerator.RandomWordGenerator;
62 import com.octo.captcha.component.wordgenerator.WordGenerator;
63 import com.octo.captcha.engine.image.ListImageCaptchaEngine;
64 import com.octo.captcha.image.ImageCaptchaFactory;
65 import com.octo.captcha.image.gimpy.GimpyFactory;
66 import com.sun.image.codec.jpeg.JPEGCodec;
67 import com.sun.image.codec.jpeg.JPEGImageEncoder;
68 import net.myvietnam.mvncore.exception.AssertionException;
69 import net.myvietnam.mvncore.exception.DatabaseException;
70
71 public class MVNCaptchaService extends ListImageCaptchaEngine {
72
73     private static final Integer JavaDoc MIN_WORD_LENGTH = new Integer JavaDoc(6);
74
75     private static final Integer JavaDoc MAX_WORD_LENGTH = new Integer JavaDoc(8);
76
77     private static final Integer JavaDoc IMAGE_WIDTH = new Integer JavaDoc(380);
78
79     private static final Integer JavaDoc IMAGE_HEIGHT = new Integer JavaDoc(80);
80
81     private static final Integer JavaDoc MIN_FONT_SIZE = new Integer JavaDoc(44);
82
83     private static final Integer JavaDoc MAX_FONT_SIZE = new Integer JavaDoc(50);
84
85     private static final String JavaDoc NUMERIC_CHARS = "123456789";// No numeric 0
86

87     private static final String JavaDoc UPPER_ASCII_CHARS= "ABCDEFGHJKLMNPQRSTUVWXYZ";// No upper O I
88

89     // we dont use the lower characters because it cause dificult in some case, so that
90
// we must always UPPERCASE the input from user (currently in OnlineUserImpl)
91
//private static final String LOWER_ASCII_CHARS= "abcdefghjklmnpqrstuvwxyz";// No lower o i
92

93     /**
94      * Singleton instance of this class
95      */

96     private static MVNCaptchaService instance = new MVNCaptchaService();
97
98     private ArrayList JavaDoc textPasterList;
99
100     private ArrayList JavaDoc backgroundGeneratorList;
101
102     private ArrayList JavaDoc fontGeneratorList;
103
104     /**
105      * Private constructor to prevent instantiation
106      */

107     private MVNCaptchaService() {
108     }
109
110     public static MVNCaptchaService getInstance() {
111         return instance;
112     }
113
114     protected void buildInitialFactories() {
115         textPasterList = new ArrayList JavaDoc();
116         backgroundGeneratorList = new ArrayList JavaDoc();
117         fontGeneratorList = new ArrayList JavaDoc();
118
119         textPasterList.add(new SimpleTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, Color.green));
120         textPasterList.add(new RandomTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, Color.green));
121         textPasterList.add(new SimpleTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, Color.red));
122         textPasterList.add(new RandomTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, Color.red));
123         textPasterList.add(new SimpleTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, Color.blue));
124         textPasterList.add(new RandomTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, Color.blue));
125
126         backgroundGeneratorList.add(new EllipseBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT));
127         backgroundGeneratorList.add(new UniColorBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT));
128         backgroundGeneratorList.add(new MultipleShapeBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT));
129         backgroundGeneratorList.add(new FunkyBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT));
130         backgroundGeneratorList.add(new GradientBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, Color.white, Color.black));
131         backgroundGeneratorList.add(new GradientBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, Color.black, Color.white));
132         backgroundGeneratorList.add(new GradientBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, Color.orange, Color.magenta));
133         /*
134         try {
135             // minhnn: In Resin, it loads as 'C:\soft\resin-3.0.8\file:\C:\soft\resin-3.0.8\webapps\mvnforum\WEB-INF\lib\jcaptcha-engine-1.0-RC1.jar!\gimpybackgrounds'
136             // so it cannot load this directory, I guess this is Resin bugs
137             //backgroundGeneratorList.add(new FileReaderRandomBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, "/gimpybackgrounds/"));
138         } catch (CaptchaException ex) {
139             // should use common-logging
140             // Cannot call this because of NPE (dont know why): ex.printStackTrace();
141         }*/

142
143         fontGeneratorList.add(new TwistedAndShearedRandomFontGenerator(MIN_FONT_SIZE, MAX_FONT_SIZE));
144         //fontGeneratorList.add(new TwistedRandomFontGenerator(MIN_FONT_SIZE, MAX_FONT_SIZE));// link character too much
145
//fontGeneratorList.add(new RandomFontGenerator(MIN_FONT_SIZE, MAX_FONT_SIZE));// to easy to read
146
//fontGeneratorList.add(new DeformedRandomFontGenerator(MIN_FONT_SIZE, MAX_FONT_SIZE));// to small font
147

148         // no char upper O, char lower o and numerric 0 because user cannot answer
149
WordGenerator words = new RandomWordGenerator(NUMERIC_CHARS + UPPER_ASCII_CHARS);
150
151         for (Iterator JavaDoc fontIter = fontGeneratorList.iterator(); fontIter.hasNext(); ) {
152             FontGenerator font = (FontGenerator)fontIter.next();
153             for (Iterator JavaDoc backIter = backgroundGeneratorList.iterator(); backIter.hasNext(); ) {
154                 BackgroundGenerator back = (BackgroundGenerator)backIter.next();
155                 for (Iterator JavaDoc textIter = textPasterList.iterator(); textIter.hasNext(); ) {
156                     TextPaster parser = (TextPaster)textIter.next();
157
158                     WordToImage word2image = new ComposedWordToImage(font, back, parser);
159                     ImageCaptchaFactory factory = new GimpyFactory(words, word2image);
160                     addFactory(factory);
161                 }
162             }
163         }
164     }
165
166     /**
167      * Write the captcha image of current user to the servlet response
168      *
169      * @param request HttpServletRequest
170      * @param response HttpServletResponse
171      * @throws IOException
172      */

173     public void writeCaptchaImage(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
174         throws IOException JavaDoc, AssertionException, DatabaseException, AuthenticationException {
175
176         BufferedImage JavaDoc image = OnlineUserManager.getInstance().getOnlineUser(request).getCurrentCaptchaImage();
177         if (image == null) {
178             return;
179         }
180
181         OutputStream JavaDoc outputStream = null;
182         try {
183             outputStream = response.getOutputStream();
184             response.setContentType("image/jpeg");
185
186             JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream);
187             encoder.encode(image);
188
189             outputStream.flush();
190             outputStream.close();
191             outputStream = null;// no close twice
192
} catch (IOException JavaDoc ex) {
193             throw ex;
194         } finally {
195             if (outputStream != null) {
196                 try {
197                     outputStream.close();
198                 } catch (IOException JavaDoc ex) { }
199             }
200         }
201     }
202
203     /*
204     public void writeTestCaptchaImage(HttpServletRequest request, HttpServletResponse response)
205         throws IOException {
206
207         ImageCaptcha imageCaptcha = getNextImageCaptcha();
208         BufferedImage image = (BufferedImage)imageCaptcha.getChallenge();
209
210         OutputStream outputStream = null;
211         try {
212             outputStream = response.getOutputStream();
213             response.setContentType("image/jpeg");
214
215             JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream);
216             encoder.encode(image);
217
218             outputStream.flush();
219             outputStream.close();
220             outputStream = null;// no close twice
221         } catch (IOException ex) {
222             throw ex;
223         } finally {
224             if (outputStream != null) {
225                 try {
226                     outputStream.close();
227                 } catch (IOException ex) { }
228             }
229             imageCaptcha.disposeChallenge();
230         }
231     }
232
233     private void testCaptchaImage(String folder) {
234         if (folder == null) {
235             folder = "c:\\";
236         }
237         if (folder.endsWith("\\") == false) {
238             folder = folder + "\\";
239         }
240
241         WordGenerator words = new RandomWordGenerator("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
242
243         for (Iterator fontIter = fontGeneratorList.iterator(); fontIter.hasNext(); ) {
244             FontGenerator font = (FontGenerator)fontIter.next();
245             for (Iterator backIter = backgroundGeneratorList.iterator(); backIter.hasNext(); ) {
246                 BackgroundGenerator back = (BackgroundGenerator)backIter.next();
247                 for (Iterator textIter = textPasterList.iterator(); textIter.hasNext(); ) {
248                     TextPaster parser = (TextPaster)textIter.next();
249
250                     WordToImage word2image = new ComposedWordToImage(font, back, parser);
251                     ImageCaptchaFactory factory = new GimpyFactory(words, word2image);
252
253                     ImageCaptcha imageCaptcha = factory.getImageCaptcha();
254                     String filename = "TestCaptcha_" + getClassName(font) + "_" + getClassName(back) + "_" + getClassName(parser) + ".jpg";
255                     try {
256                         ImageUtil.writeJpegImage_Sun((BufferedImage) imageCaptcha.getChallenge(), folder + filename);
257                     } catch (IOException ex) {
258                         ex.printStackTrace();
259                         return;
260                     }
261                 }
262             }
263         }
264     }
265
266     private String getClassName(Object obj) {
267         String fullName = obj.getClass().getName();
268         int dotIndex = fullName.lastIndexOf('.');
269         if (dotIndex == -1) {
270             return fullName;
271         }
272         return fullName.substring(dotIndex + 1);
273     }
274
275     public static void main(String[] args) throws IOException {
276         MVNCaptchaService.getInstance().testCaptchaImage("c:\\temp\\testcaptcha");
277     }
278     */

279 }
280
Popular Tags