From: <jbo...@li...> - 2006-07-10 16:23:03
|
Author: szimano Date: 2006-07-10 12:22:58 -0400 (Mon, 10 Jul 2006) New Revision: 4966 Added: labs/shotoku/trunk/shotoku-tags/src/java/org/jboss/shotoku/tags/TagSearch.java Modified: labs/shotoku/trunk/shotoku-tags/src/java/org/jboss/shotoku/tags/TagService.java labs/shotoku/trunk/shotoku-tags/src/java/org/jboss/shotoku/tags/service/TagServiceImpl.java Log: shotoku search JBSHOTOKU-86 Added: labs/shotoku/trunk/shotoku-tags/src/java/org/jboss/shotoku/tags/TagSearch.java =================================================================== --- labs/shotoku/trunk/shotoku-tags/src/java/org/jboss/shotoku/tags/TagSearch.java 2006-07-10 14:46:53 UTC (rev 4965) +++ labs/shotoku/trunk/shotoku-tags/src/java/org/jboss/shotoku/tags/TagSearch.java 2006-07-10 16:22:58 UTC (rev 4966) @@ -0,0 +1,131 @@ +package org.jboss.shotoku.tags; + +import java.util.StringTokenizer; +import java.util.Vector; + +public class TagSearch { + Vector<String> tagRequestTokens; + + Vector<String> tagForbiddenTokens; + + Vector<String> tagRequiredTokens; + + Vector<String> authorRequestTokens; + + Vector<String> authorForbiddenTokens; + + Vector<String> authorRequiredTokens; + + Vector<String> keywordRequestTokens; + + Vector<String> keywordForbiddenTokens; + + Vector<String> keywordRequiredTokens; + + /** + * Construtor for search. Use nulls or zero length strings if you don't want some of the rules to + * be checked. + * + * @param tagString + * @param authorString + * @param keywordString + */ + public TagSearch(String tagString, String authorString, String keywordString) { + tokenizeString(tagString, tagRequiredTokens, tagForbiddenTokens, + tagRequestTokens); + + tokenizeString(authorString, authorRequiredTokens, + authorForbiddenTokens, authorRequestTokens); + + tokenizeString(keywordString, keywordRequiredTokens, + keywordForbiddenTokens, keywordRequestTokens); + } + + public void tokenizeString(String query, Vector<String> requiredTokens, + Vector<String> forbiddenTokens, Vector<String> requestTokens) { + + if (query != null && query.length() > 0) { + requiredTokens = new Vector<String>(); + forbiddenTokens = new Vector<String>(); + requestTokens = new Vector<String>(); + } else { + return; + } + + StringTokenizer st = new StringTokenizer(query, " \t,"); + + // + // Parse incoming search string + // + + while (st.hasMoreTokens()) { + String token = st.nextToken().toLowerCase(); + + switch (token.charAt(0)) { + case '+': + token = token.substring(1); + requiredTokens.add(token); + break; + + case '-': + token = token.substring(1); + forbiddenTokens.add(token); + break; + + default: + requestTokens.add(token); + break; + } + } + } + + public boolean matches(Tag tag) { + + return matchTokens(tag.getAuthor(), authorRequiredTokens, + authorForbiddenTokens, authorRequestTokens) + && matchTokens(tag.getName(), tagRequiredTokens, + tagForbiddenTokens, tagRequestTokens) + && matchTokens(tag.getData(), keywordRequiredTokens, + keywordForbiddenTokens, keywordRequestTokens); + } + + private boolean matchTokens(String content, Vector<String> requiredTokens, + Vector<String> forbiddenTokens, Vector<String> requestTokens) { + + if (requestTokens == null) { + return true; + } + + for (int i = 0; i < forbiddenTokens.size(); i++) { + if (content.indexOf(forbiddenTokens.get(i)) != -1) { + // there is forbidden token - return 0 + return false; + } + } + + for (int i = 0; i < requiredTokens.size(); i++) { + if (content.indexOf(requiredTokens.get(i)) == -1) { + // lack of one of the required tokens - return 0 + return false; + } + } + + /* + * if (requiredTokens.size() > 0) { // there is at least one requirted + * token and it has been found return true; } + */ + + for (int i = 0; i < requestTokens.size(); i++) { + int fromIndex = -1; + + while ((fromIndex = content.indexOf(requestTokens.get(i), + fromIndex + 1)) != -1) { + // found at least one required token + return true; + } + } + + // nothing found + return false; + } +} Modified: labs/shotoku/trunk/shotoku-tags/src/java/org/jboss/shotoku/tags/TagService.java =================================================================== --- labs/shotoku/trunk/shotoku-tags/src/java/org/jboss/shotoku/tags/TagService.java 2006-07-10 14:46:53 UTC (rev 4965) +++ labs/shotoku/trunk/shotoku-tags/src/java/org/jboss/shotoku/tags/TagService.java 2006-07-10 16:22:58 UTC (rev 4966) @@ -40,9 +40,23 @@ */ public String getFeedLink(FeedType feedType, List<String> dataList, String type); - /**Gets all the tags. + /**Gets all the tag names. * @return Tag list * @throws TagGetException */ - public List<String> getAllTags() throws TagGetException; + public List<String> getAllTagsNames() throws TagGetException; + + /**Gets all the tags + * @return Tag list + * @throws TagGetException + */ + public List<Tag> getAllTags() throws TagGetException; + + /** + * @param tag String query for tags + * @param author String query for authors + * @param keyword String query for keyword (searches thru description) + * @return List of matching tags + */ + public List<Tag> searchTags(String tag, String author, String keyword); } Modified: labs/shotoku/trunk/shotoku-tags/src/java/org/jboss/shotoku/tags/service/TagServiceImpl.java =================================================================== --- labs/shotoku/trunk/shotoku-tags/src/java/org/jboss/shotoku/tags/service/TagServiceImpl.java 2006-07-10 14:46:53 UTC (rev 4965) +++ labs/shotoku/trunk/shotoku-tags/src/java/org/jboss/shotoku/tags/service/TagServiceImpl.java 2006-07-10 16:22:58 UTC (rev 4966) @@ -358,10 +358,38 @@ } } - public List<String> getAllTags() throws TagGetException { + public List<String> getAllTagsNames() throws TagGetException { List<String> result = manager.createQuery("SELECT DISTINCT name FROM TagEntity") .getResultList(); return result; } + + public List<Tag> getAllTags() throws TagGetException { + List<Tag> result = manager.createQuery("SELECT * FROM TagEntity") + .getResultList(); + + return result; + } + + public List<Tag> searchTags(String tag, String author, String keyword) { + List<Tag> searchResult = new ArrayList<Tag>(); + + TagSearch tagSearch = new TagSearch(tag, author, keyword); + + try { + List<Tag> allTags = getAllTags(); + + for (Tag nextTag : allTags) { + if (tagSearch.matches(nextTag)) { + searchResult.add(nextTag); + } + } + } catch (TagGetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return searchResult; + } } |