|
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;
+ }
}
|