Bow-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 617 discussions
r313 - in trunk/bow-ui/src/main: java/org/chorem/bow java/org/chorem/bow/action java/org/chorem/bow/action/admin java/org/chorem/bow/action/bookmark java/org/chorem/bow/action/login java/org/chorem/bow/action/preference resources resources/i18n resources/org/chorem/bow/action resources/org/chorem/bow/action/preference webapp/jsp webapp/jsp/inc
by bpoussin@users.chorem.org 20 Aug '11
by bpoussin@users.chorem.org 20 Aug '11
20 Aug '11
Author: bpoussin
Date: 2011-08-20 02:51:36 +0200 (Sat, 20 Aug 2011)
New Revision: 313
Url: http://chorem.org/repositories/revision/bow/313
Log:
Evolution #438: Refactore source code and simplify all
- refactore import/export
- refactore pref action
- repackage des actions
- spliter preferenceAction en plusieurs action (INPUT, user, site, tag, import)
- ajout d'une form pour recherche sur le web
- modif du header des jsp pour utiliser <%-- au lieu de <!--
Added:
trunk/bow-ui/src/main/java/org/chorem/bow/action/admin/
trunk/bow-ui/src/main/java/org/chorem/bow/action/admin/MigrateDataAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/admin/ReIndexationAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/
trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/AddOrUpdateAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/DeleteSearchResultsAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/EditAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/HomeAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/RemoveAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/login/
trunk/bow-ui/src/main/java/org/chorem/bow/action/login/ForgotPasswordAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/login/LoginAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/login/LogoutAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/login/RegisterAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/
trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/AdminTagAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/DeleteImportAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/ExportBookmarksAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/GenerateTokenAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/ImportBookmarksAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/PreferenceBaseAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/UpdateSiteAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/UpdateUserAction.java
trunk/bow-ui/src/main/resources/org/chorem/bow/action/preference/
trunk/bow-ui/src/main/resources/org/chorem/bow/action/preference/UpdateUserAction-validation.xml
Removed:
trunk/bow-ui/src/main/java/org/chorem/bow/action/AddUrlAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteImportAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/EditBookmarkAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/GenerateTokenAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/HomeAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/LoginAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/LogoutAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/MigrateDataAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/ReIndexationAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/RegisterAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/RemoveBookmarkAction.java
Modified:
trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java
trunk/bow-ui/src/main/java/org/chorem/bow/BowSearchResult.java
trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/BowBaseAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java
trunk/bow-ui/src/main/resources/i18n/bow-ui_en_GB.properties
trunk/bow-ui/src/main/resources/i18n/bow-ui_fr_FR.properties
trunk/bow-ui/src/main/resources/struts.xml
trunk/bow-ui/src/main/webapp/jsp/admin.jsp
trunk/bow-ui/src/main/webapp/jsp/editBookmark.jsp
trunk/bow-ui/src/main/webapp/jsp/error.jsp
trunk/bow-ui/src/main/webapp/jsp/forgotPassword.jsp
trunk/bow-ui/src/main/webapp/jsp/home.jsp
trunk/bow-ui/src/main/webapp/jsp/inc/bookmark.jsp
trunk/bow-ui/src/main/webapp/jsp/inc/footer.jsp
trunk/bow-ui/src/main/webapp/jsp/inc/header.jsp
trunk/bow-ui/src/main/webapp/jsp/inc/rightMenu.jsp
trunk/bow-ui/src/main/webapp/jsp/inc/tagsCloud.jsp
trunk/bow-ui/src/main/webapp/jsp/login.jsp
trunk/bow-ui/src/main/webapp/jsp/permanentXml.jsp
trunk/bow-ui/src/main/webapp/jsp/preferences.jsp
trunk/bow-ui/src/main/webapp/jsp/register.jsp
trunk/bow-ui/src/main/webapp/jsp/suggestions.jsp
trunk/bow-ui/src/main/webapp/jsp/temporaryXml.jsp
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -23,11 +23,7 @@
*/
package org.chorem.bow;
-import java.text.ParseException;
import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
@@ -37,9 +33,6 @@
import org.nuiton.util.StringUtil;
import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.FacetTopic;
-import org.nuiton.wikitty.WikittyProxy;
-import org.nuiton.wikitty.search.operators.Element;
import org.nuiton.wikitty.search.Search;
public class BookmarkUtils {
@@ -58,13 +51,8 @@
return search;
}
- static public Criteria getBookmarkListCriteriaByUser(BowUser user) {
- Criteria criteria = getBookmarkListCriteriaByUser(user, null, null, null);
- return criteria;
- }
-
static public Criteria getBookmarkListCriteriaByUser(
- BowUser user, String searchLine, String fullTextLine, String order) {
+ BowUser user, String tagLine, String fullTextLine, String order) {
Search search = Search.query();
BookmarkUtils.addEqUser(search, user.getWikittyId());
@@ -72,8 +60,8 @@
search.keyword(fullTextLine);
}
- if (StringUtils.isNotBlank(searchLine)) {
- Set<String> tags = BowUtils.getWords(searchLine);
+ if (StringUtils.isNotBlank(tagLine)) {
+ Set<String> tags = BowUtils.getWords(tagLine);
search.eq(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS, tags);
}
@@ -116,29 +104,6 @@
return criteria;
}
- static public Map<String, Integer> getBookmarksByImportDate(BowSession session, BowUser user) throws ParseException {
- WikittyProxy proxy = session.getProxy();
- Criteria criteria = Search.query()
- .eq(Element.ELT_EXTENSION, BowImport.EXT_BOWIMPORT)
- .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, user.getWikittyId()).criteria()
- .addFacetField(BowImport.FQ_FIELD_BOWIMPORT_IMPORTDATE)
- .setFirstIndex(0).setEndIndex(0);
-
- List<FacetTopic> bookmarksImportDate =
- proxy.findAllByCriteria(BowImport.class, criteria)
- .getTopic(BowImport.FQ_FIELD_BOWIMPORT_IMPORTDATE);
-
- // Extract imports
- Map<String, Integer> result = new HashMap<String, Integer>();
- for (FacetTopic facet : bookmarksImportDate) {
- String dateAsString = facet.getTopicName();
-
- result.put(dateAsString, facet.getCount());
- }
-
- return result;
- }
-
/**
* @param url String which contains the bookmark url
* @param nameAndTags String which contains the name and the tags of the
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowSearchResult.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowSearchResult.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowSearchResult.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -55,7 +55,7 @@
private static final Log log = LogFactory.getLog(BowSearchResult.class);
/** la ligne contenant les tags a rechercher */
- protected String searchLine;
+ protected String tagLine;
/** la ligne contenant le fulltext a recherche */
protected String fullTextLine;
/** l'ordre souhaite pour l'affichage */
@@ -73,13 +73,13 @@
*
* @param session la session de l'utilisateur sur lequel on peut recuperer
* le proxy et les preferences
- * @param searchLine (optionel) le liste des tags a rechercher
+ * @param tagLine (optionel) le liste des tags a rechercher
* @param fullTextLine (optionel) la chaine fulltext a rechercher
* @param order (optionnel) l'ordre d'affichage du resultat
*/
public BowSearchResult(BowSession session,
- String searchLine, String fullTextLine, String order) {
- this.searchLine = StringUtils.defaultString(searchLine);
+ String tagLine, String fullTextLine, String order) {
+ this.tagLine = StringUtils.defaultString(tagLine);
this.fullTextLine = StringUtils.defaultString(fullTextLine);
this.order = StringUtils.defaultString(order);
@@ -87,7 +87,7 @@
BowProxy proxy = session.getProxy();
Criteria criteria = BookmarkUtils.getBookmarkListCriteriaByUser(
- user, searchLine, fullTextLine, order);
+ user, tagLine, fullTextLine, order);
PagedResult<BowBookmark> result =
proxy.findAllByCriteria(BowBookmark.class, criteria);
@@ -115,7 +115,7 @@
// on ne met pas dans le cloud les tags qui ont servi pour la recherche
List<FacetTopic> save = new ArrayList<FacetTopic>(tagsCloud);
// on recupere les tags dans un set pour optimiser la recherche
- Set<String> tagsSearch = BowUtils.getWords(getSearchLine());
+ Set<String> tagsSearch = BowUtils.getWords(gettagLine());
for(Iterator<FacetTopic> i=tagsCloud.iterator(); i.hasNext();) {
FacetTopic topic = i.next();
@@ -143,8 +143,8 @@
}
}
- public String getSearchLine() {
- return searchLine;
+ public String gettagLine() {
+ return tagLine;
}
public int getFont(int ti) {
@@ -163,7 +163,7 @@
}
public Set<String> getTagsSearch() {
- return BowUtils.getWords(getSearchLine());
+ return BowUtils.getWords(gettagLine());
}
public List<BowBookmark> getBookmarks() {
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -136,21 +136,21 @@
/**
* Redirects the user either on the home page or on the search page
*
- * @param searchLine search line
+ * @param tagLine search line
* @param fullTextLine full text search
* @return the page where the user will be redirected
*/
- static public String redirectTo(String searchLine, String fullTextLine) {
+ static public String redirectTo(String tagLine, String fullTextLine) {
String result = "home.action";
- boolean searchLineNotBlank = StringUtils.isNotBlank(searchLine);
+ boolean tagLineNotBlank = StringUtils.isNotBlank(tagLine);
boolean fullTextLineNotBlank = StringUtils.isNotBlank(fullTextLine);
- if (searchLineNotBlank || fullTextLineNotBlank) {
+ if (tagLineNotBlank || fullTextLineNotBlank) {
result += "?";
- if (searchLineNotBlank) {
- result += "searchLine=" + searchLine;
+ if (tagLineNotBlank) {
+ result += "tagLine=" + tagLine;
}
- if (searchLineNotBlank && fullTextLineNotBlank) {
+ if (tagLineNotBlank && fullTextLineNotBlank) {
result += "&";
}
if (fullTextLineNotBlank) {
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/AddUrlAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/AddUrlAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/AddUrlAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,262 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import org.apache.commons.lang.StringUtils;
-import org.chorem.bow.BookmarkUtils;
-import org.chorem.bow.BowBookmark;
-import org.chorem.bow.BowUser;
-import org.chorem.bow.BowUtils;
-import org.nuiton.wikitty.WikittyProxy;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.PagedResult;
-import org.nuiton.wikitty.search.Search;
-
-/**
- * Ajoute ou modifie un bookmark, soit par le formulaire,
- * soit par un appel javascript
- *
- * @author poussin
- */
-public class AddUrlAction extends BowBaseAction {
-
- private static final long serialVersionUID = 3389170166034184139L;
-
- protected String bookmarkId;
- protected String link;
- protected String name;
- protected String privateAlias;
- protected String publicAlias;
- protected String tags;
- protected String nameAndTags;
- protected String redirectTo;
-
- public String getBookmarkId() {
- return bookmarkId;
- }
-
- public void setBookmarkId(String bookmarkId) {
- this.bookmarkId = bookmarkId;
- }
-
- /**
- * @return the link
- */
- public String getLink() {
- return link;
- }
-
- /**
- * @param link the link to set
- */
- public void setLink(String link) {
- this.link = link;
- }
-
- /**
- * @return the description
- */
- public String getName() {
- return name;
- }
-
- /**
- * @param name the description to set
- */
- public void setName(String name) {
- this.name = name;
- }
-
- /**
- * @return the privateAlias
- */
- public String getPrivateAlias() {
- return privateAlias;
- }
-
- /**
- * @param alias the privateAlias to set
- */
- public void setPrivateAlias(String alias) {
- this.privateAlias = alias;
- }
-
- public String getPublicAlias() {
- return publicAlias;
- }
-
- public void setPublicAlias(String publicAlias) {
- this.publicAlias = publicAlias;
- }
-
- /**
- * @return the tags
- */
- public String getTags() {
- return tags;
- }
-
- /**
- * @param tags the tags to set
- */
- public void setTags(String tags) {
- this.tags = tags;
- }
-
- /**
- * @return the nameAndTags
- */
- public String getNameAndTags() {
- return nameAndTags;
- }
-
- /**
- * @param nameAndTags the nameAndTags to set
- */
- public void setNameAndTags(String nameAndTags) {
- this.nameAndTags = nameAndTags;
- }
-
- /**
- * @return the redirectTo
- */
- public String getRedirectTo() {
- return redirectTo;
- }
-
- public String execute() {
- try {
- WikittyProxy proxy = getBowProxy();
- BowBookmark bookmark = null;
- BowBookmark bookmarkToModify = null;
-
- BowUser user = getBowSession().getUser();
- String userId = user.getWikittyId();
- if (StringUtils.isNotBlank(bookmarkId)) {
- bookmarkToModify = proxy.restore(BowBookmark.class, bookmarkId);
- }
- if (log.isDebugEnabled()) {
- log.debug("Change old wikitty: " + bookmarkToModify);
- }
-
- // gere le cas d'une mise a jour ou d'un ajout via le formulaire
- if (name != null) {
- // Si l'alias prive souhaite est deja utilise on ne l'accept pas
- // Si l'alias public souhaite est deja utilise on ne l'accept pas
- // TODO sletellier 20110416 : return error message when public or private alias is already used
- Criteria privateAliasCriteria = null;
- Criteria publicAliasCriteria = null;
- if (StringUtils.isNotEmpty(privateAlias)) {
- privateAliasCriteria = Search.query()
- .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_PRIVATEALIAS, privateAlias)
- .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, userId)
- .criteria().setEndIndex(0);
- }
- if (StringUtils.isNotEmpty(publicAlias)) {
- publicAliasCriteria = Search.query()
- .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_PUBLICALIAS, publicAlias)
- .criteria().setEndIndex(0);
- }
- PagedResult<String>[] aliasResult = proxy.findAllIdByCriteria(
- privateAliasCriteria, publicAliasCriteria);
-
- if (aliasResult[0] != null && aliasResult[0].getNumFound() > 0) {
- if (bookmarkToModify == null) {
- privateAlias = "";
- } else {
- privateAlias = bookmarkToModify.getPrivateAlias();
- }
- }
- if (aliasResult[1] != null && aliasResult[1].getNumFound() > 0) {
- if (bookmarkToModify == null) {
- publicAlias = "";
- } else {
- publicAlias = bookmarkToModify.getPublicAlias();
- }
- }
-
- if (bookmarkToModify == null) {
- bookmark = BookmarkUtils.createBookmark(
- link, name, tags, user, privateAlias, publicAlias, null);
- } else {
- BookmarkUtils.updateBookmark(
- bookmarkToModify, name, link, tags, privateAlias, publicAlias);
- }
- } else { //This part is for the bookmark addition by script
- if (nameAndTags != null) {
- bookmark = BookmarkUtils.createBookmark(link, nameAndTags, user);
- }
- }
- // si on a reussi a creer le bookmark, on regarde s'il ne faut pas
- // le fusionner avec un deja existant
- if (bookmark != null && !bookmark.getDescription().isEmpty()
- && !bookmark.getOwner().isEmpty()) {
-
- // looking for already bookmark with same url, to fusion them
- String link = bookmark.getLink();
- Criteria criteria = Search.query()
- .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_LINK, link)
- .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, userId)
- .criteria();
- BowBookmark oldBookmark =
- proxy.findByCriteria(BowBookmark.class, criteria);
- if(oldBookmark != null) {
- // fusionne les descriptions et les tags
- // par contre on prend le dernier privateAlias prive choisi par
- // l'utilisateur s'il y en a un
- String description = oldBookmark.getDescription();
- if (!StringUtils.isEmpty(bookmark.getDescription())) {
- description += "\n";
- description += BowUtils.formatDate(
- bookmark.getCreationDate()) + ": ";
- description += bookmark.getDescription();
- }
-
- oldBookmark.setDescription(description);
- oldBookmark.addAllLabels(bookmark.getLabels());
- String privateAlias = bookmark.getPrivateAlias();
- if (!StringUtils.isEmpty(privateAlias)) {
- oldBookmark.setPrivateAlias(privateAlias);
- }
-
- bookmark = oldBookmark;
- }
-
- }
-
- if (bookmark != null || bookmarkToModify != null) {
- proxy.store(bookmark, bookmarkToModify); //Stores the bookmark if everything is ok
- addActionMessage(_("bow.bookmark.add.successful"));
- if (log.isDebugEnabled()) {
- log.debug("Adding URL");
- }
- }
- redirectTo = BowUtils.redirectTo(searchLine, fullTextLine);
- } catch (Exception eee) {
- addActionError(_("bow.error.internal"));
- log.error(eee.getMessage(), eee);
- }
- return SUCCESS;
- }
-}
\ No newline at end of file
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/BowBaseAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/BowBaseAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/BowBaseAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -23,6 +23,8 @@
*/
package org.chorem.bow.action;
+import java.util.Arrays;
+import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.util.Map;
@@ -48,10 +50,19 @@
public static final String UNTRANSLATED_MARKER = "???";
+ // perhaps use enumeration ?
+ final static protected List<String> possibleOrder = Arrays.asList(
+ "ascName", "descName", "ascClick", "descClick", "ascDate", "descDate");
+
+ public static List<String> getPossibleOrder() {
+ return possibleOrder;
+ }
+
protected BowConfig config = null;
protected Map<String, Object> session;
- protected String searchLine;
+ protected String tagLine;
protected String fullTextLine;
+ protected String order;
public BowConfig getConfig() {
if (config == null) {
@@ -76,17 +87,17 @@
}
/**
- * @return the searchLine
+ * @return the tagLine
*/
- public String getSearchLine() {
- return searchLine;
+ public String getTagLine() {
+ return tagLine;
}
/**
- * @param searchLine the searchLine to set
+ * @param tagLine the tagLine to set
*/
- public void setSearchLine(String searchLine) {
- this.searchLine = searchLine;
+ public void setTagLine(String tagLine) {
+ this.tagLine = tagLine;
}
/**
@@ -102,4 +113,13 @@
public void setFullTextLine(String fullTextLine) {
this.fullTextLine = fullTextLine;
}
+
+ public String getOrder() {
+ return order;
+ }
+
+ public void setOrder(String order) {
+ this.order = order;
+ }
+
}
\ No newline at end of file
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteImportAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteImportAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteImportAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,87 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import java.util.List;
-
-import org.chorem.bow.BowBookmark;
-import org.chorem.bow.BowImport;
-import org.chorem.bow.BowUser;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.WikittyProxy;
-import org.nuiton.wikitty.search.Search;
-
-
-/**
- * Supprime un import de bookmark
- *
- * @author poussin
- */
-public class DeleteImportAction extends BowBaseAction {
- private static final long serialVersionUID = 8714394293884265516L;
- protected String date;
-
- /**
- * @return the date
- */
- public String getDate() {
- return date;
- }
- /**
- * @param date the date to set
- */
- public void setDate(String date) {
- this.date = date;
- }
-
- /**
- * Deletes a bookmark import
- */
- public String execute() {
- try {
- if (date != null &&
- date.matches("[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{1,3}Z")) {
- WikittyProxy proxy = getBowProxy();
- BowUser user = getBowSession().getUser();
- Criteria criteria = Search.query()
- .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, user.getWikittyId())
- .eq(BowImport.FQ_FIELD_BOWIMPORT_IMPORTDATE, date).criteria();
- List<BowImport> bookmarks = proxy.findAllByCriteria(BowImport.class, criteria).getAll();
-
- if (log.isDebugEnabled()) {
- log.debug("Will delete " + bookmarks.size() + " bookmarks");
- }
-
- proxy.delete(bookmarks);
-
- addActionMessage(_("bow.bookmark.import.delete.successful"));
- }
- } catch (Exception e) {
- addActionError(_("bow.error.internal"));
- log.error(e.getMessage(), e);
- }
- return SUCCESS;
- }
-
-}
\ No newline at end of file
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,74 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import java.util.List;
-import org.apache.commons.lang.StringUtils;
-
-import org.chorem.bow.BookmarkUtils;
-import org.chorem.bow.BowUser;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.WikittyProxy;
-
-/**
- * Supprime des bookmarks qui satisfont le critere de recherche.
- *
- * @author poussin
- */
-public class DeleteSearchResultsAction extends BowBaseAction {
-
- private static final long serialVersionUID = -3903724044644625507L;
-
- /**
- * Deletes the search results
- */
- public String execute() {
- try {
- if (StringUtils.isNotBlank(searchLine)
- || StringUtils.isNotBlank(fullTextLine)) {
- BowUser user = getBowSession().getUser();
- // FIXME poussin 20110817 ATTENTION, la recherche remonte
- // potentiellement des bookmarks qui ne nous appartiennent pas,
- // dans ce cas, ne faudrait-il pas seulement ce supprimer des
- // reader/write/admin ?
- Criteria criteria = BookmarkUtils.getBookmarkListCriteriaByUser(
- user, searchLine, fullTextLine, null);
-
- WikittyProxy proxy = getBowProxy();
- List<String> ids = proxy.findAllIdByCriteria(criteria).getAll();
-
- if (log.isDebugEnabled()) {
- log.debug("Will delete " + ids.size() + " bookmarks");
- }
-
- proxy.delete(ids);
- addActionMessage(_("bow.search.results.deleted"));
- }
- } catch (Exception eee) {
- addActionError(_("bow.error.internal"));
- log.error(eee.getMessage(), eee);
- }
- return SUCCESS;
- }
-}
\ No newline at end of file
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/EditBookmarkAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/EditBookmarkAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/EditBookmarkAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,75 +0,0 @@
-/*
- * #%L
- * BOW UI
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import org.chorem.bow.BowBookmark;
-import org.chorem.bow.BowBookmarkImpl;
-import org.nuiton.wikitty.WikittyProxy;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.Search;
-import org.nuiton.wikitty.search.operators.Element;
-
-/**
- * Load a bookmark to display it on modification page, used when javascript
- * is not available on client
- *
- * @author sletellier
- */
-public class EditBookmarkAction extends BowBaseAction {
-
- protected String id;
- protected BowBookmark bookmark;
-
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- public BowBookmark getBookmark() {
- if (bookmark == null) {
- bookmark = new BowBookmarkImpl();
- }
- return bookmark;
- }
-
- @Override
- public String execute() throws Exception {
- if (id == null) {
- return SUCCESS;
- }
- try {
- WikittyProxy proxy = getBowProxy();
- Criteria criteria = Search.query()
- .eq(Element.ELT_ID, id).criteria();
- bookmark = proxy.findByCriteria(BowBookmark.class, criteria);
- } catch (Exception eee) {
- addActionError(_("bow.error.internal"));
- log.error(eee.getMessage(), eee);
- }
- return SUCCESS;
- }
-}
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,138 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Writer;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.struts2.interceptor.ServletResponseAware;
-import org.chorem.bow.BowBookmark;
-import org.chorem.bow.BookmarkUtils;
-import org.chorem.bow.BowUser;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.WikittyProxy;
-import org.nuiton.wikitty.search.Search;
-
-/**
- * Export son bookmark au format HTML
- *
- * @author poussin
- */
-public class ExportBookmarksAction extends BowBaseAction implements ServletResponseAware {
- private static final long serialVersionUID = 45880214686011946L;
- protected HttpServletResponse response;
- protected InputStream inputStream;
-
- @Override
- public void setServletResponse(HttpServletResponse response) {
- this.response = response;
- }
-
- public InputStream getInputStream() {
- return inputStream;
- }
-
- /**
- * Export tous les bookmarks au format HTML tel que le fait les navigateurs
- *
- * @param bookmarks List<Bookmarks> bookmarks
- * @param out le flux dans lequel il faut ecrire l'export
- * @return String the html file
- */
- protected void generateExportHtmlBookmark(List<BowBookmark> bookmarks, Writer out) throws IOException {
- out.write("<!DOCTYPE NETSCAPE-Bookmark-file-1>\n"
- + "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\">\n"
- + "<DL><p>\n");
- if (bookmarks != null) {
- for (BowBookmark bookmark : bookmarks) {
- if (bookmark != null) {
- out.write("<DT><A HREF=\"");
- out.write(bookmark.getLink() + "\" ");
- Date date = bookmark.getCreationDate();
- if (date != null) {
- long milli = date.getTime();
- String time = String.valueOf(milli / 1000);
- out.write("ADD_DATE=\"" + time + "\" LAST_MODIFIED=\"" + time + "\" ");
- }
- out.write("LAST_CHARSET=\"UTF-8\" ");
- Set<String> tags = bookmark.getLabels();
- if (tags != null && !tags.isEmpty()) {
- out.write("SHORTCUTURL=\""
- + BookmarkUtils.getBookmarkTagsString(bookmark) + "\"");
- }
- out.write(">" + bookmark.getDescription() + "</A>\n");
- }
- }
- }
- out.write("</DL><p>");
- }
-
- /**
- * Exports the bookmarks in HTML format
- */
- @Override
- public String execute() {
- WikittyProxy proxy = getBowProxy();
-
- // get current user
- BowUser user = getBowSession().getUser();
-
- // Get all bookmark for user
- Criteria criteria = Search.query()
- .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, user.getWikittyId()).criteria();
- List<BowBookmark> bookmarks = proxy.findAllByCriteria(BowBookmark.class, criteria).getAll();
-
- // Export all
- BufferedWriter out = null;
-
- try {
-
- // Write result in temp file
- File tmp = File.createTempFile("bookmarks", ".tmp.html");
-
- tmp.deleteOnExit();
- out = new BufferedWriter(new FileWriter(tmp));
- generateExportHtmlBookmark(bookmarks, out);
- out.close();
-
- inputStream = new FileInputStream(tmp);
- } catch (IOException eee) {
- log.error("Error when exporting bookmarks to HTML : ", eee);
- } finally {
- IOUtils.closeQuietly(out);
- }
- return SUCCESS;
- }
-}
\ No newline at end of file
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,123 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import javax.mail.MessagingException;
-import javax.mail.internet.AddressException;
-
-import org.apache.commons.lang.RandomStringUtils;
-import org.apache.commons.lang.StringUtils;
-import org.chorem.bow.BowMail;
-import org.chorem.bow.BowUser;
-import org.nuiton.util.StringUtil;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.WikittyProxy;
-import org.nuiton.wikitty.search.Search;
-
-/**
- * Genere un nouveau mot de passe pour l'utilisateur et lui envoie par mail
- * TODO poussin 20110211 il faudrait ajouter une securite pour eviter que
- * quelqu'un s'amuse a demander la modification de password de quelqu'un d'autre
- * toutes les 2s
- * - soit en ne permettant l'envoi qu'une fois par jour
- * - soit ????
- *
- * @author poussin
- */
-public class ForgotPasswordAction extends BowBaseAction {
- private static final long serialVersionUID = -8207951465957204954L;
- protected String email;
-
- /**
- * @return the email
- */
- public String getEmail() {
- return email;
- }
-
- /**
- * @param email the email to set
- */
- public void setEmail(String email) {
- this.email = email;
- }
-
- /**
- * Generates a new password and sends it to the user
- */
- @Override
- public String execute() {
- String result = INPUT;
-
- try {
- if (StringUtils.isNotBlank(email)) {
- email = email.trim();
- WikittyProxy proxy = getBowProxy();
- Criteria criteria = Search.query()
- .eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria();
- BowUser user = proxy.findByCriteria(BowUser.class, criteria);
-
- if (user != null) { //If the email address exists
- String password = "";
- String md5 = "";
-
- password = RandomStringUtils.randomAlphanumeric(20);
- md5 = StringUtil.encodeMD5(password);
- try {
- String mailContent;
-
- mailContent = _("bow.register.mailHi") +
- ",\n\n" + _("bow.register.mailPwd") + ": " +
- password + "\n\n" + _("bow.register.mailEmail") +
- ": " + email + "\n\n";
- BowMail.sendMail(email,
- _("bow.register.mailSubject"),
- mailContent);
-
- //The password is changed only if the mail has been sent
- user.setPassword(md5);
- proxy.store(user);
- } catch (AddressException eee) {
- //If the email address is invalid
- addActionError(_("bow.mail.badFormat"));
- log.error(String.format("Can't send message email to '%s'",
- email), eee);
- } catch (MessagingException eee) {
- addActionError("bow.mail.sendError");
- log.error(String.format("Can't send message email to '%s'",
- email), eee);
- }
- result = SUCCESS;
- } else { //If the email is not associated with an account
- addFieldError("email",
- _("bow.forgotPassword.emailDoesntExist"));
- }
- }
- } catch (Exception eee) {
- addActionError(_("bow.error.internal"));
- log.error(eee.getMessage(), eee);
- }
- return result;
- }
-}
\ No newline at end of file
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/GenerateTokenAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/GenerateTokenAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/GenerateTokenAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,61 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import org.chorem.bow.BowUser;
-import org.chorem.bow.BowUtils;
-import org.nuiton.wikitty.WikittyProxy;
-
-/**
- * Force la regeneration de token permanent et temporaire
- *
- * @author poussin
- */
-public class GenerateTokenAction extends BowBaseAction {
-
- private static final long serialVersionUID = 1141019772989666309L;
-
- /**
- * Generates a new permanent and temporary token
- */
- @Override
- public String execute() {
- try {
- BowUser user = getBowSession().getUser();
- WikittyProxy proxy = getBowProxy();
-
- String permanentToken = BowUtils.generateToken();
- user.setPermanentToken(permanentToken);
- proxy.store(user);
-
- String temporaryToken = BowUtils.generateToken();
- getBowSession().setTemporaryToken(temporaryToken);
- addActionMessage(_("bow.token.generate.successful"));
- } catch (Exception eee) {
- addActionError(_("bow.error.internal"));
- log.error(eee.getMessage(), eee);
- }
- return SUCCESS;
- }
-}
\ No newline at end of file
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/HomeAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/HomeAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/HomeAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,119 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import com.opensymphony.xwork2.ActionContext;
-import java.util.Arrays;
-import java.util.List;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.chorem.bow.BowSearchResult;
-import org.chorem.bow.BowSession;
-import org.nuiton.util.TimeLog;
-
-/**
- * Prepare l'affichage de la page d'accueil
- *
- * @author poussin
- */
-public class HomeAction extends BowBaseAction {
-
- private static final Log log = LogFactory.getLog(HomeAction.class);
- private static final TimeLog timeLog = new TimeLog(HomeAction.class);
-
- private static final long serialVersionUID = -3735250067223062719L;
-
- private static final String ALIAS_SERVLET_URL = "aliasServletUrl";
-
- static public HomeAction getAction() {
- Object action = ActionContext.getContext().get(CONTEXT_ACTION_KEY);
- return (HomeAction) action;
- }
-
- protected String order;
- protected String addTag;
- final static protected List<String> possibleOrder = Arrays.asList(
- "ascName", "descName", "ascClick", "descClick", "ascDate", "descDate");
-
- protected BowSearchResult searchResult;
-
- public static List<String> getPossibleOrder() {
- return possibleOrder;
- }
-
- public String getOrder() {
- return order;
- }
-
- public void setOrder(String order) {
- this.order = order;
- }
-
- public String getAddTag() {
- return addTag;
- }
-
- public void setAddTag(String addTag) {
- this.addTag = addTag;
- }
-
- public BowSearchResult getSearchResult() {
- return searchResult;
- }
-
- public void setSearchResult(BowSearchResult searchResult) {
- this.searchResult = searchResult;
- }
-
- /**
- * Initializes everything before displaying the home page
- */
- @Override
- public String execute() {
- long start = TimeLog.getTime();
- try {
- // on ajoute les tags qui doivent faire parti de ne nouvelle recherche
- // on restocke dans searchLine pour que la bonne info reapparaisse
- // a l'utilisateur
- searchLine = StringUtils.join(new String[]{searchLine, addTag}, " ").trim();
-
- // si l'ordre souhaite n'existe pas, on utilise l'ordre par defaut
- if (!getPossibleOrder().contains(order)) {
- // default sort order
- // TODO poussin 20110815 rendre configurable par l'utilisateur l'ordre par defaut qu'il prefere
- order = "descClick";
- }
-
- BowSession s = getBowSession();
- searchResult = new BowSearchResult(s, searchLine, fullTextLine, order);
- } catch (Exception eee) {
- addActionError(_("bow.error.internal"));
- log.error(eee.getMessage(), eee);
- }
- timeLog.log(start, "execute");
- return SUCCESS;
- }
-}
\ No newline at end of file
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,256 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.apache.commons.lang.StringUtils;
-
-import org.chorem.bow.BookmarkUtils;
-import org.chorem.bow.BowBookmark;
-import org.chorem.bow.BowImportHelper;
-import org.chorem.bow.BowUser;
-import org.htmlparser.Node;
-import org.htmlparser.Parser;
-import org.htmlparser.util.NodeList;
-import org.htmlparser.util.ParserException;
-import org.htmlparser.util.SimpleNodeIterator;
-import org.nuiton.wikitty.WikittyProxy;
-import org.nuiton.wikitty.entities.Wikitty;
-
-/**
- * Import un bookmark HTML
- *
- * @author poussin
- */
-public class ImportBookmarksAction extends PreferencesAction {
-
- private static final long serialVersionUID = -5962680416570797028L;
-
- protected File upfile;
- protected String upfileContentType;
- protected String upfileFileName;
-
- /**
- * @return the upfile
- */
- public File getUpfile() {
- return upfile;
- }
-
- /**
- * @param upfile
- * the upfile to set
- */
- public void setUpfile(File upfile) {
- this.upfile = upfile;
- }
-
- /**
- * @return the upfileContentType
- */
- public String getUpfileContentType() {
- return upfileContentType;
- }
-
- /**
- * @param upfileContentType
- * the upfileContentType to set
- */
- public void setUpfileContentType(String upfileContentType) {
- this.upfileContentType = upfileContentType;
- }
-
- /**
- * @return the upfileFileName
- */
- public String getUpfileFileName() {
- return upfileFileName;
- }
-
- /**
- * @param upfileFileName
- * the upfileFileName to set
- */
- public void setUpfileFileName(String upfileFileName) {
- this.upfileFileName = upfileFileName;
- }
-
- /**
- * @param html String html
- * @param name String name
- * @param user User user
- * @return Bookmark the bookmark filled
- */
- protected BowBookmark createBookmarkFromHtml(String html, String name, BowUser user) {
- String link = getUrlFromHtml(html);
- String tags = getTagsFromHtml(html);
- Date date = getDateFromHtml(html);
- BowBookmark bookmark = BookmarkUtils.createBookmark(link, name, tags, user, null, null, date);
- return bookmark;
- }
-
- /**
- * @param html String html
- * @return Date from the html
- */
- protected Date getDateFromHtml(String html) {
- Date date = null;
- if (html != null) {
- Pattern p = Pattern.compile("ADD_DATE=\"([^\"]*)\"");
- Matcher m = p.matcher(html);
- if (m.find()) {
- String str = m.group(1);
- if (str != null && !str.isEmpty()) {
- long time = Long.valueOf(str) * 1000; // the date in ms
- date = new Date(time);
- }
- }
- }
- return date;
- }
-
- /**
- * @param html String html
- * @return url
- */
- protected String getUrlFromHtml(String html) {
- String url = "";
- if (html != null) {
- Pattern p = Pattern.compile("A HREF=\"([^\"]*)\"");
- Matcher m = p.matcher(html);
- if (m.find()) {
- url = m.group(1);
- }
- }
- return url;
- }
-
- protected String getTagsFromHtml(String html) {
- String tags = "";
- if (html != null) {
- Pattern p = Pattern.compile("SHORTCUTURL=\"([^\"]*)\"");
- Matcher m = p.matcher(html);
- if (m.find()) {
- tags = m.group(1);
- }
- }
- return tags;
- }
-
- protected void parseHtmlToBookmarks(NodeList list, BowUser user, Date date,
- List<BowBookmark> bookmarks, Set<String> tagList)
- throws ParserException {
-
- SimpleNodeIterator it = list.elements();
-
- while (it.hasMoreNodes()) {
- Node node = it.nextNode();
- String plainText = node.toPlainTextString(); // The text between
- // two heads ==>
- // <toto>plainText</toto>
- String text = node.getText(); // The text in the head ==>
- // <text></toto>
-
- if (StringUtils.startsWithIgnoreCase(text, "h3")) { // H3 = folder
- if (StringUtils.isNotBlank(plainText)) {
- tagList.add(plainText); // Adds the folder name to the
- // tagList
- }
- } else if (StringUtils.startsWithIgnoreCase(text, "a href")) { // HREF
- // = new
- // bookmarks
- BowBookmark bookmark = createBookmarkFromHtml(text, plainText, user);
- Wikitty w = getBowProxy().getWikitty(bookmark);
- BowImportHelper.addExtension(w);
- BowImportHelper.setImportDate(w, date);
-
- bookmark.addAllLabels(tagList);
-
- bookmarks.add(bookmark);
- }
- NodeList children = node.getChildren();
-
- if (children != null) {
- parseHtmlToBookmarks(children, user, date, bookmarks,
- // On utilise une nouvelle liste pour les enfants
- // pour eviter que les tags de tous les enfants se
- // retrouve ensemble
- new HashSet<String>(tagList)); // If there is an under node = recursion
- }
- }
- }
-
- @Override
- public String execute() {
-
- log.info("Importing boormarks : " + upfile);
- try {
- BowUser user = getBowSession().getUser();
-
- // Struts limite to html files, is null if not one
- if (upfile != null) {
- WikittyProxy proxy = getBowProxy();
-
- try {
- URL url = upfile.toURI().toURL();
- Parser parser = new Parser(url.openConnection());
- NodeList list = parser.parse(null);
-
- List<BowBookmark> bookmarks = new ArrayList<BowBookmark>();
- parseHtmlToBookmarks(list, user, new Date(), bookmarks,
- new HashSet<String>());
- proxy.store(bookmarks);
-
- addActionMessage(_("bow.bookmark.import.successful"));
- } catch (ParserException eee) {
- log.error(String.format("Can't parse imported file '%s'",
- getUpfileFileName()), eee);
- addActionError(_("bow.bookmark.badFileFormat"));
- } catch (IOException eee) {
- log.error(String.format("Can't read imported file '%s'",
- getUpfileFileName()), eee);
- addActionError(_("bow.error.internal"));
- return ERROR;
- }
- } else {
- addActionError(_("bow.bookmark.badFileFormat"));
- return ERROR;
- }
- } catch (Exception eee) {
- addActionError(_("bow.error.internal"));
- log.error(eee.getMessage(), eee);
- return ERROR;
- }
- return SUCCESS;
- }
-}
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/LoginAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/LoginAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/LoginAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,129 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-
-package org.chorem.bow.action;
-
-import org.apache.commons.lang.StringUtils;
-
-import org.chorem.bow.BowConfig;
-import org.chorem.bow.BowUser;
-import org.chorem.bow.BowUserImpl;
-import org.nuiton.util.StringUtil;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.WikittyProxy;
-import org.nuiton.wikitty.search.Search;
-
-/**
- * authentifie l'utilisateur et place son objet User dans la bow session
- *
- * @author poussin
- */
-public class LoginAction extends BowBaseAction {
-
- private static final long serialVersionUID = 6891064800288772246L;
-
- protected String email;
- protected String password;
-
- public String getEmail() {
- return email;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- /**
- * Check password in solr index, if fail try to check password admin in config file
- *
- * @param email non null et non vide email
- * @param password non null et non vide email
- * @return
- */
- protected BowUser checkLogin(String email, String password) {
- BowUser result = null;
-
- WikittyProxy proxy = getBowProxy();
- Criteria criteria = Search.query().eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).
- eq(BowUser.FQ_FIELD_WIKITTYUSER_PASSWORD, password).criteria();
- result = proxy.findByCriteria(BowUser.class, criteria);
-
- if (result == null) {
- // failback: try to authenticate admin with config info
- String configPassword = BowConfig.getAdminPassword(email);
- log.info(String.format("failback password: '%s' configPassword: '%s'",
- password, configPassword));
- if (password.equals(configPassword)) {
- // admin authenticate with config, this is possible when
- // solr index is corrupted or missed. Admin must go to admin
- // page en recreate index
- result = new BowUserImpl();
- result.setLogin(email);
- result.setPassword(configPassword);
- addActionMessage(_("bow.login.admin.failback"));
- log.warn(_("bow.login.admin.failback"));
- } else {
- addActionError(_("bow.login.authenticationFailure"));
- }
- }
- return result;
- }
-
- /**
- * Authenticates the user if his email and password are valid
- */
- @Override
- public String execute() {
- String result = INPUT;
-
- try {
- if (StringUtils.isNotBlank(email)) {
- email = email.trim();
-
- if (StringUtils.isNotEmpty(password)) {
- String md5 = StringUtil.encodeMD5(password);
- BowUser user;
-
- user = checkLogin(email, md5);
- if (user != null) {
- getBowSession().setUser(user);
- result = SUCCESS;
- }
- }
- }
- } catch (Exception eee) {
- addActionError(_("bow.error.internal"));
- log.error(eee.getMessage(), eee);
- }
- return result;
- }
-}
\ No newline at end of file
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/LogoutAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/LogoutAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/LogoutAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,41 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import org.chorem.bow.BowSession;
-
-/**
- * Invalide la session courante et donc de-authentifie l'utilisateur
- *
- * @author poussin
- */
-public class LogoutAction extends BowBaseAction {
- private static final long serialVersionUID = 4806944250461551896L;
-
- @Override
- public String execute() {
- BowSession.invalidate(session);
- return SUCCESS;
- }
-}
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/MigrateDataAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/MigrateDataAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/MigrateDataAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,94 +0,0 @@
-/*
- * #%L
- * BOW UI
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.chorem.bow.BowMigration04To05;
-import org.chorem.bow.BowMigration06To11;
-import org.chorem.bow.BowSession;
-import org.nuiton.util.VersionUtil;
-import org.nuiton.wikitty.WikittyProxy;
-
-/**
- * Lance la migration des données de la version 0.4 vers 0.5
- *
- * @author poussin
- * @version $Revision$
- *
- * Last update: $Date$
- * by : $Author$
- */
-public class MigrateDataAction extends BowBaseAction {
-
- /** to use log facility, just put in your code: log.info(\"...\"); */
- static private Log log = LogFactory.getLog(MigrateDataAction.class);
-
- /** Version must be real version, like 0.4, 0.5 or 0.6 */
- protected String versionFrom;
- protected String versionTo;
-
- public void setVersionFrom(String versionFrom) {
- this.versionFrom = versionFrom;
- }
-
- public void setVersionTo(String versionTo) {
- this.versionTo = versionTo;
- }
-
- @Override
- public String execute() {
- try {
- if (StringUtils.isBlank(versionFrom) || StringUtils.isBlank(versionTo)) {
- log.error("Migration action must have to parameter: versionFrom and versionTo");
- } else {
- BowSession session = getBowSession();
- if (session.isAdmin()) { //If is admin
- WikittyProxy proxy = getBowProxy();
-
- if (VersionUtil.equals(versionFrom, "0.4")
- && VersionUtil.equals(versionTo, "0.5")) {
- BowMigration04To05.migrate(proxy);
- addActionMessage(_("bow.admin.dataMigration.success"));
- } else if (VersionUtil.equals(versionFrom, "0.6")
- && VersionUtil.equals(versionTo, "1.1")) {
- BowMigration06To11.migrate(proxy);
- addActionMessage(_("bow.admin.dataMigration.success"));
- } else {
- addActionMessage(String.format(
- "No migration found for %s to %s",
- versionFrom, versionTo));
- }
- }
- }
- } catch (Exception eee) {
- addActionError(_("bow.error.internal"));
- log.error(eee.getMessage(), eee);
- }
- return SUCCESS;
- }
-
-}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -47,7 +47,16 @@
protected String token;
protected String redirectTo;
protected HttpServletResponse response;
+ protected String searchLine;
+ public String getSearchLine() {
+ return searchLine;
+ }
+
+ public void setSearchLine(String searchLine) {
+ this.searchLine = searchLine;
+ }
+
/**
* @return the token
*/
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -54,7 +54,17 @@
}
protected OpenSearchActions openSearchActions;
+ protected String searchLine;
+ public String getSearchLine() {
+ return searchLine;
+ }
+
+ public void setSearchLine(String searchLine) {
+ this.searchLine = searchLine;
+ }
+
+
public OpenSearchActions getOpenSearchActions() {
return openSearchActions;
}
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,493 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import org.chorem.bow.BookmarkUtils;
-import org.chorem.bow.BowBookmark;
-import org.chorem.bow.BowPreference;
-import org.chorem.bow.BowProxy;
-import org.chorem.bow.BowUser;
-import com.opensymphony.xwork2.ActionContext;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.lang.StringUtils;
-import org.chorem.bow.BowSession;
-
-import org.nuiton.util.StringUtil;
-import org.nuiton.wikitty.WikittyProxy;
-import org.nuiton.wikitty.WikittyUtil;
-import org.nuiton.wikitty.entities.Wikitty;
-import org.nuiton.wikitty.entities.WikittyLabel;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.FacetTopic;
-import org.nuiton.wikitty.search.PagedResult;
-import org.nuiton.wikitty.search.Search;
-
-/**
- * Change les preferences de l'utilisateur (couleur, password, email, ...)
- *
- * @author poussin
- */
-public class PreferencesAction extends BowBaseAction {
- private static final long serialVersionUID = -58341106356599721L;
-
- static public PreferencesAction getAction() {
- Object action = ActionContext.getContext().get(CONTEXT_ACTION_KEY);
- return (PreferencesAction) action;
- }
-
- protected String colors;
- protected String tagsNb;
- protected String bookmarksHomePage;
- protected String searchEngineUrlSuggestions;
- protected String searchEngineUrlResults;
- protected String email;
- protected String newPassword;
- protected String currentPassword;
- protected String confirmNewPassword;
- protected String update;
- protected Map<String, Integer> bookmarksImportDate;
-
- protected List<FacetTopic> labels;
- protected String[] selectedLabels;
- protected String rename;
- protected String delete;
- protected String newLabel;
-
- public String getNewLabel() {
- return newLabel;
- }
-
- public void setNewLabel(String newLabel) {
- this.newLabel = newLabel;
- }
-
- public void setRename(String rename) {
- this.rename = rename;
- }
-
- public String getRename() {
- return rename;
- }
-
- public void setDelete(String delete) {
- this.delete = delete;
- }
-
- public String getDelete() {
- return delete;
- }
-
- /**
- * @return the colors
- */
- public String getColors() {
- return colors;
- }
-
- /**
- * @param colors the colors to set
- */
- public void setColors(String colors) {
- this.colors = colors;
- }
-
- /**
- * @return the tagsNb
- */
- public String getTagsNb() {
- return tagsNb;
- }
-
- /**
- * @param tagsNb the tagsNb to set
- */
- public void setTagsNb(String tagsNb) {
- this.tagsNb = tagsNb;
- }
-
- /**
- * @return the bookmarksHomePage
- */
- public String getBookmarksHomePage() {
- return bookmarksHomePage;
- }
-
- /**
- * @param bookmarksHomePage the bookmarksHomePage to set
- */
- public void setBookmarksHomePage(String bookmarksHomePage) {
- this.bookmarksHomePage = bookmarksHomePage;
- }
-
- /**
- * @return the searchEngineUrlSuggestions
- */
- public String getSearchEngineUrlSuggestions() {
- return searchEngineUrlSuggestions;
- }
-
- /**
- * @param searchEngineUrlSuggestions the searchEngineUrlSuggestions to set
- */
- public void setSearchEngineUrlSuggestions(String searchEngineUrlSuggestions) {
- this.searchEngineUrlSuggestions = searchEngineUrlSuggestions;
- }
-
- /**
- * @return the searchEngineUrlResults
- */
- public String getSearchEngineUrlResults() {
- return searchEngineUrlResults;
- }
-
- /**
- * @param searchEngineUrlResults the searchEngineUrlResults to set
- */
- public void setSearchEngineUrlResults(String searchEngineUrlResults) {
- this.searchEngineUrlResults = searchEngineUrlResults;
- }
-
- /**
- * @return the email
- */
- public String getEmail() {
- return email;
- }
-
- /**
- * @param email the email to set
- */
- public void setEmail(String email) {
- this.email = email;
- }
-
- /**
- * @return the newPassword
- */
- public String getNewPassword() {
- return newPassword;
- }
-
- /**
- * @param newPassword the newPassword to set
- */
- public void setNewPassword(String newPassword) {
- this.newPassword = newPassword;
- }
-
- /**
- * @return the currentPassword
- */
- public String getCurrentPassword() {
- return currentPassword;
- }
-
- /**
- * @param currentPassword the currentPassword to set
- */
- public void setCurrentPassword(String currentPassword) {
- this.currentPassword = currentPassword;
- }
-
- /**
- * @return the confirmNewPassword
- */
- public String getConfirmNewPassword() {
- return confirmNewPassword;
- }
-
- /**
- * @param confirmNewPassword the confirmNewPassword to set
- */
- public void setConfirmNewPassword(String confirmNewPassword) {
- this.confirmNewPassword = confirmNewPassword;
- }
-
- /**
- * @return the update
- */
- public String getUpdate() {
- return update;
- }
-
- /**
- * @param update the update to set
- */
- public void setUpdate(String update) {
- this.update = update;
- }
-
- /**
- * @return the bookmarksImportDate
- */
- public Map<String, Integer> getBookmarksImportDate() {
- return bookmarksImportDate;
- }
-
- /**
- * @param bookmarksImportDate the bookmarksImportDate to set
- */
- public void setBookmarksImportDate(Map<String, Integer> bookmarksImportDate) {
- this.bookmarksImportDate = bookmarksImportDate;
- }
-
- public List<FacetTopic> getLabels() {
- return labels;
- }
-
- public String[] getSelectedLabels() {
- return selectedLabels;
- }
-
- public void setSelectedLabels(String[] selectedLabels) {
- this.selectedLabels = selectedLabels;
- }
-
- /**
- * Date est une date mais au format String qui vient de Solr
- * Elle est de la forme '2011-08-18T00:25:16.028Z'
- * qui n'est pas presentable a l'utilisateur
- * On la remet sous une vrai forme date
- */
- public Date stringToDate(String date) {
- try {
- Date result = WikittyUtil.parseDate(date);
- return result;
-
-// String result = date.replaceAll("[^0-9:-]+", " ").trim();
-// result = result.substring(0, date.lastIndexOf(' '));
- } catch (ParseException eee) {
- return new Date(0);
- }
- }
-
- protected void changePreference(BowPreference preference) {
- preference.setColors(colors);
- if (StringUtils.isNotBlank(tagsNb)) {
- preference.setTags(Integer.valueOf(tagsNb));
- }
- if (StringUtils.isNotBlank(bookmarksHomePage)) {
- preference.setBookmarks(Integer.valueOf(bookmarksHomePage));
- }
- preference.setSearchEngineUrlSuggestions(searchEngineUrlSuggestions);
- preference.setSearchEngineUrlResults(searchEngineUrlResults);
- }
-
- /**
- * Modifie l'email et le password si necessaire. Si la modif est impossible
- * email deja utilise, ou mauvais password, alors la methode return false
- * Si tout ce passe bien, la methode retourne true
- *
- * @param user
- * @return
- */
- protected boolean changeUser(BowUser user) {
- boolean result = true;
-
- if (StringUtils.isNotBlank(email)) {
- Criteria criteria = Search.query().eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria();
- if (log.isDebugEnabled()) {
- log.debug(String.format("Try to find user with email: '%s'", email));
- }
- BowUser find = getBowProxy().findByCriteria(BowUser.class, criteria);
-
- //If this email address isn't already used (or if it hasn't changed)
- if (find == null || find.getLogin().equals(user.getLogin())) {
- email = email.trim();
- user.setLogin(email);
- } else {
- // this email address is already used by someone else
- setEmail(user.getLogin());
-
- // TODO poussin 20110818 addFieldError don't work (no message on web page :(
- // add addActionError to prevent addFieldError that don't work
- addFieldError("email", _("bow.preferences.emailAldyExists"));
- addActionError(_("bow.preferences.emailAldyExists"));
- result = false;
- }
- }
-
- if (result
- && StringUtils.isNotBlank(newPassword)
- && StringUtils.isNotBlank(confirmNewPassword)
- && StringUtils.isNotBlank(currentPassword)) {
- if (newPassword.equals(confirmNewPassword)) {
- currentPassword = StringUtil.encodeMD5(currentPassword);
- if (currentPassword.equals(user.getPassword())) {
- user.setPassword(StringUtil.encodeMD5(newPassword));
- } else {
- // TODO poussin 20110818 addFieldError don't work (no message on web page :(
- // add addActionError to prevent addFieldError that don't work
- addFieldError("currentPassword", _("bow.preferences.badCurrentPassword"));
- addActionError(_("bow.preferences.badCurrentPassword"));
- result = false;
- }
- }
- }
- return result;
- }
-
- /**
- * Charge dans la variable labels tous les labels de l'utilisateur
- * @param proxy
- */
- protected void loadLabels(WikittyProxy proxy) {
- BowUser user = getBowSession().getUser();
- String userId = user.getWikittyId();
-
- Criteria c = Search.query()
- .exteq(BowBookmark.EXT_WIKITTYLABEL)
- .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, userId)
- .criteria().setEndIndex(0) // on ne veut aucun resultat, c'est la facet dont on a besoin
- .setFacetMinCount(1) // on demande meme les labels avec 1 seul item
- .setFacetLimit(-1) // on demande tous les labels
- .addFacetField(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
- PagedResult<Wikitty> result = proxy.findAllByCriteria(c);
- // lorsqu'on demande tout (facetLimit(-1)), les topics sont trie
- // alphabetiquement pas besoin de les retrier
- labels = result.getTopic(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
- }
-
- /**
- * Fait les modification demandé par l'utilisateur dans l'interface de
- * preference: renome ou supprime des labels. Si l'utilisateur demande le
- * remplacement de label on indiquant pas de nouveau label, alors la chaine
- * vide est utilisee.
- *
- * @return
- */
- public String adminlabels() {
- String result = SUCCESS;
- try {
- if (log.isDebugEnabled()) {
- log.debug("Selected labels: " + Arrays.toString(selectedLabels));
- log.debug("action delete: " + delete + " rename: " + rename);
- }
-
- List<String> selectedLabelsList = Arrays.asList(selectedLabels);
- boolean isRename = !StringUtils.isEmpty(rename);
-
- BowProxy proxy = getBowProxy();
- BowUser user = getBowSession().getUser();
- String userId = user.getWikittyId();
-
- Criteria c = Search.query()
- .in(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS, selectedLabelsList)
- .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, userId)
- .criteria();
- PagedResult<WikittyLabel> searchResult =
- proxy.findAllByCriteria(WikittyLabel.class, c);
-
- List<WikittyLabel> toStore = new ArrayList<WikittyLabel>();
- for (WikittyLabel label : searchResult) {
- toStore.add(label);
- Set<String> l = label.getLabels();
- if (l != null) {
- // on fait une copie, car l retourne est non modifiable
- l = new HashSet<String>(l);
- l.removeAll(selectedLabelsList);
- if (isRename) {
- l.add(newLabel);
- }
- label.setLabels(l);
- }
- }
- proxy.store(toStore);
- } catch (Exception eee) {
- addActionError(_("bow.error.internal"));
- log.error(eee.getMessage(), eee);
- }
- return result;
-
- }
-
- /**
- * Action executer lorsque l'utilisateur demande la page
- */
- @Override
- public String execute() {
- String result = SUCCESS;
-
- try {
- BowSession session = getBowSession();
- BowProxy proxy = session.getProxy();
- // BowUser extends BowPreference, donc on l'utilise pour tout
- BowUser user = session.getUser();
-
- loadLabels(proxy);
- Map<String,Integer> bookmarksByImportDate =
- BookmarkUtils.getBookmarksByImportDate(session, user);
-
- if (log.isDebugEnabled()) {
- log.debug("bookmarksByImportDate found : " + (bookmarksByImportDate == null ? "null" : bookmarksByImportDate.size()));
- }
- setBookmarksImportDate(bookmarksByImportDate.isEmpty() ? null : bookmarksByImportDate);
-
- if (update != null) {
-
- // modification des preferences du site
- if ("site".equals(update)) { //If the user submitted the form
- changePreference(user);
- user = proxy.store(user);
- getBowSession().setUser(user);
- }
-
- // modification des preferences user (email, password)
- if ("user".equals(update)) {
- if (changeUser(user)) {
- user = proxy.store(user);
- getBowSession().setUser(user);
- result = "update";
- addActionMessage(_("bow.preferences.update.successful"));
- } else {
- result = ERROR;
- }
- }
- }
-
- // reload all time data (otherwize if submit user info, site info disappear)
-
- // If the user didn't submit the form, the fields are filled with
- // the current preferences values
- setEmail(user.getLogin());
- setColors(user.getColors());
- setTagsNb(String.valueOf(user.getTags()));
- setBookmarksHomePage(String.valueOf(user.getBookmarks()));
- setSearchEngineUrlSuggestions(user.getSearchEngineUrlSuggestions());
- setSearchEngineUrlResults(user.getSearchEngineUrlResults());
- } catch (Exception eee) {
- addActionError(_("bow.error.internal"));
- log.error(eee.getMessage(), eee);
- }
- return result;
- }
-}
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/ReIndexationAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/ReIndexationAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/ReIndexationAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,54 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import org.chorem.bow.BowSession;
-import org.nuiton.wikitty.WikittyProxy;
-
-/**
- * Lance la reindexation solr
- *
- * @author poussin
- */
-public class ReIndexationAction extends BowBaseAction {
-
- private static final long serialVersionUID = 6226574522402739559L;
-
- @Override
- public String execute() {
- try {
- BowSession session = getBowSession();
- if (session.isAdmin()) { //If is admin
- WikittyProxy proxy = getBowProxy();
-
- proxy.getWikittyService().syncSearchEngine(proxy.getSecurityToken());
- addActionMessage(_("bow.admin.reIndexationDone"));
- }
- } catch (Exception eee) {
- addActionError(("bow.error.internal"));
- log.error(eee.getMessage(), eee);
- }
- return SUCCESS;
- }
-}
\ No newline at end of file
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/RegisterAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/RegisterAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/RegisterAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,178 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import javax.mail.MessagingException;
-import javax.mail.internet.AddressException;
-import org.apache.commons.lang.StringUtils;
-
-import org.chorem.bow.BowMail;
-import org.chorem.bow.BowUser;
-import org.chorem.bow.BowUserImpl;
-import org.chorem.bow.BowUtils;
-import org.nuiton.util.StringUtil;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.WikittyProxy;
-import org.nuiton.wikitty.search.Search;
-
-/**
- * Enregistre un nouvel utilisateur
- *
- * @author poussin
- */
-public class RegisterAction extends BowBaseAction {
-
- private static final long serialVersionUID = 2204772861770399542L;
-
- protected String email;
- protected String password;
- protected String repeatPassword;
-
- /**
- * @return the email
- */
- public String getEmail() {
- return email;
- }
-
- /**
- * @param email the email to set
- */
- public void setEmail(String email) {
- this.email = email;
- }
-
- /**
- * @return the password
- */
- public String getPassword() {
- return password;
- }
-
- /**
- * @param password the password to set
- */
- public void setPassword(String password) {
- this.password = password;
- }
-
- /**
- * @return the repeatPassword
- */
- public String getRepeatPassword() {
- return repeatPassword;
- }
-
- /**
- * @param repeatPassword the repeatPassword to set
- */
- public void setRepeatPassword(String repeatPassword) {
- this.repeatPassword = repeatPassword;
- }
-
- /**
- *
- * @param email non null and non blank email
- * @return false if the email address isn't already registered, true
- * otherwise
- */
- protected boolean alreadyRegistered(String email) {
- boolean result = true;
-
- WikittyProxy proxy = getBowProxy();
- //Retrieves user by user name (email)
- Criteria criteria = Search.query()
- .eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria();
-
- result = proxy.findByCriteria(BowUser.class, criteria) != null;
- //If the user doesn't already exist
- if (result) {
- //The email address is already used by someone
- addFieldError("email", _("bow.register.emailAldyUsed"));
- }
- return result;
- }
-
- /**
- * Registers the new user and sends an email to confirm registration
- */
- @Override
- public String execute() {
- String result = INPUT;
-
- try {
- if (StringUtils.isNotBlank(email)) {
- email = email.trim();
- if (StringUtils.isNotBlank(password)) {
- if (!password.equals(repeatPassword)) {
- addActionError(_("bow.register.pwdDontMatch"));
- } else {
- String md5 = StringUtil.encodeMD5(password);
-
- //If the email address isn't already used
- if (!alreadyRegistered(email)) {
- WikittyProxy proxy = getBowProxy();
- BowUserImpl newUser = new BowUserImpl();
- newUser.setPassword(md5);
- newUser.setLogin(email);
- String permanentToken = BowUtils.generateToken();
- newUser.setPermanentToken(permanentToken);
- BowUser login = proxy.store(newUser); //Stores the new user
-
- //If there was an error when storing the user
- if (login == null) {
- addFieldError("email", _("bow.register.invalidLogin"));
- } else {
- getBowSession().setUser(login);
- try {
- String mailContent;
-
- mailContent =
- _("bow.register.mailHi") + ",\n\n" +
- _("bow.register.mailPwd") + ": " + password + "\n\n" +
- _("bow.register.mailEmail") + ": " + email + "\n\n";
- BowMail.sendMail(email, _("bow.register.mailSubject"), mailContent);
- } catch (AddressException eee) {
- //If the email address is invalid
- addActionError(_("bow.mail.badFormat"));
- log.error(String.format("Can't send message email to '%s'",
- email), eee);
- } catch (MessagingException eee) {
- addActionError("bow.mail.sendError");
- log.error(String.format("Can't send message email to '%s'",
- email), eee);
- }
- result = SUCCESS;
- }
- }
- }
- }
- }
- } catch (Exception eee) {
- addActionError(_("bow.error.internal"));
- log.error(eee.getMessage(), eee);
- }
- return result;
- }
-}
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/RemoveBookmarkAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/RemoveBookmarkAction.java 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/RemoveBookmarkAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,82 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import org.apache.commons.lang.StringUtils;
-import org.chorem.bow.BowBookmark;
-import org.chorem.bow.BowUtils;
-import org.nuiton.wikitty.WikittyProxy;
-
-/**
- * Supprime un bookmark
- *
- * @author poussin
- */
-public class RemoveBookmarkAction extends BowBaseAction {
-
- private static final long serialVersionUID = 820566716695285561L;
-
- protected String bookmarkId;
- protected String redirectTo;
-
- /**
- * @return the bookmarkId
- */
- public String getBookmarkId() {
- return bookmarkId;
- }
-
- /**
- * @param bookmarkId the bookmarkId to set
- */
- public void setBookmarkId(String bookmarkId) {
- this.bookmarkId = bookmarkId;
- }
-
- /**
- * @return the redirectTo
- */
- public String getRedirectTo() {
- return redirectTo;
- }
-
- /**
- * Removes a bookmark
- */
- @Override
- public String execute() {
- if (StringUtils.isNotEmpty(bookmarkId)) {
- try {
- WikittyProxy proxy = getBowProxy();
- proxy.delete(bookmarkId);
- addActionMessage(_("bow.bookmark.remove.successful"));
- } catch (Exception eee) {
- addActionError(_("bow.error.internal"));
- log.error("Can't do action", eee);
- }
- }
- redirectTo = BowUtils.redirectTo(searchLine, fullTextLine);
- return SUCCESS;
- }
-}
\ No newline at end of file
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/action/admin/MigrateDataAction.java (from rev 306, trunk/bow-ui/src/main/java/org/chorem/bow/action/MigrateDataAction.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/admin/MigrateDataAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/admin/MigrateDataAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,95 @@
+/*
+ * #%L
+ * BOW UI
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package org.chorem.bow.action.admin;
+
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.chorem.bow.BowMigration04To05;
+import org.chorem.bow.BowMigration06To11;
+import org.chorem.bow.BowSession;
+import org.chorem.bow.action.BowBaseAction;
+import org.nuiton.util.VersionUtil;
+import org.nuiton.wikitty.WikittyProxy;
+
+/**
+ * Lance la migration des données de la version 0.4 vers 0.5
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class MigrateDataAction extends BowBaseAction {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(MigrateDataAction.class);
+
+ /** Version must be real version, like 0.4, 0.5 or 0.6 */
+ protected String versionFrom;
+ protected String versionTo;
+
+ public void setVersionFrom(String versionFrom) {
+ this.versionFrom = versionFrom;
+ }
+
+ public void setVersionTo(String versionTo) {
+ this.versionTo = versionTo;
+ }
+
+ @Override
+ public String execute() {
+ try {
+ if (StringUtils.isBlank(versionFrom) || StringUtils.isBlank(versionTo)) {
+ log.error("Migration action must have to parameter: versionFrom and versionTo");
+ } else {
+ BowSession session = getBowSession();
+ if (session.isAdmin()) { //If is admin
+ WikittyProxy proxy = getBowProxy();
+
+ if (VersionUtil.equals(versionFrom, "0.4")
+ && VersionUtil.equals(versionTo, "0.5")) {
+ BowMigration04To05.migrate(proxy);
+ addActionMessage(_("bow.admin.dataMigration.success"));
+ } else if (VersionUtil.equals(versionFrom, "0.6")
+ && VersionUtil.equals(versionTo, "1.1")) {
+ BowMigration06To11.migrate(proxy);
+ addActionMessage(_("bow.admin.dataMigration.success"));
+ } else {
+ addActionMessage(String.format(
+ "No migration found for %s to %s",
+ versionFrom, versionTo));
+ }
+ }
+ }
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
+ }
+ return SUCCESS;
+ }
+
+}
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/action/admin/ReIndexationAction.java (from rev 306, trunk/bow-ui/src/main/java/org/chorem/bow/action/ReIndexationAction.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/admin/ReIndexationAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/admin/ReIndexationAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,55 @@
+/*
+ * #%L
+ * bow
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package org.chorem.bow.action.admin;
+
+import org.chorem.bow.BowSession;
+import org.chorem.bow.action.BowBaseAction;
+import org.nuiton.wikitty.WikittyProxy;
+
+/**
+ * Lance la reindexation solr
+ *
+ * @author poussin
+ */
+public class ReIndexationAction extends BowBaseAction {
+
+ private static final long serialVersionUID = 6226574522402739559L;
+
+ @Override
+ public String execute() {
+ try {
+ BowSession session = getBowSession();
+ if (session.isAdmin()) { //If is admin
+ WikittyProxy proxy = getBowProxy();
+
+ proxy.getWikittyService().syncSearchEngine(proxy.getSecurityToken());
+ addActionMessage(_("bow.admin.reIndexationDone"));
+ }
+ } catch (Exception eee) {
+ addActionError(("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
+ }
+ return SUCCESS;
+ }
+}
\ No newline at end of file
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/AddOrUpdateAction.java (from rev 306, trunk/bow-ui/src/main/java/org/chorem/bow/action/AddUrlAction.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/AddOrUpdateAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/AddOrUpdateAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,266 @@
+/*
+ * #%L
+ * bow
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package org.chorem.bow.action.bookmark;
+
+import org.apache.commons.lang.StringUtils;
+import org.chorem.bow.BookmarkUtils;
+import org.chorem.bow.BowBookmark;
+import org.chorem.bow.BowUser;
+import org.chorem.bow.BowUtils;
+import org.chorem.bow.action.BowBaseAction;
+import org.nuiton.wikitty.WikittyProxy;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.search.PagedResult;
+import org.nuiton.wikitty.search.Search;
+
+/**
+ * Ajoute ou modifie un bookmark, soit par le formulaire,
+ * soit par un appel javascript
+ *
+ * @author poussin
+ */
+public class AddOrUpdateAction extends BowBaseAction {
+
+ private static final long serialVersionUID = 3389170166034184139L;
+
+ protected String bookmarkId;
+ protected String link;
+ protected String name;
+ protected String privateAlias;
+ protected String publicAlias;
+ protected String tags;
+ protected String nameAndTags;
+ protected String redirectTo;
+
+ public String getBookmarkId() {
+ return bookmarkId;
+ }
+
+ public void setBookmarkId(String bookmarkId) {
+ this.bookmarkId = bookmarkId;
+ }
+
+ /**
+ * @return the link
+ */
+ public String getLink() {
+ return link;
+ }
+
+ /**
+ * @param link the link to set
+ */
+ public void setLink(String link) {
+ this.link = link;
+ }
+
+ /**
+ * @return the description
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @param name the description to set
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * @return the privateAlias
+ */
+ public String getPrivateAlias() {
+ return privateAlias;
+ }
+
+ /**
+ * @param alias the privateAlias to set
+ */
+ public void setPrivateAlias(String alias) {
+ this.privateAlias = alias;
+ }
+
+ public String getPublicAlias() {
+ return publicAlias;
+ }
+
+ public void setPublicAlias(String publicAlias) {
+ this.publicAlias = publicAlias;
+ }
+
+ /**
+ * @return the tags
+ */
+ public String getTags() {
+ return tags;
+ }
+
+ /**
+ * @param tags the tags to set
+ */
+ public void setTags(String tags) {
+ this.tags = tags;
+ }
+
+ /**
+ * @return the nameAndTags
+ */
+ public String getNameAndTags() {
+ return nameAndTags;
+ }
+
+ /**
+ * @param nameAndTags the nameAndTags to set
+ */
+ public void setNameAndTags(String nameAndTags) {
+ this.nameAndTags = nameAndTags;
+ }
+
+ /**
+ * @return the redirectTo
+ */
+ public String getRedirectTo() {
+ return redirectTo;
+ }
+
+ @Override
+ public String execute() {
+ String result = SUCCESS;
+ try {
+ WikittyProxy proxy = getBowProxy();
+ BowBookmark bookmark = null;
+ BowBookmark bookmarkToModify = null;
+
+ BowUser user = getBowSession().getUser();
+ String userId = user.getWikittyId();
+ if (StringUtils.isNotBlank(bookmarkId)) {
+ bookmarkToModify = proxy.restore(BowBookmark.class, bookmarkId);
+ }
+ if (log.isDebugEnabled()) {
+ log.debug("Change old wikitty: " + bookmarkToModify);
+ }
+
+ // gere le cas d'une mise a jour ou d'un ajout via le formulaire
+ if (name != null) {
+ // Si l'alias prive souhaite est deja utilise on ne l'accept pas
+ // Si l'alias public souhaite est deja utilise on ne l'accept pas
+ // TODO sletellier 20110416 : return error message when public or private alias is already used
+ Criteria privateAliasCriteria = null;
+ Criteria publicAliasCriteria = null;
+ if (StringUtils.isNotEmpty(privateAlias)) {
+ privateAliasCriteria = Search.query()
+ .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_PRIVATEALIAS, privateAlias)
+ .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, userId)
+ .criteria().setEndIndex(0);
+ }
+ if (StringUtils.isNotEmpty(publicAlias)) {
+ publicAliasCriteria = Search.query()
+ .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_PUBLICALIAS, publicAlias)
+ .criteria().setEndIndex(0);
+ }
+ PagedResult<String>[] aliasResult = proxy.findAllIdByCriteria(
+ privateAliasCriteria, publicAliasCriteria);
+
+ if (aliasResult[0] != null && aliasResult[0].getNumFound() > 0) {
+ if (bookmarkToModify == null) {
+ privateAlias = "";
+ } else {
+ privateAlias = bookmarkToModify.getPrivateAlias();
+ }
+ }
+ if (aliasResult[1] != null && aliasResult[1].getNumFound() > 0) {
+ if (bookmarkToModify == null) {
+ publicAlias = "";
+ } else {
+ publicAlias = bookmarkToModify.getPublicAlias();
+ }
+ }
+
+ if (bookmarkToModify == null) {
+ bookmark = BookmarkUtils.createBookmark(
+ link, name, tags, user, privateAlias, publicAlias, null);
+ } else {
+ BookmarkUtils.updateBookmark(
+ bookmarkToModify, name, link, tags, privateAlias, publicAlias);
+ }
+ } else { //This part is for the bookmark addition by script
+ if (nameAndTags != null) {
+ bookmark = BookmarkUtils.createBookmark(link, nameAndTags, user);
+ }
+ }
+ // si on a reussi a creer le bookmark, on regarde s'il ne faut pas
+ // le fusionner avec un deja existant
+ if (bookmark != null && !bookmark.getDescription().isEmpty()
+ && !bookmark.getOwner().isEmpty()) {
+
+ // looking for already bookmark with same url, to fusion them
+ String link = bookmark.getLink();
+ Criteria criteria = Search.query()
+ .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_LINK, link)
+ .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, userId)
+ .criteria();
+ BowBookmark oldBookmark =
+ proxy.findByCriteria(BowBookmark.class, criteria);
+ if(oldBookmark != null) {
+ // fusionne les descriptions et les tags
+ // par contre on prend le dernier privateAlias prive choisi par
+ // l'utilisateur s'il y en a un
+ String description = oldBookmark.getDescription();
+ if (!StringUtils.isEmpty(bookmark.getDescription())) {
+ description += "\n";
+ description += BowUtils.formatDate(
+ bookmark.getCreationDate()) + ": ";
+ description += bookmark.getDescription();
+ }
+
+ oldBookmark.setDescription(description);
+ oldBookmark.addAllLabels(bookmark.getLabels());
+ String privateAlias = bookmark.getPrivateAlias();
+ if (!StringUtils.isEmpty(privateAlias)) {
+ oldBookmark.setPrivateAlias(privateAlias);
+ }
+
+ bookmark = oldBookmark;
+ }
+
+ }
+
+ if (bookmark != null || bookmarkToModify != null) {
+ proxy.store(bookmark, bookmarkToModify); //Stores the bookmark if everything is ok
+ addActionMessage(_("bow.bookmark.add.successful"));
+ if (log.isDebugEnabled()) {
+ log.debug("Adding URL");
+ }
+ }
+ redirectTo = BowUtils.redirectTo(tagLine, fullTextLine);
+ } catch (Exception eee) {
+ result = ERROR;
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
+ }
+ return result;
+ }
+}
\ No newline at end of file
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/DeleteSearchResultsAction.java (from rev 309, trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/DeleteSearchResultsAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/DeleteSearchResultsAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,75 @@
+/*
+ * #%L
+ * bow
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package org.chorem.bow.action.bookmark;
+
+import java.util.List;
+import org.apache.commons.lang.StringUtils;
+
+import org.chorem.bow.BookmarkUtils;
+import org.chorem.bow.BowUser;
+import org.chorem.bow.action.BowBaseAction;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.WikittyProxy;
+
+/**
+ * Supprime des bookmarks qui satisfont le critere de recherche.
+ *
+ * @author poussin
+ */
+public class DeleteSearchResultsAction extends BowBaseAction {
+
+ private static final long serialVersionUID = -3903724044644625507L;
+
+ /**
+ * Deletes the search results
+ */
+ public String execute() {
+ try {
+ if (StringUtils.isNotBlank(tagLine)
+ || StringUtils.isNotBlank(fullTextLine)) {
+ BowUser user = getBowSession().getUser();
+ // FIXME poussin 20110817 ATTENTION, la recherche remonte
+ // potentiellement des bookmarks qui ne nous appartiennent pas,
+ // dans ce cas, ne faudrait-il pas seulement ce supprimer des
+ // reader/write/admin ?
+ Criteria criteria = BookmarkUtils.getBookmarkListCriteriaByUser(
+ user, tagLine, fullTextLine, null);
+
+ WikittyProxy proxy = getBowProxy();
+ List<String> ids = proxy.findAllIdByCriteria(criteria).getAll();
+
+ if (log.isDebugEnabled()) {
+ log.debug("Will delete " + ids.size() + " bookmarks");
+ }
+
+ proxy.delete(ids);
+ addActionMessage(_("bow.search.results.deleted"));
+ }
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
+ }
+ return SUCCESS;
+ }
+}
\ No newline at end of file
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/EditAction.java (from rev 306, trunk/bow-ui/src/main/java/org/chorem/bow/action/EditBookmarkAction.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/EditAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/EditAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,76 @@
+/*
+ * #%L
+ * BOW UI
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package org.chorem.bow.action.bookmark;
+
+import org.chorem.bow.BowBookmark;
+import org.chorem.bow.BowBookmarkImpl;
+import org.chorem.bow.action.BowBaseAction;
+import org.nuiton.wikitty.WikittyProxy;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.search.Search;
+import org.nuiton.wikitty.search.operators.Element;
+
+/**
+ * Load a bookmark to display it on modification page
+ *
+ * @author sletellier
+ */
+public class EditAction extends BowBaseAction {
+ private static final long serialVersionUID = 1L;
+
+ protected String id;
+ protected BowBookmark bookmark;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public BowBookmark getBookmark() {
+ if (bookmark == null) {
+ bookmark = new BowBookmarkImpl();
+ }
+ return bookmark;
+ }
+
+ @Override
+ public String execute() throws Exception {
+ if (id == null) {
+ return SUCCESS;
+ }
+ try {
+ WikittyProxy proxy = getBowProxy();
+ Criteria criteria = Search.query()
+ .eq(Element.ELT_ID, id).criteria();
+ bookmark = proxy.findByCriteria(BowBookmark.class, criteria);
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
+ }
+ return SUCCESS;
+ }
+}
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/HomeAction.java (from rev 306, trunk/bow-ui/src/main/java/org/chorem/bow/action/HomeAction.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/HomeAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/HomeAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,110 @@
+/*
+ * #%L
+ * bow
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package org.chorem.bow.action.bookmark;
+
+import com.opensymphony.xwork2.ActionContext;
+import java.util.Arrays;
+import java.util.List;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.chorem.bow.BowSearchResult;
+import org.chorem.bow.BowSession;
+import org.chorem.bow.action.BowBaseAction;
+import org.nuiton.util.TimeLog;
+
+/**
+ * Prepare l'affichage de la page d'accueil
+ *
+ * @author poussin
+ */
+public class HomeAction extends BowBaseAction {
+
+ private static final Log log = LogFactory.getLog(HomeAction.class);
+ private static final TimeLog timeLog = new TimeLog(HomeAction.class);
+
+ private static final long serialVersionUID = -3735250067223062719L;
+
+ static public HomeAction getAction() {
+ Object action = ActionContext.getContext().get(CONTEXT_ACTION_KEY);
+ return (HomeAction) action;
+ }
+
+ protected String addTag;
+
+ protected BowSearchResult searchResult;
+
+ public String getAddTag() {
+ return addTag;
+ }
+
+ public void setAddTag(String addTag) {
+ this.addTag = addTag;
+ }
+
+ public BowSearchResult getSearchResult() {
+ return searchResult;
+ }
+
+ public void setSearchResult(BowSearchResult searchResult) {
+ this.searchResult = searchResult;
+ }
+
+ /**
+ * Load all data necessary form Home page
+ */
+ protected void load() {
+ // on ajoute les tags qui doivent faire parti de ne nouvelle recherche
+ // on restocke dans tagLine pour que la bonne info reapparaisse
+ // a l'utilisateur
+ tagLine = StringUtils.join(new String[]{tagLine, addTag}, " ").trim();
+
+ // si l'ordre souhaite n'existe pas, on utilise l'ordre par defaut
+ if (!getPossibleOrder().contains(order)) {
+ // default sort order
+ // TODO poussin 20110815 rendre configurable par l'utilisateur l'ordre par defaut qu'il prefere
+ order = "descClick";
+ }
+
+ BowSession session = getBowSession();
+ searchResult = new BowSearchResult(session, tagLine, fullTextLine, order);
+ }
+
+ /**
+ * Initializes everything before displaying the home page
+ */
+ @Override
+ public String execute() {
+ long start = TimeLog.getTime();
+ try {
+ load();
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
+ }
+ timeLog.log(start, "execute");
+ return SUCCESS;
+ }
+}
\ No newline at end of file
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/RemoveAction.java (from rev 306, trunk/bow-ui/src/main/java/org/chorem/bow/action/RemoveBookmarkAction.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/RemoveAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/bookmark/RemoveAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,82 @@
+/*
+ * #%L
+ * bow
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package org.chorem.bow.action.bookmark;
+
+import org.apache.commons.lang.StringUtils;
+import org.chorem.bow.BowUtils;
+import org.chorem.bow.action.BowBaseAction;
+import org.nuiton.wikitty.WikittyProxy;
+
+/**
+ * Supprime un bookmark
+ *
+ * @author poussin
+ */
+public class RemoveAction extends BowBaseAction {
+
+ private static final long serialVersionUID = 820566716695285561L;
+
+ protected String bookmarkId;
+ protected String redirectTo;
+
+ /**
+ * @return the bookmarkId
+ */
+ public String getBookmarkId() {
+ return bookmarkId;
+ }
+
+ /**
+ * @param bookmarkId the bookmarkId to set
+ */
+ public void setBookmarkId(String bookmarkId) {
+ this.bookmarkId = bookmarkId;
+ }
+
+ /**
+ * @return the redirectTo
+ */
+ public String getRedirectTo() {
+ return redirectTo;
+ }
+
+ /**
+ * Removes a bookmark
+ */
+ @Override
+ public String execute() {
+ if (StringUtils.isNotEmpty(bookmarkId)) {
+ try {
+ WikittyProxy proxy = getBowProxy();
+ proxy.delete(bookmarkId);
+ addActionMessage(_("bow.bookmark.remove.successful"));
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error("Can't do action", eee);
+ }
+ }
+ redirectTo = BowUtils.redirectTo(tagLine, fullTextLine);
+ return SUCCESS;
+ }
+}
\ No newline at end of file
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/action/login/ForgotPasswordAction.java (from rev 306, trunk/bow-ui/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/login/ForgotPasswordAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/login/ForgotPasswordAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,124 @@
+/*
+ * #%L
+ * bow
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package org.chorem.bow.action.login;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.AddressException;
+
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.commons.lang.StringUtils;
+import org.chorem.bow.BowMail;
+import org.chorem.bow.BowUser;
+import org.chorem.bow.action.BowBaseAction;
+import org.nuiton.util.StringUtil;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.WikittyProxy;
+import org.nuiton.wikitty.search.Search;
+
+/**
+ * Genere un nouveau mot de passe pour l'utilisateur et lui envoie par mail
+ * TODO poussin 20110211 il faudrait ajouter une securite pour eviter que
+ * quelqu'un s'amuse a demander la modification de password de quelqu'un d'autre
+ * toutes les 2s
+ * - soit en ne permettant l'envoi qu'une fois par jour
+ * - soit ????
+ *
+ * @author poussin
+ */
+public class ForgotPasswordAction extends BowBaseAction {
+ private static final long serialVersionUID = -8207951465957204954L;
+ protected String email;
+
+ /**
+ * @return the email
+ */
+ public String getEmail() {
+ return email;
+ }
+
+ /**
+ * @param email the email to set
+ */
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ /**
+ * Generates a new password and sends it to the user
+ */
+ @Override
+ public String execute() {
+ String result = INPUT;
+
+ try {
+ if (StringUtils.isNotBlank(email)) {
+ email = email.trim();
+ WikittyProxy proxy = getBowProxy();
+ Criteria criteria = Search.query()
+ .eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria();
+ BowUser user = proxy.findByCriteria(BowUser.class, criteria);
+
+ if (user != null) { //If the email address exists
+ String password = "";
+ String md5 = "";
+
+ password = RandomStringUtils.randomAlphanumeric(20);
+ md5 = StringUtil.encodeMD5(password);
+ try {
+ String mailContent;
+
+ mailContent = _("bow.register.mailHi") +
+ ",\n\n" + _("bow.register.mailPwd") + ": " +
+ password + "\n\n" + _("bow.register.mailEmail") +
+ ": " + email + "\n\n";
+ BowMail.sendMail(email,
+ _("bow.register.mailSubject"),
+ mailContent);
+
+ //The password is changed only if the mail has been sent
+ user.setPassword(md5);
+ proxy.store(user);
+ } catch (AddressException eee) {
+ //If the email address is invalid
+ addActionError(_("bow.mail.badFormat"));
+ log.error(String.format("Can't send message email to '%s'",
+ email), eee);
+ } catch (MessagingException eee) {
+ addActionError("bow.mail.sendError");
+ log.error(String.format("Can't send message email to '%s'",
+ email), eee);
+ }
+ result = SUCCESS;
+ } else { //If the email is not associated with an account
+ addFieldError("email",
+ _("bow.forgotPassword.emailDoesntExist"));
+ }
+ }
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
+ }
+ return result;
+ }
+}
\ No newline at end of file
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/action/login/LoginAction.java (from rev 306, trunk/bow-ui/src/main/java/org/chorem/bow/action/LoginAction.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/login/LoginAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/login/LoginAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,130 @@
+/*
+ * #%L
+ * bow
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+
+package org.chorem.bow.action.login;
+
+import org.apache.commons.lang.StringUtils;
+
+import org.chorem.bow.BowConfig;
+import org.chorem.bow.BowUser;
+import org.chorem.bow.BowUserImpl;
+import org.chorem.bow.action.BowBaseAction;
+import org.nuiton.util.StringUtil;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.WikittyProxy;
+import org.nuiton.wikitty.search.Search;
+
+/**
+ * authentifie l'utilisateur et place son objet User dans la bow session
+ *
+ * @author poussin
+ */
+public class LoginAction extends BowBaseAction {
+
+ private static final long serialVersionUID = 6891064800288772246L;
+
+ protected String email;
+ protected String password;
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ /**
+ * Check password in solr index, if fail try to check password admin in config file
+ *
+ * @param email non null et non vide email
+ * @param password non null et non vide email
+ * @return
+ */
+ protected BowUser checkLogin(String email, String password) {
+ BowUser result = null;
+
+ WikittyProxy proxy = getBowProxy();
+ Criteria criteria = Search.query().eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).
+ eq(BowUser.FQ_FIELD_WIKITTYUSER_PASSWORD, password).criteria();
+ result = proxy.findByCriteria(BowUser.class, criteria);
+
+ if (result == null) {
+ // failback: try to authenticate admin with config info
+ String configPassword = BowConfig.getAdminPassword(email);
+ log.info(String.format("failback password: '%s' configPassword: '%s'",
+ password, configPassword));
+ if (password.equals(configPassword)) {
+ // admin authenticate with config, this is possible when
+ // solr index is corrupted or missed. Admin must go to admin
+ // page en recreate index
+ result = new BowUserImpl();
+ result.setLogin(email);
+ result.setPassword(configPassword);
+ addActionMessage(_("bow.login.admin.failback"));
+ log.warn(_("bow.login.admin.failback"));
+ } else {
+ addActionError(_("bow.login.authenticationFailure"));
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Authenticates the user if his email and password are valid
+ */
+ @Override
+ public String execute() {
+ String result = INPUT;
+
+ try {
+ if (StringUtils.isNotBlank(email)) {
+ email = email.trim();
+
+ if (StringUtils.isNotEmpty(password)) {
+ String md5 = StringUtil.encodeMD5(password);
+ BowUser user;
+
+ user = checkLogin(email, md5);
+ if (user != null) {
+ getBowSession().setUser(user);
+ result = SUCCESS;
+ }
+ }
+ }
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
+ }
+ return result;
+ }
+}
\ No newline at end of file
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/action/login/LogoutAction.java (from rev 306, trunk/bow-ui/src/main/java/org/chorem/bow/action/LogoutAction.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/login/LogoutAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/login/LogoutAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,42 @@
+/*
+ * #%L
+ * bow
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package org.chorem.bow.action.login;
+
+import org.chorem.bow.BowSession;
+import org.chorem.bow.action.BowBaseAction;
+
+/**
+ * Invalide la session courante et donc de-authentifie l'utilisateur
+ *
+ * @author poussin
+ */
+public class LogoutAction extends BowBaseAction {
+ private static final long serialVersionUID = 4806944250461551896L;
+
+ @Override
+ public String execute() {
+ BowSession.invalidate(session);
+ return SUCCESS;
+ }
+}
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/action/login/RegisterAction.java (from rev 306, trunk/bow-ui/src/main/java/org/chorem/bow/action/RegisterAction.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/login/RegisterAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/login/RegisterAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,179 @@
+/*
+ * #%L
+ * bow
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package org.chorem.bow.action.login;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.AddressException;
+import org.apache.commons.lang.StringUtils;
+
+import org.chorem.bow.BowMail;
+import org.chorem.bow.BowUser;
+import org.chorem.bow.BowUserImpl;
+import org.chorem.bow.BowUtils;
+import org.chorem.bow.action.BowBaseAction;
+import org.nuiton.util.StringUtil;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.WikittyProxy;
+import org.nuiton.wikitty.search.Search;
+
+/**
+ * Enregistre un nouvel utilisateur
+ *
+ * @author poussin
+ */
+public class RegisterAction extends BowBaseAction {
+
+ private static final long serialVersionUID = 2204772861770399542L;
+
+ protected String email;
+ protected String password;
+ protected String repeatPassword;
+
+ /**
+ * @return the email
+ */
+ public String getEmail() {
+ return email;
+ }
+
+ /**
+ * @param email the email to set
+ */
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ /**
+ * @return the password
+ */
+ public String getPassword() {
+ return password;
+ }
+
+ /**
+ * @param password the password to set
+ */
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ /**
+ * @return the repeatPassword
+ */
+ public String getRepeatPassword() {
+ return repeatPassword;
+ }
+
+ /**
+ * @param repeatPassword the repeatPassword to set
+ */
+ public void setRepeatPassword(String repeatPassword) {
+ this.repeatPassword = repeatPassword;
+ }
+
+ /**
+ *
+ * @param email non null and non blank email
+ * @return false if the email address isn't already registered, true
+ * otherwise
+ */
+ protected boolean alreadyRegistered(String email) {
+ boolean result = true;
+
+ WikittyProxy proxy = getBowProxy();
+ //Retrieves user by user name (email)
+ Criteria criteria = Search.query()
+ .eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria();
+
+ result = proxy.findByCriteria(BowUser.class, criteria) != null;
+ //If the user doesn't already exist
+ if (result) {
+ //The email address is already used by someone
+ addFieldError("email", _("bow.register.emailAldyUsed"));
+ }
+ return result;
+ }
+
+ /**
+ * Registers the new user and sends an email to confirm registration
+ */
+ @Override
+ public String execute() {
+ String result = INPUT;
+
+ try {
+ if (StringUtils.isNotBlank(email)) {
+ email = email.trim();
+ if (StringUtils.isNotBlank(password)) {
+ if (!password.equals(repeatPassword)) {
+ addActionError(_("bow.register.pwdDontMatch"));
+ } else {
+ String md5 = StringUtil.encodeMD5(password);
+
+ //If the email address isn't already used
+ if (!alreadyRegistered(email)) {
+ WikittyProxy proxy = getBowProxy();
+ BowUserImpl newUser = new BowUserImpl();
+ newUser.setPassword(md5);
+ newUser.setLogin(email);
+ String permanentToken = BowUtils.generateToken();
+ newUser.setPermanentToken(permanentToken);
+ BowUser login = proxy.store(newUser); //Stores the new user
+
+ //If there was an error when storing the user
+ if (login == null) {
+ addFieldError("email", _("bow.register.invalidLogin"));
+ } else {
+ getBowSession().setUser(login);
+ try {
+ String mailContent;
+
+ mailContent =
+ _("bow.register.mailHi") + ",\n\n" +
+ _("bow.register.mailPwd") + ": " + password + "\n\n" +
+ _("bow.register.mailEmail") + ": " + email + "\n\n";
+ BowMail.sendMail(email, _("bow.register.mailSubject"), mailContent);
+ } catch (AddressException eee) {
+ //If the email address is invalid
+ addActionError(_("bow.mail.badFormat"));
+ log.error(String.format("Can't send message email to '%s'",
+ email), eee);
+ } catch (MessagingException eee) {
+ addActionError("bow.mail.sendError");
+ log.error(String.format("Can't send message email to '%s'",
+ email), eee);
+ }
+ result = SUCCESS;
+ }
+ }
+ }
+ }
+ }
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
+ }
+ return result;
+ }
+}
Added: trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/AdminTagAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/AdminTagAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/AdminTagAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,93 @@
+package org.chorem.bow.action.preference;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.chorem.bow.BowBookmark;
+import org.chorem.bow.BowProxy;
+import org.chorem.bow.BowUser;
+import org.nuiton.wikitty.entities.WikittyLabel;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.search.PagedResult;
+import org.nuiton.wikitty.search.Search;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class AdminTagAction extends PreferenceBaseAction {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(AdminTagAction.class);
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * ACTION STRUTS
+ *
+ * Fait les modification demandé par l'utilisateur dans l'interface de
+ * preference: renome ou supprime des labels. Si l'utilisateur demande le
+ * remplacement de label on indiquant pas de nouveau label, alors la chaine
+ * vide est utilisee.
+ *
+ * @return
+ */
+ @Override
+ public String execute() {
+ String result = SUCCESS;
+ try {
+ if (log.isDebugEnabled()) {
+ log.debug("Selected labels: " + Arrays.toString(selectedLabels));
+ log.debug("action delete: " + delete + " rename: " + rename);
+ }
+
+ List<String> selectedLabelsList = Arrays.asList(selectedLabels);
+ boolean isRename = StringUtils.isNotEmpty(rename);
+
+ BowProxy proxy = getBowProxy();
+ BowUser user = getBowSession().getUser();
+ String userId = user.getWikittyId();
+
+ Criteria c = Search.query()
+ .in(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS, selectedLabelsList)
+ .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, userId)
+ .criteria();
+ PagedResult<WikittyLabel> searchResult =
+ proxy.findAllByCriteria(WikittyLabel.class, c);
+
+ List<WikittyLabel> toStore = new ArrayList<WikittyLabel>();
+ for (WikittyLabel label : searchResult) {
+ toStore.add(label);
+ Set<String> l = label.getLabels();
+ if (l != null) {
+ // on fait une copie, car l retourne est non modifiable
+ l = new HashSet<String>(l);
+ l.removeAll(selectedLabelsList);
+ if (isRename) {
+ l.add(newLabel);
+ }
+ label.setLabels(l);
+ }
+ }
+ proxy.store(toStore);
+
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
+ } finally {
+ // on recharge les data apres l'action pour l'affichage
+ load();
+ }
+ return result;
+
+ }
+
+}
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/DeleteImportAction.java (from rev 306, trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteImportAction.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/DeleteImportAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/DeleteImportAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,95 @@
+/*
+ * #%L
+ * bow
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package org.chorem.bow.action.preference;
+
+import java.util.List;
+
+import org.chorem.bow.BowBookmark;
+import org.chorem.bow.BowImport;
+import org.chorem.bow.BowUser;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.WikittyProxy;
+import org.nuiton.wikitty.search.Search;
+
+
+/**
+ * Supprime un import de bookmark
+ *
+ * @author poussin
+ */
+public class DeleteImportAction extends PreferenceBaseAction {
+ private static final long serialVersionUID = 8714394293884265516L;
+ protected String date;
+
+ /**
+ * @return the date
+ */
+ public String getDate() {
+ return date;
+ }
+ /**
+ * @param date the date to set
+ */
+ public void setDate(String date) {
+ this.date = date;
+ }
+
+ /**
+ * Deletes a bookmark import
+ */
+ public String execute() {
+ String result = SUCCESS;
+ try {
+ if (date != null &&
+ // XXX poussin 20110818 y'a-t-il vraiment une utilite a checker
+ // que la date verifie le pattern ?
+ // car on pire on ne retrouve rien et donc on ne supprime rien
+ date.matches("[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{1,3}Z")) {
+ WikittyProxy proxy = getBowProxy();
+ BowUser user = getBowSession().getUser();
+ Criteria criteria = Search.query()
+ .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, user.getWikittyId())
+ .eq(BowImport.FQ_FIELD_BOWIMPORT_IMPORTDATE, date).criteria();
+ List<BowImport> bookmarks = proxy.findAllByCriteria(BowImport.class, criteria).getAll();
+
+ if (log.isDebugEnabled()) {
+ log.debug("Will delete " + bookmarks.size() + " bookmarks");
+ }
+
+ proxy.delete(bookmarks);
+
+ addActionMessage(_("bow.bookmark.import.delete.successful"));
+ }
+ } catch (Exception e) {
+ result = ERROR;
+ addActionError(_("bow.error.internal"));
+ log.error(e.getMessage(), e);
+ } finally {
+ // on recharge les data apres l'action pour l'affichage
+ load();
+ }
+ return result;
+ }
+
+}
\ No newline at end of file
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/ExportBookmarksAction.java (from rev 310, trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/ExportBookmarksAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/ExportBookmarksAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,139 @@
+/*
+ * #%L
+ * bow
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package org.chorem.bow.action.preference;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Writer;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.struts2.interceptor.ServletResponseAware;
+import org.chorem.bow.BowBookmark;
+import org.chorem.bow.BookmarkUtils;
+import org.chorem.bow.BowUser;
+import org.chorem.bow.action.BowBaseAction;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.WikittyProxy;
+import org.nuiton.wikitty.search.Search;
+
+/**
+ * Export son bookmark au format HTML
+ *
+ * @author poussin
+ */
+public class ExportBookmarksAction extends BowBaseAction implements ServletResponseAware {
+ private static final long serialVersionUID = 45880214686011946L;
+ protected HttpServletResponse response;
+ protected InputStream inputStream;
+
+ @Override
+ public void setServletResponse(HttpServletResponse response) {
+ this.response = response;
+ }
+
+ public InputStream getInputStream() {
+ return inputStream;
+ }
+
+ /**
+ * Export tous les bookmarks au format HTML tel que le fait les navigateurs
+ *
+ * @param bookmarks List<Bookmarks> bookmarks
+ * @param out le flux dans lequel il faut ecrire l'export
+ * @return String the html file
+ */
+ protected void generateExportHtmlBookmark(List<BowBookmark> bookmarks, Writer out) throws IOException {
+ out.write("<!DOCTYPE NETSCAPE-Bookmark-file-1>\n"
+ + "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\">\n"
+ + "<DL><p>\n");
+ if (bookmarks != null) {
+ for (BowBookmark bookmark : bookmarks) {
+ if (bookmark != null) {
+ out.write("<DT><A HREF=\"");
+ out.write(bookmark.getLink() + "\" ");
+ Date date = bookmark.getCreationDate();
+ if (date != null) {
+ long milli = date.getTime();
+ String time = String.valueOf(milli / 1000);
+ out.write("ADD_DATE=\"" + time + "\" LAST_MODIFIED=\"" + time + "\" ");
+ }
+ out.write("LAST_CHARSET=\"UTF-8\" ");
+ Set<String> tags = bookmark.getLabels();
+ if (tags != null && !tags.isEmpty()) {
+ out.write("SHORTCUTURL=\""
+ + BookmarkUtils.getBookmarkTagsString(bookmark) + "\"");
+ }
+ out.write(">" + bookmark.getDescription() + "</A>\n");
+ }
+ }
+ }
+ out.write("</DL><p>");
+ }
+
+ /**
+ * Exports the bookmarks in HTML format
+ */
+ @Override
+ public String execute() {
+ WikittyProxy proxy = getBowProxy();
+
+ // get current user
+ BowUser user = getBowSession().getUser();
+
+ // Get all bookmark for user
+ Criteria criteria = Search.query()
+ .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, user.getWikittyId()).criteria();
+ List<BowBookmark> bookmarks = proxy.findAllByCriteria(BowBookmark.class, criteria).getAll();
+
+ // Export all
+ BufferedWriter out = null;
+
+ try {
+
+ // Write result in temp file
+ File tmp = File.createTempFile("bookmarks", ".tmp.html");
+
+ tmp.deleteOnExit();
+ out = new BufferedWriter(new FileWriter(tmp));
+ generateExportHtmlBookmark(bookmarks, out);
+ out.close();
+
+ inputStream = new FileInputStream(tmp);
+ } catch (IOException eee) {
+ log.error("Error when exporting bookmarks to HTML : ", eee);
+ } finally {
+ IOUtils.closeQuietly(out);
+ }
+ return SUCCESS;
+ }
+}
\ No newline at end of file
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/GenerateTokenAction.java (from rev 312, trunk/bow-ui/src/main/java/org/chorem/bow/action/GenerateTokenAction.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/GenerateTokenAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/GenerateTokenAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,46 @@
+package org.chorem.bow.action.preference;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.chorem.bow.BowProxy;
+import org.chorem.bow.BowUser;
+import org.chorem.bow.BowUtils;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class GenerateTokenAction extends PreferenceBaseAction {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(GenerateTokenAction.class);
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public String execute() {
+ try {
+ BowUser user = getBowSession().getUser();
+ BowProxy proxy = getBowProxy();
+
+ String permanentToken = BowUtils.generateToken();
+ user.setPermanentToken(permanentToken);
+ proxy.store(user);
+
+ String temporaryToken = BowUtils.generateToken();
+ getBowSession().setTemporaryToken(temporaryToken);
+ addActionMessage(_("bow.token.generate.successful"));
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error("Can't regenerate token", eee);
+ } finally {
+ // on recharge les data apres l'action pour l'affichage
+ load();
+ }
+ return SUCCESS;
+ }
+
+}
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/ImportBookmarksAction.java (from rev 310, trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/ImportBookmarksAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/ImportBookmarksAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,260 @@
+/*
+ * #%L
+ * bow
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package org.chorem.bow.action.preference;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.apache.commons.lang.StringUtils;
+
+import org.chorem.bow.BookmarkUtils;
+import org.chorem.bow.BowBookmark;
+import org.chorem.bow.BowImportHelper;
+import org.chorem.bow.BowUser;
+import org.htmlparser.Node;
+import org.htmlparser.Parser;
+import org.htmlparser.util.NodeList;
+import org.htmlparser.util.ParserException;
+import org.htmlparser.util.SimpleNodeIterator;
+import org.nuiton.wikitty.WikittyProxy;
+import org.nuiton.wikitty.entities.Wikitty;
+
+/**
+ * Import un bookmark HTML
+ *
+ * @author poussin
+ */
+public class ImportBookmarksAction extends PreferenceBaseAction {
+
+ private static final long serialVersionUID = -5962680416570797028L;
+
+ protected File upfile;
+ protected String upfileContentType;
+ protected String upfileFileName;
+
+ /**
+ * @return the upfile
+ */
+ public File getUpfile() {
+ return upfile;
+ }
+
+ /**
+ * @param upfile
+ * the upfile to set
+ */
+ public void setUpfile(File upfile) {
+ this.upfile = upfile;
+ }
+
+ /**
+ * @return the upfileContentType
+ */
+ public String getUpfileContentType() {
+ return upfileContentType;
+ }
+
+ /**
+ * @param upfileContentType
+ * the upfileContentType to set
+ */
+ public void setUpfileContentType(String upfileContentType) {
+ this.upfileContentType = upfileContentType;
+ }
+
+ /**
+ * @return the upfileFileName
+ */
+ public String getUpfileFileName() {
+ return upfileFileName;
+ }
+
+ /**
+ * @param upfileFileName
+ * the upfileFileName to set
+ */
+ public void setUpfileFileName(String upfileFileName) {
+ this.upfileFileName = upfileFileName;
+ }
+
+ /**
+ * @param html String html
+ * @param name String name
+ * @param user User user
+ * @return Bookmark the bookmark filled
+ */
+ protected BowBookmark createBookmarkFromHtml(String html, String name, BowUser user) {
+ String link = getUrlFromHtml(html);
+ String tags = getTagsFromHtml(html);
+ Date date = getDateFromHtml(html);
+ BowBookmark bookmark = BookmarkUtils.createBookmark(link, name, tags, user, null, null, date);
+ return bookmark;
+ }
+
+ /**
+ * @param html String html
+ * @return Date from the html
+ */
+ protected Date getDateFromHtml(String html) {
+ Date date = null;
+ if (html != null) {
+ Pattern p = Pattern.compile("ADD_DATE=\"([^\"]*)\"");
+ Matcher m = p.matcher(html);
+ if (m.find()) {
+ String str = m.group(1);
+ if (str != null && !str.isEmpty()) {
+ long time = Long.valueOf(str) * 1000; // the date in ms
+ date = new Date(time);
+ }
+ }
+ }
+ return date;
+ }
+
+ /**
+ * @param html String html
+ * @return url
+ */
+ protected String getUrlFromHtml(String html) {
+ String url = "";
+ if (html != null) {
+ Pattern p = Pattern.compile("A HREF=\"([^\"]*)\"");
+ Matcher m = p.matcher(html);
+ if (m.find()) {
+ url = m.group(1);
+ }
+ }
+ return url;
+ }
+
+ protected String getTagsFromHtml(String html) {
+ String tags = "";
+ if (html != null) {
+ Pattern p = Pattern.compile("SHORTCUTURL=\"([^\"]*)\"");
+ Matcher m = p.matcher(html);
+ if (m.find()) {
+ tags = m.group(1);
+ }
+ }
+ return tags;
+ }
+
+ protected void parseHtmlToBookmarks(NodeList list, BowUser user, Date date,
+ List<BowBookmark> bookmarks, Set<String> tagList)
+ throws ParserException {
+
+ SimpleNodeIterator it = list.elements();
+
+ while (it.hasMoreNodes()) {
+ Node node = it.nextNode();
+ String plainText = node.toPlainTextString(); // The text between
+ // two heads ==>
+ // <toto>plainText</toto>
+ String text = node.getText(); // The text in the head ==>
+ // <text></toto>
+
+ if (StringUtils.startsWithIgnoreCase(text, "h3")) { // H3 = folder
+ if (StringUtils.isNotBlank(plainText)) {
+ tagList.add(plainText); // Adds the folder name to the
+ // tagList
+ }
+ } else if (StringUtils.startsWithIgnoreCase(text, "a href")) { // HREF
+ // = new
+ // bookmarks
+ BowBookmark bookmark = createBookmarkFromHtml(text, plainText, user);
+ Wikitty w = getBowProxy().getWikitty(bookmark);
+ BowImportHelper.addExtension(w);
+ BowImportHelper.setImportDate(w, date);
+
+ bookmark.addAllLabels(tagList);
+
+ bookmarks.add(bookmark);
+ }
+ NodeList children = node.getChildren();
+
+ if (children != null) {
+ parseHtmlToBookmarks(children, user, date, bookmarks,
+ // On utilise une nouvelle liste pour les enfants
+ // pour eviter que les tags de tous les enfants se
+ // retrouve ensemble
+ new HashSet<String>(tagList)); // If there is an under node = recursion
+ }
+ }
+ }
+
+ @Override
+ public String execute() {
+ String result = SUCCESS;
+ log.info("Importing boormarks : " + upfile);
+ try {
+ BowUser user = getBowSession().getUser();
+
+ // Struts limite to html files, is null if not one
+ if (upfile != null) {
+ WikittyProxy proxy = getBowProxy();
+
+ try {
+ URL url = upfile.toURI().toURL();
+ Parser parser = new Parser(url.openConnection());
+ NodeList list = parser.parse(null);
+
+ List<BowBookmark> bookmarks = new ArrayList<BowBookmark>();
+ parseHtmlToBookmarks(list, user, new Date(), bookmarks,
+ new HashSet<String>());
+ proxy.store(bookmarks);
+
+ addActionMessage(_("bow.bookmark.import.successful"));
+ } catch (ParserException eee) {
+ result = ERROR;
+ log.error(String.format("Can't parse imported file '%s'",
+ getUpfileFileName()), eee);
+ addActionError(_("bow.bookmark.badFileFormat"));
+ } catch (IOException eee) {
+ result = ERROR;
+ log.error(String.format("Can't read imported file '%s'",
+ getUpfileFileName()), eee);
+ addActionError(_("bow.error.internal"));
+ }
+ } else {
+ addActionError(_("bow.bookmark.badFileFormat"));
+ result = ERROR;
+ }
+ } catch (Exception eee) {
+ result = ERROR;
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
+ } finally {
+ // on recharge les data apres l'action pour l'affichage
+ load();
+ }
+ return result;
+ }
+}
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/PreferenceBaseAction.java (from rev 309, trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/PreferenceBaseAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/PreferenceBaseAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,421 @@
+/*
+ * #%L
+ * bow
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package org.chorem.bow.action.preference;
+
+import org.chorem.bow.BowBookmark;
+import org.chorem.bow.BowProxy;
+import org.chorem.bow.BowUser;
+import com.opensymphony.xwork2.ActionContext;
+import java.text.ParseException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.chorem.bow.BowImport;
+import org.chorem.bow.BowSession;
+import org.chorem.bow.action.BowBaseAction;
+
+import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.Wikitty;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.search.FacetTopic;
+import org.nuiton.wikitty.search.PagedResult;
+import org.nuiton.wikitty.search.Search;
+
+/**
+ * Change les preferences de l'utilisateur (couleur, password, email, ...)
+ *
+ * @author poussin
+ */
+public class PreferenceBaseAction extends BowBaseAction {
+ private static final long serialVersionUID = -58341106356599721L;
+
+ static public PreferenceBaseAction getAction() {
+ Object action = ActionContext.getContext().get(CONTEXT_ACTION_KEY);
+ return (PreferenceBaseAction) action;
+ }
+
+ /** la liste des differentes data que l'on peut charger */
+ protected enum PreferenceType{USER_PREF, SITE_PREF, LABELS, IMPORTS};
+
+ protected String colors;
+ protected String tagsNb;
+ protected String bookmarksHomePage;
+ protected String searchEngineUrlSuggestions;
+ protected String searchEngineUrlResults;
+ protected String email;
+ protected String newPassword;
+ protected String currentPassword;
+ protected String confirmNewPassword;
+ protected String update;
+ protected Map<String, Integer> bookmarksImportDate;
+
+ protected List<FacetTopic> labels;
+ protected String[] selectedLabels;
+ protected String rename;
+ protected String delete;
+ protected String newLabel;
+
+ public String getNewLabel() {
+ return newLabel;
+ }
+
+ public void setNewLabel(String newLabel) {
+ this.newLabel = newLabel;
+ }
+
+ public void setRename(String rename) {
+ this.rename = rename;
+ }
+
+ public String getRename() {
+ return rename;
+ }
+
+ public void setDelete(String delete) {
+ this.delete = delete;
+ }
+
+ public String getDelete() {
+ return delete;
+ }
+
+ /**
+ * @return the colors
+ */
+ public String getColors() {
+ return colors;
+ }
+
+ /**
+ * @param colors the colors to set
+ */
+ public void setColors(String colors) {
+ this.colors = colors;
+ }
+
+ /**
+ * @return the tagsNb
+ */
+ public String getTagsNb() {
+ return tagsNb;
+ }
+
+ /**
+ * @param tagsNb the tagsNb to set
+ */
+ public void setTagsNb(String tagsNb) {
+ this.tagsNb = tagsNb;
+ }
+
+ /**
+ * @return the bookmarksHomePage
+ */
+ public String getBookmarksHomePage() {
+ return bookmarksHomePage;
+ }
+
+ /**
+ * @param bookmarksHomePage the bookmarksHomePage to set
+ */
+ public void setBookmarksHomePage(String bookmarksHomePage) {
+ this.bookmarksHomePage = bookmarksHomePage;
+ }
+
+ /**
+ * @return the searchEngineUrlSuggestions
+ */
+ public String getSearchEngineUrlSuggestions() {
+ return searchEngineUrlSuggestions;
+ }
+
+ /**
+ * @param searchEngineUrlSuggestions the searchEngineUrlSuggestions to set
+ */
+ public void setSearchEngineUrlSuggestions(String searchEngineUrlSuggestions) {
+ this.searchEngineUrlSuggestions = searchEngineUrlSuggestions;
+ }
+
+ /**
+ * @return the searchEngineUrlResults
+ */
+ public String getSearchEngineUrlResults() {
+ return searchEngineUrlResults;
+ }
+
+ /**
+ * @param searchEngineUrlResults the searchEngineUrlResults to set
+ */
+ public void setSearchEngineUrlResults(String searchEngineUrlResults) {
+ this.searchEngineUrlResults = searchEngineUrlResults;
+ }
+
+ /**
+ * @return the email
+ */
+ public String getEmail() {
+ return email;
+ }
+
+ /**
+ * @param email the email to set
+ */
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ /**
+ * @return the newPassword
+ */
+ public String getNewPassword() {
+ return newPassword;
+ }
+
+ /**
+ * @param newPassword the newPassword to set
+ */
+ public void setNewPassword(String newPassword) {
+ this.newPassword = newPassword;
+ }
+
+ /**
+ * @return the currentPassword
+ */
+ public String getCurrentPassword() {
+ return currentPassword;
+ }
+
+ /**
+ * @param currentPassword the currentPassword to set
+ */
+ public void setCurrentPassword(String currentPassword) {
+ this.currentPassword = currentPassword;
+ }
+
+ /**
+ * @return the confirmNewPassword
+ */
+ public String getConfirmNewPassword() {
+ return confirmNewPassword;
+ }
+
+ /**
+ * @param confirmNewPassword the confirmNewPassword to set
+ */
+ public void setConfirmNewPassword(String confirmNewPassword) {
+ this.confirmNewPassword = confirmNewPassword;
+ }
+
+ /**
+ * @return the update
+ */
+ public String getUpdate() {
+ return update;
+ }
+
+ /**
+ * @param update the update to set
+ */
+ public void setUpdate(String update) {
+ this.update = update;
+ }
+
+ /**
+ * @return the bookmarksImportDate
+ */
+ public Map<String, Integer> getBookmarksImportDate() {
+ return bookmarksImportDate;
+ }
+
+ /**
+ * @param bookmarksImportDate the bookmarksImportDate to set
+ */
+ public void setBookmarksImportDate(Map<String, Integer> bookmarksImportDate) {
+ this.bookmarksImportDate = bookmarksImportDate;
+ }
+
+ public List<FacetTopic> getLabels() {
+ return labels;
+ }
+
+ public String[] getSelectedLabels() {
+ return selectedLabels;
+ }
+
+ public void setSelectedLabels(String[] selectedLabels) {
+ this.selectedLabels = selectedLabels;
+ }
+
+ /**
+ * Date est une date mais au format String qui vient de Solr
+ * Elle est de la forme '2011-08-18T00:25:16.028Z'
+ * qui n'est pas presentable a l'utilisateur
+ * On la remet sous une vrai forme date
+ *
+ * Cette methode est utilise dans la JSP de rendu
+ */
+ public Date stringToDate(String date) {
+ try {
+ Date result = WikittyUtil.parseDate(date);
+ return result;
+ } catch (ParseException eee) {
+ return new Date(0);
+ }
+ }
+
+ /**
+ * Load les données sauf celle que l'on demande d'exclure du load
+ * @param exclude
+ */
+ protected void load(PreferenceType ... exclude) {
+ PreferenceType[] list = PreferenceType.values();
+ for (PreferenceType type : exclude) {
+ list[type.ordinal()] = null;
+ }
+
+ for (PreferenceType type : list) {
+ if (type != null) {
+ switch(type) {
+ case USER_PREF:
+ loadUserPref();
+ break;
+ case SITE_PREF:
+ loadSitePref();
+ break;
+ case LABELS:
+ loadLabels();
+ break;
+ case IMPORTS:
+ loadImport();
+ break;
+ default:
+ // do nothing
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * charge les info de l'utilisateur qu'il peut modifier
+ */
+ protected void loadUserPref() {
+ BowSession session = getBowSession();
+ BowUser user = session.getUser();
+
+ setEmail(user.getLogin());
+ }
+
+ /**
+ * Charge les preferences utilisateur pour le site
+ */
+ protected void loadSitePref() {
+ BowSession session = getBowSession();
+ BowUser user = session.getUser();
+
+ setColors(user.getColors());
+ setTagsNb(String.valueOf(user.getTags()));
+ setBookmarksHomePage(String.valueOf(user.getBookmarks()));
+ setSearchEngineUrlSuggestions(user.getSearchEngineUrlSuggestions());
+ setSearchEngineUrlResults(user.getSearchEngineUrlResults());
+ }
+
+ /**
+ * Charge la liste des imports que l'utilisateur a fait
+ */
+ protected void loadImport() {
+ BowSession session = getBowSession();
+ BowProxy proxy = session.getProxy();
+ BowUser user = session.getUser();
+
+ Criteria criteria = Search.query()
+ .exteq(BowImport.EXT_BOWIMPORT)
+ .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, user.getWikittyId()).criteria()
+ .addFacetField(BowImport.FQ_FIELD_BOWIMPORT_IMPORTDATE)
+ .setFirstIndex(0).setEndIndex(0);
+
+ List<FacetTopic> bookmarksImportDate =
+ proxy.findAllByCriteria(BowImport.class, criteria)
+ .getTopic(BowImport.FQ_FIELD_BOWIMPORT_IMPORTDATE);
+
+ // Extract imports
+ Map<String, Integer> result = new HashMap<String, Integer>();
+ for (FacetTopic facet : bookmarksImportDate) {
+ String dateAsString = facet.getTopicName();
+ int count = facet.getCount();
+ result.put(dateAsString, count);
+ }
+
+ if (log.isDebugEnabled()) {
+ log.debug("bookmarksByImportDate found : "
+ + (result == null ? "null" : result.size()));
+ }
+ setBookmarksImportDate(result.isEmpty() ? null : result);
+ }
+
+ /**
+ * Charge dans la variable labels tous les labels de l'utilisateur
+ * @param proxy
+ */
+ protected void loadLabels() {
+ BowSession session = getBowSession();
+ BowProxy proxy = session.getProxy();
+ BowUser user = session.getUser();
+ String userId = user.getWikittyId();
+
+ Criteria c = Search.query()
+ .exteq(BowBookmark.EXT_WIKITTYLABEL)
+ .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, userId)
+ .criteria().setEndIndex(0) // on ne veut aucun resultat, c'est la facet dont on a besoin
+ .setFacetMinCount(1) // on demande meme les labels avec 1 seul item
+ .setFacetLimit(-1) // on demande tous les labels
+ .addFacetField(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
+ PagedResult<Wikitty> result = proxy.findAllByCriteria(c);
+ // lorsqu'on demande tout (facetLimit(-1)), les topics sont trie
+ // alphabetiquement pas besoin de les retrier
+ labels = result.getTopic(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
+ }
+
+ /**
+ * ACTION STRUTS
+ *
+ * Action executer lorsque l'utilisateur demande la page. Prepare toutes
+ * les données pour la page JSP
+ */
+ @Override
+ public String input() {
+ String result = SUCCESS;
+
+ try {
+ // load all data
+ load();
+ } catch (Exception eee) {
+ result = ERROR;
+ addActionError(_("bow.error.internal"));
+ log.error("Can't load data preference", eee);
+ }
+ return result;
+ }
+}
Added: trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/UpdateSiteAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/UpdateSiteAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/UpdateSiteAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,63 @@
+package org.chorem.bow.action.preference;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.chorem.bow.BowProxy;
+import org.chorem.bow.BowSession;
+import org.chorem.bow.BowUser;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class UpdateSiteAction extends PreferenceBaseAction {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(UpdateSiteAction.class);
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * ACTION STRUTS
+ *
+ * Action executer lorsque l'utilisateur demande la page
+ */
+ @Override
+ public String execute() {
+ String result = SUCCESS;
+
+ try {
+ BowSession session = getBowSession();
+ BowProxy proxy = session.getProxy();
+ BowUser preference = session.getUser();
+
+ preference.setColors(colors);
+ if (StringUtils.isNotBlank(tagsNb)) {
+ preference.setTags(Integer.valueOf(tagsNb));
+ }
+ if (StringUtils.isNotBlank(bookmarksHomePage)) {
+ preference.setBookmarks(Integer.valueOf(bookmarksHomePage));
+ }
+ preference.setSearchEngineUrlSuggestions(searchEngineUrlSuggestions);
+ preference.setSearchEngineUrlResults(searchEngineUrlResults);
+
+ preference = proxy.store(preference);
+ getBowSession().setUser(preference);
+ } catch (Exception eee) {
+ result = ERROR;
+ addActionError(_("bow.error.internal"));
+ log.error("Can't change site preference", eee);
+ } finally {
+ // on recharge les data apres l'action pour l'affichage
+ // sauf celle du site qui sont deja les bonnes
+ load(PreferenceType.SITE_PREF);
+ }
+ return result;
+ }
+
+
+}
Added: trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/UpdateUserAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/UpdateUserAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/preference/UpdateUserAction.java 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,103 @@
+package org.chorem.bow.action.preference;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.chorem.bow.BowProxy;
+import org.chorem.bow.BowSession;
+import org.chorem.bow.BowUser;
+import org.nuiton.util.StringUtil;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.search.Search;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class UpdateUserAction extends PreferenceBaseAction {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(UpdateUserAction.class);
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * ACTION STRUTS
+ *
+ * Modifie l'email et le password si necessaire. Si la modif est impossible
+ * email deja utilise, ou mauvais password, alors la methode return ERROR
+ * Si tout ce passe bien, la methode retourne SUCCES
+ *
+ * @param user
+ * @return
+ */
+ @Override
+ public String execute() {
+ String result = SUCCESS;
+
+ try {
+ BowSession session = getBowSession();
+ BowProxy proxy = session.getProxy();
+ BowUser user = session.getUser();
+
+ if (StringUtils.isNotBlank(email)) {
+ Criteria criteria = Search.query().eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria();
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Try to find user with email: '%s'", email));
+ }
+ BowUser find = getBowProxy().findByCriteria(BowUser.class, criteria);
+
+ //If this email address isn't already used (or if it hasn't changed)
+ if (find == null || find.getLogin().equals(user.getLogin())) {
+ email = email.trim();
+ user.setLogin(email);
+ } else {
+ // this email address is already used by someone else
+ setEmail(user.getLogin());
+
+ // TODO poussin 20110818 addFieldError don't work (no message on web page :(
+ // add addActionError to prevent addFieldError that don't work
+ addFieldError("email", _("bow.preferences.emailAldyExists"));
+ addActionError(_("bow.preferences.emailAldyExists"));
+ result = ERROR;
+ }
+ }
+
+ if (result == SUCCESS
+ && StringUtils.isNotBlank(newPassword)
+ && StringUtils.isNotBlank(confirmNewPassword)
+ && StringUtils.isNotBlank(currentPassword)) {
+ if (newPassword.equals(confirmNewPassword)) {
+ currentPassword = StringUtil.encodeMD5(currentPassword);
+ if (currentPassword.equals(user.getPassword())) {
+ user.setPassword(StringUtil.encodeMD5(newPassword));
+ } else {
+ // TODO poussin 20110818 addFieldError don't work (no message on web page :(
+ // add addActionError to prevent addFieldError that don't work
+ addFieldError("currentPassword", _("bow.preferences.badCurrentPassword"));
+ addActionError(_("bow.preferences.badCurrentPassword"));
+ result = ERROR;
+ }
+ }
+ }
+ if (result == SUCCESS) {
+ user = proxy.store(user);
+ getBowSession().setUser(user);
+ addActionMessage(_("bow.preferences.update.successful"));
+ }
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error("Can't change site preference", eee);
+ } finally {
+ // on recharge les data apres l'action pour l'affichage
+ // sauf celle du user qui sont deja les bonnes
+ load(PreferenceType.USER_PREF);
+ }
+
+ return result;
+ }
+
+}
Modified: trunk/bow-ui/src/main/resources/i18n/bow-ui_en_GB.properties
===================================================================
--- trunk/bow-ui/src/main/resources/i18n/bow-ui_en_GB.properties 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/resources/i18n/bow-ui_en_GB.properties 2011-08-20 00:51:36 UTC (rev 313)
@@ -108,6 +108,7 @@
bow.rightMenu.bookmark.temporaryLinkDescription=Add this link to your favourites to bookmark others in the future. This link is only available while you are connected on the site\!
bow.rightMenu.chromiumExtension=Chromium extension
bow.rightMenu.extensions=Extensions
+bow.rightMenu.externSearchEngine=Web search
bow.rightMenu.find.submit=Find
bow.rightMenu.fullTextSearch=Full text search
bow.rightMenu.help=Help
Modified: trunk/bow-ui/src/main/resources/i18n/bow-ui_fr_FR.properties
===================================================================
--- trunk/bow-ui/src/main/resources/i18n/bow-ui_fr_FR.properties 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/resources/i18n/bow-ui_fr_FR.properties 2011-08-20 00:51:36 UTC (rev 313)
@@ -108,6 +108,7 @@
bow.rightMenu.bookmark.temporaryLinkDescription=Ajoutez ce lien \u00E0 vos favoris pour pouvoir bookmarker vos liens dans le futur. Ce lien est seulement disponible tant que vous \u00EAtes connect\u00E9 sur le site \!
bow.rightMenu.chromiumExtension=Extension pour chromium
bow.rightMenu.extensions=Extensions
+bow.rightMenu.externSearchEngine=Recherche Web
bow.rightMenu.find.submit=Rechercher
bow.rightMenu.fullTextSearch=Recherche full text
bow.rightMenu.help=Aide
Copied: trunk/bow-ui/src/main/resources/org/chorem/bow/action/preference/UpdateUserAction-validation.xml (from rev 306, trunk/bow-ui/src/main/resources/org/chorem/bow/action/RegisterAction-validation.xml)
===================================================================
--- trunk/bow-ui/src/main/resources/org/chorem/bow/action/preference/UpdateUserAction-validation.xml (rev 0)
+++ trunk/bow-ui/src/main/resources/org/chorem/bow/action/preference/UpdateUserAction-validation.xml 2011-08-20 00:51:36 UTC (rev 313)
@@ -0,0 +1,53 @@
+<!--
+ #%L
+ bow
+
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2010 - 2011 CodeLutin
+ %%
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ #L%
+ -->
+<!DOCTYPE validators PUBLIC
+ "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
+ "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
+
+<validators>
+ <field name="email">
+ <field-validator type="requiredstring">
+ <message key="bow.login.email.required" />
+ </field-validator>
+ <field-validator type="regex">
+ <param name="expression">^[a-z0-9!#$%&'*+/=?^_`{|}~-]+((\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)?)+@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9\-]*[a-z0-9])?$</param>
+ <message key="bow.login.email.wrongformat" />
+ </field-validator>
+ </field>
+ <field name="password">
+ <field-validator type="requiredstring">
+ <message key="bow.login.password.required" />
+ </field-validator>
+ </field>
+ <field name="repeatPassword">
+ <field-validator type="requiredstring">
+ <message key="bow.login.repeatPassword.required" />
+ </field-validator>
+ </field>
+
+ <validator type="expression">
+ <param name="expression">password.equals(repeatPassword)</param>
+ <message key="bow.register.pwdDontMatch" />
+ </validator>
+</validators>
Modified: trunk/bow-ui/src/main/resources/struts.xml
===================================================================
--- trunk/bow-ui/src/main/resources/struts.xml 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/resources/struts.xml 2011-08-20 00:51:36 UTC (rev 313)
@@ -104,70 +104,62 @@
</package>
<package name="login" extends="loginArea">
- <action name="register_*" method="{1}" class="org.chorem.bow.action.RegisterAction">
+ <action name="register_*" method="{1}" class="org.chorem.bow.action.login.RegisterAction">
<result name="input">/jsp/register.jsp</result>
<result type="redirectAction">home</result>
</action>
- <action name="forgotPassword_*" method="{1}" class="org.chorem.bow.action.ForgotPasswordAction">
+ <action name="forgotPassword_*" method="{1}" class="org.chorem.bow.action.login.ForgotPasswordAction">
<result name="input">/jsp/forgotPassword.jsp</result>
<result type="redirectAction">login_input</result>
</action>
- <action name="login_*" method="{1}" class="org.chorem.bow.action.LoginAction">
+ <action name="login_*" method="{1}" class="org.chorem.bow.action.login.LoginAction">
<result name="input">/jsp/login.jsp</result>
<result name="login" type="redirectAction">home</result>
<result type="redirectAction">home</result>
</action>
- <action name="logout" class="org.chorem.bow.action.LogoutAction">
+ <action name="logout" class="org.chorem.bow.action.login.LogoutAction">
<result type="redirectAction">login_input</result>
</action>
</package>
<package name="bookmark" extends="restrictedArea">
- <action name="importBookmarks" class="org.chorem.bow.action.ImportBookmarksAction">
- <result type="redirectAction">preferences</result>
- <result name="error">/jsp/preferences.jsp</result>
+ <action name="home" class="org.chorem.bow.action.bookmark.HomeAction">
+ <result name="error">/jsp/home.jsp</result>
+ <result>/jsp/home.jsp</result>
</action>
- <action name="exportBookmarks" class="org.chorem.bow.action.ExportBookmarksAction">
- <result type="stream">
- <param name="contentType">application/octet-stream</param>
- <param name="inputName">inputStream</param>
- <param name="contentDisposition">attachment;filename="bookmarks.html"</param>
- </result>
- </action>
- <action name="removeBookmark" class="org.chorem.bow.action.RemoveBookmarkAction">
+ <action name="removeBookmark" class="org.chorem.bow.action.bookmark.RemoveAction">
+ <result name="error" type="redirect">${redirectTo}</result>
<result type="redirect">${redirectTo}</result>
</action>
- <action name="deleteImport" class="org.chorem.bow.action.DeleteImportAction">
- <result type="redirectAction">preferences</result>
+ <action name="editBookmark" class="org.chorem.bow.action.bookmark.EditAction">
+ <result name="error">/jsp/editBookmark.jsp</result>
+ <result>/jsp/editBookmark.jsp</result>
</action>
- <action name="addUrl" class="org.chorem.bow.action.AddUrlAction">
+ <action name="addUrl" class="org.chorem.bow.action.bookmark.AddOrUpdateAction">
+ <result name="error">/jsp/editBookmark.jsp</result>
<result type="redirect">${redirectTo}</result>
</action>
- <action name="editBookmark" class="org.chorem.bow.action.EditBookmarkAction">
- <result>/jsp/editBookmark.jsp</result>
+ <action name="deleteSearchResults" class="org.chorem.bow.action.bookmark.DeleteSearchResultsAction">
+ <result name="error" type="redirectAction">home</result>
+ <result type="redirectAction">home</result>
</action>
</package>
<!-- Fragment: en prevision de faire un peu d'ajax si l'utilisateur le souhaite -->
<package name="fragment" namespace="/fragment" extends="restrictedArea">
- <action name="editBookmark" class="org.chorem.bow.action.EditBookmarkAction">
+ <action name="editBookmark" class="org.chorem.bow.action.bookmark.EditAction">
+ <result name="error">/jsp/editBookmark.jsp</result>
<result>/jsp/editBookmark.jsp</result>
</action>
</package>
<package name="search" extends="restrictedArea">
- <action name="home" class="org.chorem.bow.action.HomeAction">
- <result>/jsp/home.jsp</result>
- </action>
<action name="openSearchResult" class="org.chorem.bow.action.OpenSearchResultAction">
<result type="redirect">${redirectTo}</result>
</action>
<action name="openSearchSuggestion" class="org.chorem.bow.action.OpenSearchSuggestionAction">
<result>/jsp/suggestions.jsp</result>
</action>
- <action name="deleteSearchResults" class="org.chorem.bow.action.DeleteSearchResultsAction">
- <result type="redirectAction">home</result>
- </action>
<action name="*Xml">
<result>/jsp/{1}Xml.jsp</result>
</action>
@@ -177,19 +169,50 @@
<action name="locale" class="org.chorem.bow.action.LocaleAction">
<result type="redirect">/jsp/login.jsp</result>
</action>
- <action name="regenPermToken" class="org.chorem.bow.action.GenerateTokenAction">
- <result type="redirectAction">preferences</result>
+
+ <action name="preferences" class="org.chorem.bow.action.preference.PreferenceBaseAction" method="input">
+ <result name="error">/jsp/preferences.jsp</result>
+ <result>/jsp/preferences.jsp</result>
</action>
+
+ <action name="generateToken" class="org.chorem.bow.action.preference.GenerateTokenAction">
+ <result name="error">/jsp/preferences.jsp</result>
+ <result>/jsp/preferences.jsp</result>
+ </action>
- <action name="adminlabels" class="org.chorem.bow.action.PreferencesAction" method="adminlabels">
- <result type="redirectAction">preferences</result>
+ <action name="updateUserPref" class="org.chorem.bow.action.preference.UpdateUserAction">
+ <result name="error">/jsp/preferences.jsp</result>
+ <result>/jsp/preferences.jsp</result>
</action>
- <action name="preferences" class="org.chorem.bow.action.PreferencesAction">
- <result name="update" type="redirectAction">preferences</result>
+ <action name="updateSitePref" class="org.chorem.bow.action.preference.UpdateSiteAction">
<result name="error">/jsp/preferences.jsp</result>
<result>/jsp/preferences.jsp</result>
</action>
+
+ <action name="adminlabels" class="org.chorem.bow.action.preference.AdminTagAction">
+ <result name="error">/jsp/preferences.jsp</result>
+ <result>/jsp/preferences.jsp</result>
+ </action>
+
+ <action name="deleteImport" class="org.chorem.bow.action.preference.DeleteImportAction">
+ <result name="error">/jsp/preferences.jsp</result>
+ <result>/jsp/preferences.jsp</result>
+ </action>
+
+ <action name="importBookmarks" class="org.chorem.bow.action.preference.ImportBookmarksAction">
+ <result name="error">/jsp/preferences.jsp</result>
+ <result>/jsp/preferences.jsp</result>
+ </action>
+
+ <action name="exportBookmarks" class="org.chorem.bow.action.preference.ExportBookmarksAction">
+ <result name="error">/jsp/preferences.jsp</result>
+ <result type="stream">
+ <param name="contentType">text/html</param>
+ <param name="inputName">inputStream</param>
+ <param name="contentDisposition">attachment;filename="bookmarks.html"</param>
+ </result>
+ </action>
</package>
<package name="admin" extends="restrictedArea">
@@ -197,10 +220,12 @@
<result name="error">/jsp/login.jsp</result>
<result>/jsp/admin.jsp</result>
</action>
- <action name="reIndexation" class="org.chorem.bow.action.ReIndexationAction">
+ <action name="reIndexation" class="org.chorem.bow.action.admin.ReIndexationAction">
+ <result name="error">/jsp/admin.jsp</result>
<result>/jsp/admin.jsp</result>
</action>
- <action name="migrateData" class="org.chorem.bow.action.MigrateDataAction">
+ <action name="migrateData" class="org.chorem.bow.action.admin.MigrateDataAction">
+ <result name="error">/jsp/admin.jsp</result>
<result>/jsp/admin.jsp</result>
</action>
</package>
Modified: trunk/bow-ui/src/main/webapp/jsp/admin.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/admin.jsp 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/webapp/jsp/admin.jsp 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,4 +1,4 @@
-<!--
+<%--
#%L
bow
@@ -20,9 +20,10 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#L%
- -->
+ --%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
+
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
xmlns:jsp="http://java.sun.com/JSP/Page"
Modified: trunk/bow-ui/src/main/webapp/jsp/editBookmark.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/editBookmark.jsp 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/webapp/jsp/editBookmark.jsp 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,4 +1,4 @@
-<!--
+<%--
#%L
bow
@@ -20,7 +20,7 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#L%
- -->
+ --%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
@@ -40,7 +40,7 @@
</div>
<div class="formFrame fond">
<s:form id="popupAddUrlForm" action="addUrl" method="post">
- <s:hidden name="searchLine" value="%{searchLine}" />
+ <s:hidden name="tagLine" value="%{tagLine}" />
<s:hidden name="fullTextLine" value="%{fullTextLine}" />
<s:hidden name="bookmarkId" value="%{bookmark.wikittyId}"/>
<s:textfield name="link" labelSeparator=" " key="popup.addurl.link"
Modified: trunk/bow-ui/src/main/webapp/jsp/error.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/error.jsp 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/webapp/jsp/error.jsp 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,4 +1,4 @@
-<!--
+<%--
#%L
bow
@@ -20,7 +20,7 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#L%
- -->
+ --%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
Modified: trunk/bow-ui/src/main/webapp/jsp/forgotPassword.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/forgotPassword.jsp 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/webapp/jsp/forgotPassword.jsp 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,4 +1,4 @@
-<!--
+<%--
#%L
bow
@@ -20,31 +20,32 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#L%
- -->
+ --%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
+
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
xmlns:jsp="http://java.sun.com/JSP/Page"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<head>
- <title><s:text name="bow.forgotpwd.title" /></title>
- <s:url var="css" value="/css/connexion.css" />
- <link href="${css}" rel="stylesheet" type="text/css" />
- <s:head />
+ <title><s:text name="bow.forgotpwd.title" /></title>
+ <s:url var="css" value="/css/connexion.css" />
+ <link href="${css}" rel="stylesheet" type="text/css" />
+ <s:head />
</head>
<body>
- <div id="content">
- <div id="formFrame fond">
- <h1><s:text name="bow.forgotpwd.title" /></h1>
- <s:form action="forgotPassword">
- <p>
- <s:textfield key="bow.login.email" name="email" labelposition="top" labelSeparator=" :" />
- <s:submit key="bow.forgotpwd.submit" name="submit" />
- </p>
- </s:form>
- <s:a action="login_input" id="loginLink"><s:text name="bow.login.title" /></s:a>
- </div>
- </div>
+ <div id="content">
+ <div id="formFrame fond">
+ <h1><s:text name="bow.forgotpwd.title" /></h1>
+ <s:form action="forgotPassword">
+ <p>
+ <s:textfield key="bow.login.email" name="email" labelposition="top" labelSeparator=" :" />
+ <s:submit key="bow.forgotpwd.submit" name="submit" />
+ </p>
+ </s:form>
+ <s:a action="login_input" id="loginLink"><s:text name="bow.login.title" /></s:a>
+ </div>
+ </div>
</body>
</html>
Modified: trunk/bow-ui/src/main/webapp/jsp/home.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/home.jsp 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/webapp/jsp/home.jsp 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,4 +1,4 @@
-<!--
+<%--
#%L
bow
@@ -20,15 +20,9 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#L%
- -->
+ --%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
-<%@page import="org.chorem.bow.BowBookmark" %>
-<%@page import="java.text.SimpleDateFormat" %>
-<%@page import="java.util.List" %>
-<%@page import="org.chorem.bow.BowSearchResult"%>
-<%@page import="org.chorem.bow.action.HomeAction"%>
-<%@page import="org.chorem.bow.BowConfig"%>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
@@ -50,7 +44,7 @@
<s:set name="bookmarksToDelete" value="%{searchResult.bookmarkCount}" />
<s:if test="%{#bookmarksToDelete > 0}">
<s:url var="deleteSearchResults" action="deleteSearchResults" escapeAmp="false">
- <s:param name="searchLine"><s:property value="searchResult.searchLine" /></s:param>
+ <s:param name="tagLine"><s:property value="searchResult.tagLine" /></s:param>
<s:param name="fullTextLine"><s:property value="searchResult.fullTextLine" /></s:param>
</s:url>
<s:a id="deleteSearchResultsButton" title="delete all" href="" onclick="deleteConfirmation('%{deleteSearchResults}', %{#bookmarksToDelete}); return(false);"></s:a>
@@ -59,7 +53,7 @@
<label for="order"><s:text name="bow.search.orderby" /></label>
<s:select id="order" name="order" list="possibleOrder"/>
<s:submit key="bow.search.submit" name="submit" />
- <s:hidden name="searchLine" value="%{searchResult.searchLine}" />
+ <s:hidden name="tagLine" value="%{searchResult.tagLine}" />
<s:hidden name="fullTextLine" value="%{searchResult.fullTextLine}" />
</s:form>
</div>
@@ -71,7 +65,7 @@
<s:iterator value="searchResult.bookmarks" var="bookmark">
<s:set name="bookmark" value="bookmark"/>
<jsp:include page="inc/bookmark.jsp" flush="true">
- <jsp:param name="searchLine" value="%{searchResult.searchLine}" />
+ <jsp:param name="tagLine" value="%{searchResult.tagLine}" />
<jsp:param name="fullTextLine" value="%{searchResult.fullTextLine}" />
</jsp:include>
</s:iterator>
Modified: trunk/bow-ui/src/main/webapp/jsp/inc/bookmark.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/inc/bookmark.jsp 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/webapp/jsp/inc/bookmark.jsp 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,4 +1,4 @@
-<!--
+<%--
#%L
bow
@@ -20,7 +20,7 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#L%
- -->
+ --%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<%@taglib prefix="sj" uri="/struts-jquery-tags" %>
@@ -31,26 +31,26 @@
<div class="bookmarkhead">
<p class="date"><s:property value="#bookmark.creationDate"/></p>
- <s:a cssClass="alias" href="%{config.servletAliasUrl + #bookmark.wikittyId}.action"
+ <s:a cssClass="alias" href="%{config.aliasUrl + #bookmark.wikittyId}.action"
title="%{#bookmark.link}" target="_blank">
a:<s:property value="%{#bookmark.privateAlias}" />
</s:a>
<s:if test="%{!#bookmark.publicAlias.empty}">
- <s:a cssClass="alias" href="%{config.servletAliasUrl + #bookmark.publicAlias}.action"
+ <s:a cssClass="alias" href="%{config.aliasUrl + #bookmark.publicAlias}.action"
title="%{#bookmark.link}" target="_blank">
<s:property value="%{#bookmark.publicAlias}" />
</s:a>
</s:if>
<s:url var="editBookmark" action="editBookmark" escapeAmp="true">
<s:param name="id"><s:property value="%{#bookmark.wikittyId}" /></s:param>
- <s:param name="searchLine"><s:property value="%{searchLine}" /></s:param>
+ <s:param name="tagLine"><s:property value="%{tagLine}" /></s:param>
<s:param name="fullTextLine"><s:property value="%{fullTextLine}" /></s:param>
</s:url>
<s:a cssClass="edit" href="%{editBookmark}"/>
<s:url var="removeBookmark" action="removeBookmark" escapeAmp="true">
<s:param name="bookmarkId"><s:property value="%{#bookmark.wikittyId}" /></s:param>
- <s:param name="searchLine"><s:property value="%{searchLine}" /></s:param>
+ <s:param name="tagLine"><s:property value="%{tagLine}" /></s:param>
<s:param name="fullTextLine"><s:property value="%{fullTextLine}" /></s:param>
</s:url>
<s:a cssClass="supprim" href="%{removeBookmark}"
@@ -71,7 +71,7 @@
<strong><s:text name="bow.bookmark.tags" /> :</strong>
<s:iterator value="#bookmark.labels" var="tag">
<s:url var="search" action="home">
- <s:param name="searchLine" value="%{searchLine}"/>
+ <s:param name="tagLine" value="%{tagLine}"/>
<s:param name="addTag" value="%{#tag}"/>
<s:param name="fullTextLine" value="%{fullTextLine}"/>
</s:url>
Modified: trunk/bow-ui/src/main/webapp/jsp/inc/footer.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/inc/footer.jsp 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/webapp/jsp/inc/footer.jsp 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,4 +1,4 @@
-<!--
+<%--
#%L
bow
@@ -20,7 +20,7 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#L%
- -->
+ --%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@taglib prefix="s" uri="/struts-tags" %>
Modified: trunk/bow-ui/src/main/webapp/jsp/inc/header.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/inc/header.jsp 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/webapp/jsp/inc/header.jsp 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,4 +1,4 @@
-<!--
+<%--
#%L
bow
$Id$
@@ -19,9 +19,10 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#L%
--->
+--%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@taglib prefix="s" uri="/struts-tags" %>
+
<div id="header"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
xmlns:jsp="http://java.sun.com/JSP/Page">
@@ -41,7 +42,7 @@
<h3>Recherche</h3>
<div class="input">
<s:form action="home" theme="simple">
- <s:textfield name="searchLine" labelSeparator="" />
+ <s:textfield name="tagLine" labelSeparator="" />
<s:submit key="bow.rightMenu.search.tags" name="submit" />
</s:form>
</div>
@@ -51,6 +52,12 @@
<s:submit key="bow.rightMenu.fullTextSearch" name="submit" />
</s:form>
</div>
+ <div class="input">
+ <s:form action="openSearchResult" theme="simple">
+ <s:textfield name="searchLine" labelSeparator="" />
+ <s:submit key="bow.rightMenu.externSearchEngine" name="submit" />
+ </s:form>
+ </div>
</div>
</s:if>
<div id="msg">
Modified: trunk/bow-ui/src/main/webapp/jsp/inc/rightMenu.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/inc/rightMenu.jsp 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/webapp/jsp/inc/rightMenu.jsp 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,4 +1,4 @@
-<!--
+<%--
#%L
bow
@@ -20,7 +20,7 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#L%
- -->
+ --%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<%@taglib prefix="sj" uri="/struts-jquery-tags" %>
@@ -52,7 +52,7 @@
<li><s:a action="preferences"><s:text name="bow.preferences.title" /></s:a></li>
<li>
<s:url var="editBookmark" action="editBookmark" escapeAmp="true">
- <s:param name="searchLine"><s:property value="%{searchLine}" /></s:param>
+ <s:param name="tagLine"><s:property value="%{tagLine}" /></s:param>
<s:param name="fullTextLine"><s:property value="%{fullTextLine}" /></s:param>
</s:url>
<s:a href="%{editBookmark}">
@@ -62,7 +62,7 @@
</ul>
<!--div id="nuage"-->
<jsp:include page="tagsCloud.jsp" flush="true">
- <jsp:param name="searchLine" value="%{searchLine}" />
+ <jsp:param name="tagLine" value="%{tagLine}" />
<jsp:param name="fullTextLine" value="%{fullTextLine}"/>
</jsp:include>
<!--/div-->
Modified: trunk/bow-ui/src/main/webapp/jsp/inc/tagsCloud.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/inc/tagsCloud.jsp 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/webapp/jsp/inc/tagsCloud.jsp 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,4 +1,4 @@
-<!--
+<%--
#%L
bow
@@ -20,7 +20,7 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#L%
- -->
+ --%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@taglib prefix="s" uri="/struts-tags" %>
@@ -29,7 +29,7 @@
xmlns:jsp="http://java.sun.com/JSP/Page">
<s:iterator value="%{searchResult.tagsCloud}" status="tagStatus" var="tag">
<s:url var="search" action="home" escapeAmp="true">
- <s:param name="searchLine" value="%{searchLine}"/>
+ <s:param name="tagLine" value="%{tagLine}"/>
<s:param name="addTag" value="%{#tag.topicName}"/>
<s:param name="fullTextLine" value="%{fullTextLine}"/>
</s:url>
Modified: trunk/bow-ui/src/main/webapp/jsp/login.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/login.jsp 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/webapp/jsp/login.jsp 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,4 +1,4 @@
-<!--
+<%--
#%L
bow
@@ -20,7 +20,7 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#L%
- -->
+ --%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
Modified: trunk/bow-ui/src/main/webapp/jsp/permanentXml.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/permanentXml.jsp 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/webapp/jsp/permanentXml.jsp 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,4 +1,4 @@
-<!--
+<%--
#%L
bow
@@ -20,7 +20,7 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#L%
- -->
+ --%>
<%@page contentType="text/xml" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<%@page import="org.chorem.bow.BowConfig" %>
Modified: trunk/bow-ui/src/main/webapp/jsp/preferences.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/preferences.jsp 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/webapp/jsp/preferences.jsp 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,4 +1,4 @@
-<!--
+<%--
#%L
bow
@@ -20,7 +20,7 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#L%
--->
+--%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@taglib prefix="s" uri="/struts-tags" %>
@@ -71,7 +71,7 @@
</li>
</ul>
- <s:url var="regenPermToken" action="regenPermToken"/>
+ <s:url var="regenPermToken" action="generateToken"/>
<s:a href="%{regenPermToken}" id="regenPermToken">
<s:text name="bow.preferences.regenPermToken"/>
</s:a>
@@ -80,7 +80,7 @@
<div class="formFrame fond">
<h3><s:text name="bow.preferences.userInfo"/></h3>
<br/>
- <s:form action="preferences" theme="simple">
+ <s:form action="updateUserPref" theme="simple">
<s:text name="bow.login.email"/><br/>
<s:textfield name="email"
labelposition="top"/><br/>
@@ -103,7 +103,7 @@
<div class="formFrame fond">
<h3><s:text name="bow.preferences.siteLook"/></h3>
<br/>
- <s:form action="preferences" theme="simple">
+ <s:form action="updateSitePref" theme="simple">
<s:text name="bow.preferences.tagsNb"/><br/>
<s:textfield name="tagsNb" labelposition="top"/><br/>
@@ -156,7 +156,7 @@
<br/>
<s:form action="importBookmarks" method="post" enctype="multipart/form-data" theme="simple">
<s:file name="upfile" labelSeparator=""/>
- <s:hidden name="searchLine" value="%{searchLine}"/>
+ <s:hidden name="tagLine" value="%{tagLine}"/>
<s:hidden name="fullTextLine" value="%{fullTextLine}"/>
<s:submit key="bow.preferences.import.submit" name="submit"/>
</s:form>
Modified: trunk/bow-ui/src/main/webapp/jsp/register.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/register.jsp 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/webapp/jsp/register.jsp 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,4 +1,4 @@
-<!--
+<%--
#%L
bow
@@ -20,9 +20,10 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#L%
- -->
+ --%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
+
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
xmlns:jsp="http://java.sun.com/JSP/Page"
Modified: trunk/bow-ui/src/main/webapp/jsp/suggestions.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/suggestions.jsp 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/webapp/jsp/suggestions.jsp 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,4 +1,4 @@
-<!--
+<%--
#%L
bow
@@ -20,7 +20,7 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#L%
- -->
+ --%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="org.chorem.bow.OpenSearchActions" %>
<%@page import="org.nuiton.wikitty.search.FacetTopic" %>
Modified: trunk/bow-ui/src/main/webapp/jsp/temporaryXml.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/temporaryXml.jsp 2011-08-19 16:31:32 UTC (rev 312)
+++ trunk/bow-ui/src/main/webapp/jsp/temporaryXml.jsp 2011-08-20 00:51:36 UTC (rev 313)
@@ -1,4 +1,4 @@
-<!--
+<%--
#%L
bow
@@ -20,7 +20,7 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#L%
- -->
+ --%>
<%@page contentType="text/xml" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<%@page import="org.chorem.bow.BowConfig" %>
1
0
Author: tchemit
Date: 2011-08-19 18:31:32 +0200 (Fri, 19 Aug 2011)
New Revision: 312
Url: http://chorem.org/repositories/revision/bow/312
Log:
Update mavenpom4redmine to 3.0.2.
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2011-08-18 15:00:54 UTC (rev 311)
+++ trunk/pom.xml 2011-08-19 16:31:32 UTC (rev 312)
@@ -10,7 +10,7 @@
<parent>
<groupId>org.nuiton</groupId>
<artifactId>mavenpom4redmine</artifactId>
- <version>3.0.1</version>
+ <version>3.0.2</version>
</parent>
<groupId>org.chorem</groupId>
1
0
Author: bpoussin
Date: 2011-08-18 17:00:54 +0200 (Thu, 18 Aug 2011)
New Revision: 311
Url: http://chorem.org/repositories/revision/bow/311
Log:
Evolution #438: Refactore source code and simplify all
... continue
Modified:
trunk/bow-ui/src/main/java/org/chorem/bow/OpenSearchActions.java
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/OpenSearchActions.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/OpenSearchActions.java 2011-08-18 14:53:22 UTC (rev 310)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/OpenSearchActions.java 2011-08-18 15:00:54 UTC (rev 311)
@@ -41,7 +41,7 @@
protected List<FacetTopic> suggestions = new ArrayList<FacetTopic>();
protected String[] search;
- public void findSuggestions(List<String> searchLine) {
+ public void findSuggestions(Set<String> searchLine) {
int size = searchLine.size();
search = searchLine.toArray(new String[size]);
String word = search[size - 1];
1
0
r310 - in trunk/bow-ui/src/main/java/org/chorem/bow: . action
by bpoussin@users.chorem.org 18 Aug '11
by bpoussin@users.chorem.org 18 Aug '11
18 Aug '11
Author: bpoussin
Date: 2011-08-18 16:53:22 +0200 (Thu, 18 Aug 2011)
New Revision: 310
Url: http://chorem.org/repositories/revision/bow/310
Log:
Evolution #438: Refactore source code and simplify all
- move import/export sspecifique method from BookmarkUtils to specifique action
- add normalizeXXXX method in BowUtils to help to convert object to right object to storage
- remove many not use any more method
Modified:
trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java
trunk/bow-ui/src/main/java/org/chorem/bow/BowSearchResult.java
trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java 2011-08-18 10:15:48 UTC (rev 309)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java 2011-08-18 14:53:22 UTC (rev 310)
@@ -29,8 +29,6 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
@@ -75,7 +73,7 @@
}
if (StringUtils.isNotBlank(searchLine)) {
- List<String> tags = BowUtils.getWords(searchLine);
+ Set<String> tags = BowUtils.getWords(searchLine);
search.eq(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS, tags);
}
@@ -142,101 +140,6 @@
}
/**
- * @param html String html
- * @param name String name
- * @param user User user
- * @return Bookmark the bookmark filled
- */
- public static BowBookmark createBookmarkFromHtml(String html, String name, BowUser user) {
- String link = getUrlFromHtml(html);
- String tags = getTagsFromHtml(html);
- Date date = getDateFromHtml(html);
- BowBookmark bookmark = createBookmark(link, name, tags, user, null, null, date);
- return bookmark;
- }
-
- /**
- * @param html String html
- * @return Date from the html
- */
- public static Date getDateFromHtml(String html) {
- Date date = null;
- if (html != null) {
- Pattern p = Pattern.compile("ADD_DATE=\"([^\"]*)\"");
- Matcher m = p.matcher(html);
- if (m.find()) {
- String str = m.group(1);
- if (str != null && !str.isEmpty()) {
- long time = Long.valueOf(str) * 1000; // the date in ms
- date = new Date(time);
- }
- }
- }
- return date;
- }
-
- /**
- * @param bookmarks List<Bookmarks> bookmarks
- * @return String the html file
- */
- public static String getExportHtmlBookmark(List<BowBookmark> bookmarks) {
- String export;
- export = "<!DOCTYPE NETSCAPE-Bookmark-file-1>\n"
- + "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\">\n"
- + "<DL><p>\n";
- if (bookmarks != null) {
- for (BowBookmark bookmark : bookmarks) {
- if (bookmark != null) {
- export += "<DT><A HREF=\"";
- export += bookmark.getLink() + "\" ";
- Date date = bookmark.getCreationDate();
- if (date != null) {
- long milli = date.getTime();
- String time = String.valueOf(milli / 1000);
- export += "ADD_DATE=\"" + time + "\" LAST_MODIFIED=\"" + time + "\" ";
- }
- export += "LAST_CHARSET=\"UTF-8\" ";
- Set<String> tags = bookmark.getLabels();
- if (tags != null && !tags.isEmpty()) {
- export += "SHORTCUTURL=\"" + getBookmarkTagsString(bookmark) + "\"";
- }
- export += ">" + bookmark.getDescription() + "</A>\n";
- }
- }
- }
- export += "</DL><p>";
- return export;
- }
-
- /**
- * @param html String html
- * @return url
- */
- public static String getUrlFromHtml(String html) {
- String url = "";
- if (html != null) {
- Pattern p = Pattern.compile("A HREF=\"([^\"]*)\"");
- Matcher m = p.matcher(html);
- if (m.find()) {
- url = m.group(1);
- }
- }
- return url;
- }
-
- public static String getTagsFromHtml(String html) {
- String tags = "";
- if (html != null) {
- Pattern p = Pattern.compile("SHORTCUTURL=\"([^\"]*)\"");
- Matcher m = p.matcher(html);
- if (m.find()) {
- tags = m.group(1);
- }
- }
- return tags;
- }
-
- /**
* @param url String which contains the bookmark url
* @param nameAndTags String which contains the name and the tags of the
* bookmark separated by '|' ==> name|tag1 tag2...
@@ -245,53 +148,25 @@
*/
public static BowBookmark createBookmark(String url, String nameAndTags, BowUser user) {
- BowBookmark bookmark = new BowBookmarkImpl();
+ // on recherche les tags qui doivent etre apres le dernier |
+ // ce qu'il y a devant est la description qui peut elle aussi contenir
+ // des |
- int nameIndex = nameAndTags.indexOf('|'); // get the index name of the website
+ // on s'assure que la chaine est non null, et en enleve les blanc en trop
+ String name = BowUtils.normalizeString(nameAndTags);
+ String tags = ""; // par defaut on a pas de tag
+
+ int nameIndex = name.lastIndexOf('|');
if (nameIndex > 0) {
- String name = nameAndTags.substring(0, nameIndex); // get the website name
- if (!name.isEmpty()) {
- name = name.trim();
- bookmark.setDescription(name); // set the description (website name)
- }
+ // il faut faire tags avant name, car on change name ensuite
+ tags = name.substring(nameIndex + 1);
+ name = name.substring(0, nameIndex); // get the website description
}
- String tags = nameAndTags;
- if (nameIndex >= 0) {
- tags = nameAndTags.substring(nameIndex + 1); // get tags, +1 because of '|'
- }
- addTagsToBookmark(BowUtils.getWords(tags), bookmark);
- addUrlToBookmark(url, bookmark);
- bookmark.setClick(0);
- bookmark.setOwner(user.getWikittyId());
- bookmark.addReader(user.getWikittyId()); // only owner can read it
- bookmark.setCreationDate(new Date()); // set the date
+ BowBookmark bookmark = createBookmark(url, name, tags, user, "", "", null);
+
return bookmark;
}
- public static void addUrlToBookmark(String url, BowBookmark bookmark) {
- if (url != null && !url.isEmpty()) {
- String link = url.trim();
- if (! link.matches("[a-z]+://.+") ) {
- link = "http://" + link;
- }
- bookmark.setLink(link);
- } else {
- bookmark.setLink("");
- }
- }
-
- public static void addTagsToBookmark(List<String> tagList, BowBookmark bookmark) {
- if (tagList != null) {
- for (String tag : tagList) {
- if (StringUtils.isNotEmpty(tag)) {
- // on peut ajouter plusieurs fois le meme tag, car on les
- // stocke dans un Set
- bookmark.addLabels(tag);
- }
- }
- }
- }
-
/**
* Create new Bookmark
*
@@ -307,64 +182,33 @@
BowUser user, String privateAlias, String publicAlias, Date date) {
BowBookmark bookmark = new BowBookmarkImpl();
- if (name != null) {
- name = name.trim();
- bookmark.setDescription(name);
- } else {
- bookmark.setDescription("");
- }
- addTagsToBookmark(BowUtils.getWords(tags), bookmark);
+ bookmark.setDescription(BowUtils.normalizeString(name));
+
+ bookmark.addAllLabels(BowUtils.getWords(tags));
+ bookmark.setLink(BowUtils.normalizeUrl(url));
- addUrlToBookmark(url, bookmark);
-
bookmark.setClick(0);
bookmark.setOwner(user.getWikittyId());
bookmark.addReader(user.getWikittyId()); // only owner can read it
- if (date == null) {
- date = new Date();
- }
- bookmark.setCreationDate(date); // set the date
- if (privateAlias != null) {
- privateAlias = privateAlias.trim();
- bookmark.setPrivateAlias(privateAlias);
- } else {
- bookmark.setPrivateAlias("");
- }
- if (publicAlias != null) {
- publicAlias = publicAlias.trim();
- bookmark.setPublicAlias(publicAlias);
- } else {
- bookmark.setPublicAlias("");
- }
+ bookmark.setCreationDate(BowUtils.normalizeDate(date));
+
+ bookmark.setPrivateAlias(BowUtils.normalizeString(privateAlias));
+ bookmark.setPublicAlias(BowUtils.normalizeString(publicAlias));
+
return bookmark;
}
- public static void updateBookmarkName(BowBookmark bookmark, String name) {
- if (name != null) {
- name = name.trim();
- bookmark.setDescription(name);
- }
- }
-
public static void updateBookmark(BowBookmark bookmark, String name,
String link, String tags, String privateAlias, String publicAlias) {
- if (name != null) {
- name = name.trim();
- bookmark.setDescription(name);
- }
- addUrlToBookmark(link, bookmark);
- bookmark.clearLabels();
- addTagsToBookmark(BowUtils.getWords(tags), bookmark);
- if (privateAlias != null) {
- privateAlias = privateAlias.trim();
- }
- bookmark.setPrivateAlias(privateAlias);
- if (publicAlias != null) {
- publicAlias = publicAlias.trim();
- }
- bookmark.setPublicAlias(publicAlias);
+ bookmark.setDescription(BowUtils.normalizeString(name));
+
+ bookmark.setLink(BowUtils.normalizeUrl(link));
+ bookmark.setLabels(BowUtils.getWords(tags));
+
+ bookmark.setPrivateAlias(BowUtils.normalizeString(privateAlias));
+ bookmark.setPublicAlias(BowUtils.normalizeString(publicAlias));
}
public static String getBookmarkTagsString(BowBookmark bookmark) {
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowSearchResult.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowSearchResult.java 2011-08-18 10:15:48 UTC (rev 309)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowSearchResult.java 2011-08-18 14:53:22 UTC (rev 310)
@@ -114,9 +114,8 @@
// on ne met pas dans le cloud les tags qui ont servi pour la recherche
List<FacetTopic> save = new ArrayList<FacetTopic>(tagsCloud);
- // on met dans un Set pour optimiser la recherche
- Set<String> tagsSearch =
- new HashSet<String>(BowUtils.getWords(getSearchLine()));
+ // on recupere les tags dans un set pour optimiser la recherche
+ Set<String> tagsSearch = BowUtils.getWords(getSearchLine());
for(Iterator<FacetTopic> i=tagsCloud.iterator(); i.hasNext();) {
FacetTopic topic = i.next();
@@ -163,7 +162,7 @@
return tagsCloud;
}
- public List<String> getTagsSearch() {
+ public Set<String> getTagsSearch() {
return BowUtils.getWords(getSearchLine());
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java 2011-08-18 10:15:48 UTC (rev 309)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java 2011-08-18 14:53:22 UTC (rev 310)
@@ -25,7 +25,9 @@
import java.util.Arrays;
import java.util.Date;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.nuiton.util.StringUtil;
@@ -34,8 +36,10 @@
import org.nuiton.wikitty.search.Search;
import java.util.UUID;
+import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.time.DateFormatUtils;
+import org.nuiton.util.DateUtil;
public class BowUtils {
@@ -45,17 +49,71 @@
}
/**
+ * Retourne toujours une date valide. Si date est null, on prend la date
+ * du jour
+ *
+ * @param date null or valide date
+ * @return date if date not null, or today date
+ */
+ static public Date normalizeDate(Date date) {
+ Date result = date;
+ if (result == null) {
+ result = new Date();
+ }
+ return result;
+ }
+
+ /**
+ * Supprime les blancs de debut et de fin, et retourne une chaine vide si s
+ * est null
+ *
+ * @param s null or string
+ * @return empty string or string without blank at begin and end
+ */
+ static public String normalizeString(String s) {
+ String result = StringUtils.defaultIfBlank(s, "");
+ result = result.trim();
+ return result;
+ }
+
+ /**
+ * Normalise l'url, si elle est null ou vide retourne une chaine vide.
+ * Si elle ne commence pas par un protocol (ex: ftp://) alors on ajoute
+ * automatiquement http://
+ *
+ * @param url l'url a normaliser
+ * @return l'url normalisee
+ */
+ public static String normalizeUrl(String url) {
+ String result = "";
+ if (StringUtils.isNotBlank(url)) {
+ result = url.trim();
+ if (! result.matches("[a-z]+://.+") ) {
+ result = "http://" + result;
+ }
+ }
+ return result;
+ }
+
+ /**
* Donne la liste des mots de la chaine passee en parametre.
- * Si tags est null ou vide, le tableau retourne sera vide
+ * Si tags est null ou vide, le 'set' retourne sera vide.
*
+ * La liste retournee ne doit jamais contenir de chaine null ou vide.
+ *
* @param tags
* @return
*/
- static public List<String> getWords(String tags) {
+ static public Set<String> getWords(String tags) {
String [] words = StringUtils.split(tags);
words = ArrayUtils.nullToEmpty(words);
- List<String> result = Arrays.asList(words);
+ Set<String> result = new HashSet<String>(Arrays.asList(words));
+
+ // on s'assure que la liste ne retourne jamais de chaine null ou vide.
+ result.remove("");
+ result.remove(null);
+
return result;
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java 2011-08-18 10:15:48 UTC (rev 309)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java 2011-08-18 14:53:22 UTC (rev 310)
@@ -29,7 +29,10 @@
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
+import java.io.Writer;
+import java.util.Date;
import java.util.List;
+import java.util.Set;
import javax.servlet.http.HttpServletResponse;
@@ -62,6 +65,41 @@
}
/**
+ * Export tous les bookmarks au format HTML tel que le fait les navigateurs
+ *
+ * @param bookmarks List<Bookmarks> bookmarks
+ * @param out le flux dans lequel il faut ecrire l'export
+ * @return String the html file
+ */
+ protected void generateExportHtmlBookmark(List<BowBookmark> bookmarks, Writer out) throws IOException {
+ out.write("<!DOCTYPE NETSCAPE-Bookmark-file-1>\n"
+ + "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\">\n"
+ + "<DL><p>\n");
+ if (bookmarks != null) {
+ for (BowBookmark bookmark : bookmarks) {
+ if (bookmark != null) {
+ out.write("<DT><A HREF=\"");
+ out.write(bookmark.getLink() + "\" ");
+ Date date = bookmark.getCreationDate();
+ if (date != null) {
+ long milli = date.getTime();
+ String time = String.valueOf(milli / 1000);
+ out.write("ADD_DATE=\"" + time + "\" LAST_MODIFIED=\"" + time + "\" ");
+ }
+ out.write("LAST_CHARSET=\"UTF-8\" ");
+ Set<String> tags = bookmark.getLabels();
+ if (tags != null && !tags.isEmpty()) {
+ out.write("SHORTCUTURL=\""
+ + BookmarkUtils.getBookmarkTagsString(bookmark) + "\"");
+ }
+ out.write(">" + bookmark.getDescription() + "</A>\n");
+ }
+ }
+ }
+ out.write("</DL><p>");
+ }
+
+ /**
* Exports the bookmarks in HTML format
*/
@Override
@@ -77,7 +115,6 @@
List<BowBookmark> bookmarks = proxy.findAllByCriteria(BowBookmark.class, criteria).getAll();
// Export all
- String export = BookmarkUtils.getExportHtmlBookmark(bookmarks);
BufferedWriter out = null;
try {
@@ -87,11 +124,12 @@
tmp.deleteOnExit();
out = new BufferedWriter(new FileWriter(tmp));
- out.write(export);
+ generateExportHtmlBookmark(bookmarks, out);
+ out.close();
inputStream = new FileInputStream(tmp);
- } catch (IOException e) {
- log.error("Error when exporting bookmarks to HTML : " + e.getMessage(), e);
+ } catch (IOException eee) {
+ log.error("Error when exporting bookmarks to HTML : ", eee);
} finally {
IOUtils.closeQuietly(out);
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java 2011-08-18 10:15:48 UTC (rev 309)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java 2011-08-18 14:53:22 UTC (rev 310)
@@ -28,7 +28,12 @@
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.apache.commons.lang.StringUtils;
import org.chorem.bow.BookmarkUtils;
import org.chorem.bow.BowBookmark;
@@ -100,11 +105,72 @@
this.upfileFileName = upfileFileName;
}
+ /**
+ * @param html String html
+ * @param name String name
+ * @param user User user
+ * @return Bookmark the bookmark filled
+ */
+ protected BowBookmark createBookmarkFromHtml(String html, String name, BowUser user) {
+ String link = getUrlFromHtml(html);
+ String tags = getTagsFromHtml(html);
+ Date date = getDateFromHtml(html);
+ BowBookmark bookmark = BookmarkUtils.createBookmark(link, name, tags, user, null, null, date);
+ return bookmark;
+ }
+
+ /**
+ * @param html String html
+ * @return Date from the html
+ */
+ protected Date getDateFromHtml(String html) {
+ Date date = null;
+ if (html != null) {
+ Pattern p = Pattern.compile("ADD_DATE=\"([^\"]*)\"");
+ Matcher m = p.matcher(html);
+ if (m.find()) {
+ String str = m.group(1);
+ if (str != null && !str.isEmpty()) {
+ long time = Long.valueOf(str) * 1000; // the date in ms
+ date = new Date(time);
+ }
+ }
+ }
+ return date;
+ }
+
+ /**
+ * @param html String html
+ * @return url
+ */
+ protected String getUrlFromHtml(String html) {
+ String url = "";
+ if (html != null) {
+ Pattern p = Pattern.compile("A HREF=\"([^\"]*)\"");
+ Matcher m = p.matcher(html);
+ if (m.find()) {
+ url = m.group(1);
+ }
+ }
+ return url;
+ }
+
+ protected String getTagsFromHtml(String html) {
+ String tags = "";
+ if (html != null) {
+ Pattern p = Pattern.compile("SHORTCUTURL=\"([^\"]*)\"");
+ Matcher m = p.matcher(html);
+ if (m.find()) {
+ tags = m.group(1);
+ }
+ }
+ return tags;
+ }
+
protected void parseHtmlToBookmarks(NodeList list, BowUser user, Date date,
- List<BowBookmark> bookmarks, List<String> tagList)
+ List<BowBookmark> bookmarks, Set<String> tagList)
throws ParserException {
- boolean isFolder = false;
SimpleNodeIterator it = list.elements();
while (it.hasMoreNodes()) {
@@ -115,21 +181,20 @@
String text = node.getText(); // The text in the head ==>
// <text></toto>
- if (text != null && text.startsWith("H3")) { // H3 = folder
- if (plainText != null && !plainText.isEmpty()) {
+ if (StringUtils.startsWithIgnoreCase(text, "h3")) { // H3 = folder
+ if (StringUtils.isNotBlank(plainText)) {
tagList.add(plainText); // Adds the folder name to the
// tagList
- isFolder = true;
}
- } else if (text != null && text.startsWith("A HREF")) { // HREF
+ } else if (StringUtils.startsWithIgnoreCase(text, "a href")) { // HREF
// = new
// bookmarks
- BowBookmark bookmark = BookmarkUtils
- .createBookmarkFromHtml(text, plainText, user);
+ BowBookmark bookmark = createBookmarkFromHtml(text, plainText, user);
Wikitty w = getBowProxy().getWikitty(bookmark);
BowImportHelper.addExtension(w);
BowImportHelper.setImportDate(w, date);
- BookmarkUtils.addTagsToBookmark(tagList, bookmark);
+
+ bookmark.addAllLabels(tagList);
bookmarks.add(bookmark);
}
@@ -137,16 +202,12 @@
if (children != null) {
parseHtmlToBookmarks(children, user, date, bookmarks,
- tagList); // If there is an under node = recursion
+ // On utilise une nouvelle liste pour les enfants
+ // pour eviter que les tags de tous les enfants se
+ // retrouve ensemble
+ new HashSet<String>(tagList)); // If there is an under node = recursion
}
}
- if (isFolder) { // If we find a folder, we have to remove it
- int index = tagList.size() - 1;
-
- if (index > -1) {
- tagList.remove(index);
- }
- }
}
@Override
@@ -167,7 +228,7 @@
List<BowBookmark> bookmarks = new ArrayList<BowBookmark>();
parseHtmlToBookmarks(list, user, new Date(), bookmarks,
- new ArrayList<String>());
+ new HashSet<String>());
proxy.store(bookmarks);
addActionMessage(_("bow.bookmark.import.successful"));
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java 2011-08-18 10:15:48 UTC (rev 309)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java 2011-08-18 14:53:22 UTC (rev 310)
@@ -26,6 +26,7 @@
import com.opensymphony.xwork2.ActionContext;
import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
import org.chorem.bow.BowBookmark;
import org.chorem.bow.OpenSearchActions;
@@ -66,7 +67,7 @@
openSearchActions = new OpenSearchActions();
WikittyProxy proxy = getBowProxy();
- List<String> searchLineList = BowUtils.getWords(searchLine);
+ Set<String> searchLineList = BowUtils.getWords(searchLine);
if (searchLine.charAt(searchLine.length() - 1) == ' ') {
searchLineList.add(""); //If the user doesn't type anything, we have to propose suggestions
1
0
r309 - in trunk/bow-ui/src/main: java/org/chorem/bow java/org/chorem/bow/action webapp/jsp xmi
by bpoussin@users.chorem.org 18 Aug '11
by bpoussin@users.chorem.org 18 Aug '11
18 Aug '11
Author: bpoussin
Date: 2011-08-18 12:15:48 +0200 (Thu, 18 Aug 2011)
New Revision: 309
Url: http://chorem.org/repositories/revision/bow/309
Log:
Evolution #438: Refactore source code and simplify all
- change model: user require preference (not the inverse) this is possible with current wikitty that accept multiple require
Modified:
trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java
trunk/bow-ui/src/main/java/org/chorem/bow/BowMigration04To05.java
trunk/bow-ui/src/main/java/org/chorem/bow/BowSearchResult.java
trunk/bow-ui/src/main/java/org/chorem/bow/BowSession.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java
trunk/bow-ui/src/main/webapp/jsp/preferences.jsp
trunk/bow-ui/src/main/xmi/bow.zargo
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java 2011-08-18 06:46:15 UTC (rev 308)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java 2011-08-18 10:15:48 UTC (rev 309)
@@ -60,13 +60,13 @@
return search;
}
- static public Criteria getBookmarkListCriteriaByUser(BowPreference user) {
+ static public Criteria getBookmarkListCriteriaByUser(BowUser user) {
Criteria criteria = getBookmarkListCriteriaByUser(user, null, null, null);
return criteria;
}
static public Criteria getBookmarkListCriteriaByUser(
- BowPreference user, String searchLine, String fullTextLine, String order) {
+ BowUser user, String searchLine, String fullTextLine, String order) {
Search search = Search.query();
BookmarkUtils.addEqUser(search, user.getWikittyId());
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowMigration04To05.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowMigration04To05.java 2011-08-18 06:46:15 UTC (rev 308)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowMigration04To05.java 2011-08-18 10:15:48 UTC (rev 309)
@@ -94,7 +94,7 @@
static public List<BowUser> migrateUser(WikittyProxy proxy, List<UserImpl> users) {
List<BowUser> result = new ArrayList<BowUser>(users.size());
for (UserImpl user : users) {
- BowPreference bowUser = new BowPreferenceImpl();
+ BowUser bowUser = new BowUserImpl();
result.add(bowUser);
// copie des informations du user
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowSearchResult.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowSearchResult.java 2011-08-18 06:46:15 UTC (rev 308)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowSearchResult.java 2011-08-18 10:15:48 UTC (rev 309)
@@ -33,7 +33,6 @@
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.nuiton.util.StringUtil;
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.search.FacetTopic;
import org.nuiton.wikitty.search.PagedResult;
@@ -84,7 +83,7 @@
this.fullTextLine = StringUtils.defaultString(fullTextLine);
this.order = StringUtils.defaultString(order);
- BowPreference user = session.getPreference();
+ BowUser user = session.getUser();
BowProxy proxy = session.getProxy();
Criteria criteria = BookmarkUtils.getBookmarkListCriteriaByUser(
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowSession.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowSession.java 2011-08-18 06:46:15 UTC (rev 308)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowSession.java 2011-08-18 10:15:48 UTC (rev 309)
@@ -26,6 +26,7 @@
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
+import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -48,8 +49,8 @@
static final private String BOW_SESSION_KEY = BowSession.class.getSimpleName();
protected BowProxy proxy;
- // preference herite de user, on ne stocke que preference
- protected BowPreference preference = null;
+ // user herite de preference, on ne stocke que user
+ protected BowUser user = null;
protected String temporaryToken = null;
protected boolean admin = false;
@@ -89,63 +90,28 @@
return proxy;
}
- public BowPreference getPreference() {
- return preference;
- }
-
- public void setPreference(BowPreference preference) {
- // si c'est le meme objet on ne fait rien
- if (this.preference == preference) {
- return;
- }
-
- if (preference != null) {
- checkPreference(preference);
-
- // check if this user is admin
- String login = preference.getLogin();
- String[] admins = BowConfig.getAdmins();
- boolean isAdmin = false;
- if (admins != null) {
- for (String admin : admins) {
- if (login.equals(admin)) {
- isAdmin = true;
- break;
- }
- }
- }
- setAdmin(isAdmin);
-
- // si c'est le meme user, on ne regenere pas le temporaryToken
- if (!ObjectUtils.equals(this.preference, preference)) {
- // generate temporary token
- String temporaryToken = BowUtils.generateToken();
- setTemporaryToken(temporaryToken);
- }
- }
- this.preference = preference;
- }
-
public BowUser getUser() {
- return preference;
+ return user;
}
public void setUser(BowUser user) {
- // si c'est le meme objet on ne fait rien
- if (this.preference == user) {
- return;
- }
+ // check if this user is admin
+ String login = user.getLogin();
+ String[] admins = BowConfig.getAdmins();
+ boolean isAdmin = ArrayUtils.contains(admins, login);
+ setAdmin(isAdmin);
- BowPreference preference = null;
if (user != null) {
- // load user preference
- preference = getProxy().restore(BowPreference.class, user.getWikittyId());
- if (preference == null) {
- Wikitty w = getProxy().getWikitty(user);
- preference = new BowPreferenceImpl(w);
- }
+ checkPreference(user);
}
- setPreference(preference);
+
+ // si c'est le meme user, on ne regenere pas le temporaryToken
+ if (!ObjectUtils.equals(this.user, user)) {
+ // generate temporary token
+ String temporaryToken = BowUtils.generateToken();
+ setTemporaryToken(temporaryToken);
+ }
+ this.user = user;
}
protected void checkPreference(BowPreference preference) {
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java 2011-08-18 06:46:15 UTC (rev 308)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java 2011-08-18 10:15:48 UTC (rev 309)
@@ -27,7 +27,7 @@
import org.apache.commons.lang.StringUtils;
import org.chorem.bow.BookmarkUtils;
-import org.chorem.bow.BowPreference;
+import org.chorem.bow.BowUser;
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.WikittyProxy;
@@ -47,7 +47,7 @@
try {
if (StringUtils.isNotBlank(searchLine)
|| StringUtils.isNotBlank(fullTextLine)) {
- BowPreference user = getBowSession().getPreference();
+ BowUser user = getBowSession().getUser();
// FIXME poussin 20110817 ATTENTION, la recherche remonte
// potentiellement des bookmarks qui ne nous appartiennent pas,
// dans ce cas, ne faudrait-il pas seulement ce supprimer des
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java 2011-08-18 06:46:15 UTC (rev 308)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java 2011-08-18 10:15:48 UTC (rev 309)
@@ -33,7 +33,6 @@
import org.chorem.bow.BookmarkUtils;
import org.chorem.bow.BowBookmark;
import org.chorem.bow.BowImportHelper;
-import org.chorem.bow.BowPreference;
import org.chorem.bow.BowUser;
import org.htmlparser.Node;
import org.htmlparser.Parser;
@@ -155,7 +154,7 @@
log.info("Importing boormarks : " + upfile);
try {
- BowPreference user = getBowSession().getPreference();
+ BowUser user = getBowSession().getUser();
// Struts limite to html files, is null if not one
if (upfile != null) {
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java 2011-08-18 06:46:15 UTC (rev 308)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java 2011-08-18 10:15:48 UTC (rev 309)
@@ -30,7 +30,7 @@
import org.chorem.bow.BowBookmark;
import org.chorem.bow.BowConfig;
import org.chorem.bow.BowUtils;
-import org.chorem.bow.BowPreference;
+import org.chorem.bow.BowUser;
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.WikittyProxy;
import org.nuiton.wikitty.search.Search;
@@ -76,7 +76,7 @@
@Override
public String execute() {
- BowPreference user = getBowSession().getPreference();
+ BowUser user = getBowSession().getUser();
if (searchLine != null && searchLine.matches("^http://[^ ]*")) {
redirectTo = searchLine;
@@ -116,7 +116,7 @@
}
} else {
// Search on the chosen search engine
- BowPreference pref = getBowSession().getPreference();
+ BowUser pref = getBowSession().getUser();
String searchEngineURL = pref.getSearchEngineUrlResults();
if (StringUtils.isEmpty(searchEngineURL)) {
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java 2011-08-18 06:46:15 UTC (rev 308)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java 2011-08-18 10:15:48 UTC (rev 309)
@@ -39,7 +39,6 @@
import java.util.Set;
import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.time.DateUtils;
import org.chorem.bow.BowSession;
import org.nuiton.util.StringUtil;
@@ -291,7 +290,7 @@
}
}
- protected BowPreference changePreference(BowPreference preference) {
+ protected void changePreference(BowPreference preference) {
preference.setColors(colors);
if (StringUtils.isNotBlank(tagsNb)) {
preference.setTags(Integer.valueOf(tagsNb));
@@ -301,29 +300,60 @@
}
preference.setSearchEngineUrlSuggestions(searchEngineUrlSuggestions);
preference.setSearchEngineUrlResults(searchEngineUrlResults);
-
- return preference;
}
- protected BowUser changeUser(BowUser newUser) {
+ /**
+ * Modifie l'email et le password si necessaire. Si la modif est impossible
+ * email deja utilise, ou mauvais password, alors la methode return false
+ * Si tout ce passe bien, la methode retourne true
+ *
+ * @param user
+ * @return
+ */
+ protected boolean changeUser(BowUser user) {
+ boolean result = true;
+
if (StringUtils.isNotBlank(email)) {
- email = email.trim();
- newUser.setLogin(email);
+ Criteria criteria = Search.query().eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria();
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Try to find user with email: '%s'", email));
+ }
+ BowUser find = getBowProxy().findByCriteria(BowUser.class, criteria);
+
+ //If this email address isn't already used (or if it hasn't changed)
+ if (find == null || find.getLogin().equals(user.getLogin())) {
+ email = email.trim();
+ user.setLogin(email);
+ } else {
+ // this email address is already used by someone else
+ setEmail(user.getLogin());
+
+ // TODO poussin 20110818 addFieldError don't work (no message on web page :(
+ // add addActionError to prevent addFieldError that don't work
+ addFieldError("email", _("bow.preferences.emailAldyExists"));
+ addActionError(_("bow.preferences.emailAldyExists"));
+ result = false;
+ }
}
- if (StringUtils.isNotBlank(newPassword)
+
+ if (result
+ && StringUtils.isNotBlank(newPassword)
&& StringUtils.isNotBlank(confirmNewPassword)
&& StringUtils.isNotBlank(currentPassword)) {
if (newPassword.equals(confirmNewPassword)) {
currentPassword = StringUtil.encodeMD5(currentPassword);
- if (currentPassword.equals(newUser.getPassword())) {
- newUser.setPassword(StringUtil.encodeMD5(newPassword));
+ if (currentPassword.equals(user.getPassword())) {
+ user.setPassword(StringUtil.encodeMD5(newPassword));
} else {
+ // TODO poussin 20110818 addFieldError don't work (no message on web page :(
+ // add addActionError to prevent addFieldError that don't work
addFieldError("currentPassword", _("bow.preferences.badCurrentPassword"));
- return null;
+ addActionError(_("bow.preferences.badCurrentPassword"));
+ result = false;
}
}
}
- return newUser;
+ return result;
}
/**
@@ -410,12 +440,12 @@
try {
BowSession session = getBowSession();
BowProxy proxy = session.getProxy();
- // BowPreference extends BowUser, donc on l'utilise pour tout
- BowPreference preference = getBowSession().getPreference();
+ // BowUser extends BowPreference, donc on l'utilise pour tout
+ BowUser user = session.getUser();
loadLabels(proxy);
Map<String,Integer> bookmarksByImportDate =
- BookmarkUtils.getBookmarksByImportDate(session, preference);
+ BookmarkUtils.getBookmarksByImportDate(session, user);
if (log.isDebugEnabled()) {
log.debug("bookmarksByImportDate found : " + (bookmarksByImportDate == null ? "null" : bookmarksByImportDate.size()));
@@ -426,47 +456,34 @@
// modification des preferences du site
if ("site".equals(update)) { //If the user submitted the form
- preference = changePreference(preference);
- preference = proxy.store(preference);
- getBowSession().setPreference(preference);
+ changePreference(user);
+ user = proxy.store(user);
+ getBowSession().setUser(user);
}
// modification des preferences user (email, password)
if ("user".equals(update)) {
- Criteria criteria = Search.query().eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria();
- if (log.isDebugEnabled()) {
- log.debug(String.format("Try to find user with email: '%s'", email));
- }
- BowUser find = proxy.findByCriteria(BowUser.class, criteria);
-
- //If this email address isn't already used (or if it hasn't changed)
- if (find == null || find.getLogin().equals(preference.getLogin())) {
- BowUser newUser = changeUser(preference);
- if (newUser == null) {
- result = ERROR;
- } else {
- newUser = proxy.store(newUser);
- getBowSession().setUser(newUser);
- result = "update";
- addActionMessage(_("bow.preferences.update.successful"));
- }
+ if (changeUser(user)) {
+ user = proxy.store(user);
+ getBowSession().setUser(user);
+ result = "update";
+ addActionMessage(_("bow.preferences.update.successful"));
} else {
- // this email address is already used by someone else
- setEmail(preference.getLogin());
- addActionError(_("bow.preferences.emailAldyExists"));
result = ERROR;
}
}
- } else {
- // If the user didn't submit the form, the fields are filled with
- // the current preferences values
- setEmail(preference.getLogin());
- setColors(preference.getColors());
- setTagsNb(String.valueOf(preference.getTags()));
- setBookmarksHomePage(String.valueOf(preference.getBookmarks()));
- setSearchEngineUrlSuggestions(preference.getSearchEngineUrlSuggestions());
- setSearchEngineUrlResults(preference.getSearchEngineUrlResults());
}
+
+ // reload all time data (otherwize if submit user info, site info disappear)
+
+ // If the user didn't submit the form, the fields are filled with
+ // the current preferences values
+ setEmail(user.getLogin());
+ setColors(user.getColors());
+ setTagsNb(String.valueOf(user.getTags()));
+ setBookmarksHomePage(String.valueOf(user.getBookmarks()));
+ setSearchEngineUrlSuggestions(user.getSearchEngineUrlSuggestions());
+ setSearchEngineUrlResults(user.getSearchEngineUrlResults());
} catch (Exception eee) {
addActionError(_("bow.error.internal"));
log.error(eee.getMessage(), eee);
Modified: trunk/bow-ui/src/main/webapp/jsp/preferences.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/preferences.jsp 2011-08-18 06:46:15 UTC (rev 308)
+++ trunk/bow-ui/src/main/webapp/jsp/preferences.jsp 2011-08-18 10:15:48 UTC (rev 309)
@@ -40,8 +40,8 @@
<s:actionerror/>
<div class="formFrame fond">
- <s:set var="permanentToken" value="#session.BowSession.getPermanentToken()" />
- <s:set var="temporaryToken" value="#session.BowSession.getTemporaryToken()" />
+ <s:set var="permanentToken" value="bowSession.getPermanentToken()" />
+ <s:set var="temporaryToken" value="bowSession.getTemporaryToken()" />
<ul>
<li>
<s:a title="%{getText('bow.rightMenu.bookmark.temporaryLinkDescription')}"
Modified: trunk/bow-ui/src/main/xmi/bow.zargo
===================================================================
(Binary files differ)
1
0
Author: tchemit
Date: 2011-08-18 08:46:15 +0200 (Thu, 18 Aug 2011)
New Revision: 308
Url: http://chorem.org/repositories/revision/bow/308
Log:
mature project optimisation :(
Removed:
trunk/bow-extension-chromium/bow-extension-chromium.iml
trunk/bow-ui/bow-ui.iml
Modified:
trunk/bow-extension-chromium/
trunk/bow-ui/
Property changes on: trunk/bow-extension-chromium
___________________________________________________________________
Modified: svn:ignore
- target
.classpath
.project
.settings
+ target
.classpath
.project
.settings
*.iml
*.iws
*.ipr
Deleted: trunk/bow-extension-chromium/bow-extension-chromium.iml
===================================================================
--- trunk/bow-extension-chromium/bow-extension-chromium.iml 2011-08-18 06:42:25 UTC (rev 307)
+++ trunk/bow-extension-chromium/bow-extension-chromium.iml 2011-08-18 06:46:15 UTC (rev 308)
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="false">
- <output url="file://$MODULE_DIR$/target/classes" />
- <output-test url="file://$MODULE_DIR$/target/test-classes" />
- <exclude-output />
- <content url="file://$MODULE_DIR$">
- <excludeFolder url="file://$MODULE_DIR$/target" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- </component>
-</module>
-
Property changes on: trunk/bow-ui
___________________________________________________________________
Modified: svn:ignore
- target
PutObjectStoreDirHere
.classpath
.project
.settings
+ target
PutObjectStoreDirHere
.classpath
.project
.settings
*.iml
*.ipr
*.iws
Deleted: trunk/bow-ui/bow-ui.iml
===================================================================
--- trunk/bow-ui/bow-ui.iml 2011-08-18 06:42:25 UTC (rev 307)
+++ trunk/bow-ui/bow-ui.iml 2011-08-18 06:46:15 UTC (rev 308)
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="false">
- <output url="file://$MODULE_DIR$/target/classes" />
- <output-test url="file://$MODULE_DIR$/target/test-classes" />
- <content url="file://$MODULE_DIR$">
- <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/resources" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/xmi" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/models" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/i18n" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/java" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/src/main/resources" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
- <sourceFolder url="file://$MODULE_DIR$/src/test/resources" isTestSource="true" />
- <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/annotations" isTestSource="false" />
- <excludeFolder url="file://$MODULE_DIR$/target/bow-ui-0.5-SNAPSHOT" />
- <excludeFolder url="file://$MODULE_DIR$/target/classes" />
- <excludeFolder url="file://$MODULE_DIR$/target/extracted-sources" />
- <excludeFolder url="file://$MODULE_DIR$/target/i18n" />
- <excludeFolder url="file://$MODULE_DIR$/target/i18n-workdir" />
- <excludeFolder url="file://$MODULE_DIR$/target/maven-archiver" />
- <excludeFolder url="file://$MODULE_DIR$/target/surefire" />
- <excludeFolder url="file://$MODULE_DIR$/target/test-classes" />
- <excludeFolder url="file://$MODULE_DIR$/target/work" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="library" name="Maven: org.nuiton:nuiton-utils:2.1-SNAPSHOT" level="project" />
- <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.1.1" level="project" />
- <orderEntry type="library" name="Maven: commons-primitives:commons-primitives:1.0" level="project" />
- <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.1" level="project" />
- <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.8.3" level="project" />
- <orderEntry type="library" name="Maven: org.nuiton.i18n:nuiton-i18n:2.3.1" level="project" />
- <orderEntry type="library" name="Maven: commons-io:commons-io:2.0.1" level="project" />
- <orderEntry type="library" name="Maven: org.nuiton.wikitty:wikitty-api:3.0.5-SNAPSHOT" level="project" />
- <orderEntry type="library" name="Maven: gnu.cajo:cajo:1.168" level="project" />
- <orderEntry type="library" name="Maven: org.apache.jcs:jcs:1.3" level="project" />
- <orderEntry type="library" name="Maven: concurrent:concurrent:1.0" level="project" />
- <orderEntry type="library" name="Maven: net.iharder:base64:2.3.8" level="project" />
- <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
- <orderEntry type="library" name="Maven: xpp3:xpp3:1.1.4c" level="project" />
- <orderEntry type="library" name="Maven: net.sf.opencsv:opencsv:2.1" level="project" />
- <orderEntry type="library" name="Maven: jboss.jbossts:jbossjta:4.9.0.GA" level="project" />
- <orderEntry type="library" name="Maven: javax.transaction:jta:1.1" level="project" />
- <orderEntry type="library" name="Maven: com.thoughtworks.xstream:xstream:1.2.2" level="project" />
- <orderEntry type="library" name="Maven: xpp3:xpp3_min:1.1.3.4.O" level="project" />
- <orderEntry type="library" name="Maven: jivesoftware:smack:3.1.0" level="project" />
- <orderEntry type="library" name="Maven: jivesoftware:smackx:3.1.0" level="project" />
- <orderEntry type="library" name="Maven: org.apache.struts:struts2-core:2.1.8.1" level="project" />
- <orderEntry type="library" name="Maven: com.opensymphony:xwork-core:2.1.6" level="project" />
- <orderEntry type="library" name="Maven: org.springframework:spring-test:2.5.6" level="project" />
- <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.8.2" level="project" />
- <orderEntry type="library" name="Maven: ognl:ognl:2.7.3" level="project" />
- <orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.15" level="project" />
- <orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.2.1" level="project" />
- <orderEntry type="library" name="Maven: com.sun:tools:1.5.0" level="project" />
- <orderEntry type="library" name="Maven: org.htmlparser:htmlparser:1.6" level="project" />
- <orderEntry type="library" name="Maven: javax.mail:mail:1.4.3" level="project" />
- <orderEntry type="library" name="Maven: javax.activation:activation:1.1" level="project" />
- <orderEntry type="library" scope="PROVIDED" name="Maven: javax.servlet:servlet-api:2.5" level="project" />
- <orderEntry type="library" scope="PROVIDED" name="Maven: javax.servlet:jsp-api:2.0" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: log4j:log4j:1.2.16" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.nuiton.wikitty:wikitty-jdbc-impl:3.0.5-SNAPSHOT" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.nuiton.wikitty:wikitty-solr-impl:3.0.5-SNAPSHOT" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.solr:solr-core:1.4.1" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.solr:solr-solrj:1.4.1" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.slf4j:slf4j-api:1.6.1" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: commons-httpclient:commons-httpclient:3.1" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: commons-codec:commons-codec:1.3" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.codehaus.woodstox:wstx-asl:3.2.7" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: stax:stax-api:1.0.1" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.geronimo.specs:geronimo-stax-api_1.0_spec:1.0.1" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.lucene:lucene-analyzers:2.9.3" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.lucene:lucene-core:2.9.4" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.lucene:lucene-highlighter:2.9.3" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.lucene:lucene-memory:2.9.3" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.lucene:lucene-queries:2.9.3" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.lucene:lucene-snowball:2.9.3" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.lucene:lucene-misc:2.9.3" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.lucene:lucene-spellchecker:2.9.3" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.solr:solr-commons-csv:1.4.1" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: woodstox:wstx-asl:3.2.7" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: commons-dbcp:commons-dbcp:1.4" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: commons-pool:commons-pool:1.5.4" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.slf4j:slf4j-log4j12:1.6.1" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: com.h2database:h2:1.2.134" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.struts:struts2-spring-plugin:2.1.8.1" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.springframework:spring-beans:2.5.6" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.springframework:spring-core:2.5.6" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.springframework:spring-context:2.5.6" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: aopalliance:aopalliance:1.0" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.springframework:spring-web:2.5.6" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.struts:struts2-config-browser-plugin:2.1.8.1" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.struts:struts2-sitemesh-plugin:2.1.8.1" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: opensymphony:sitemesh:2.4.2" level="project" />
- </component>
-</module>
-
1
0
r307 - in trunk: bow-extension-chromium bow-ui bow-ui/src/license
by tchemit@users.chorem.org 18 Aug '11
by tchemit@users.chorem.org 18 Aug '11
18 Aug '11
Author: tchemit
Date: 2011-08-18 08:42:25 +0200 (Thu, 18 Aug 2011)
New Revision: 307
Url: http://chorem.org/repositories/revision/bow/307
Log:
update third-parties
Added:
trunk/bow-extension-chromium/bow-extension-chromium.iml
trunk/bow-ui/bow-ui.iml
Modified:
trunk/bow-ui/src/license/THIRD-PARTY.properties
Added: trunk/bow-extension-chromium/bow-extension-chromium.iml
===================================================================
--- trunk/bow-extension-chromium/bow-extension-chromium.iml (rev 0)
+++ trunk/bow-extension-chromium/bow-extension-chromium.iml 2011-08-18 06:42:25 UTC (rev 307)
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+ <component name="NewModuleRootManager" inherit-compiler-output="false">
+ <output url="file://$MODULE_DIR$/target/classes" />
+ <output-test url="file://$MODULE_DIR$/target/test-classes" />
+ <exclude-output />
+ <content url="file://$MODULE_DIR$">
+ <excludeFolder url="file://$MODULE_DIR$/target" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ </component>
+</module>
+
Added: trunk/bow-ui/bow-ui.iml
===================================================================
--- trunk/bow-ui/bow-ui.iml (rev 0)
+++ trunk/bow-ui/bow-ui.iml 2011-08-18 06:42:25 UTC (rev 307)
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+ <component name="NewModuleRootManager" inherit-compiler-output="false">
+ <output url="file://$MODULE_DIR$/target/classes" />
+ <output-test url="file://$MODULE_DIR$/target/test-classes" />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/resources" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/xmi" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/models" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/i18n" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/java" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/resources" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test/resources" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/annotations" isTestSource="false" />
+ <excludeFolder url="file://$MODULE_DIR$/target/bow-ui-0.5-SNAPSHOT" />
+ <excludeFolder url="file://$MODULE_DIR$/target/classes" />
+ <excludeFolder url="file://$MODULE_DIR$/target/extracted-sources" />
+ <excludeFolder url="file://$MODULE_DIR$/target/i18n" />
+ <excludeFolder url="file://$MODULE_DIR$/target/i18n-workdir" />
+ <excludeFolder url="file://$MODULE_DIR$/target/maven-archiver" />
+ <excludeFolder url="file://$MODULE_DIR$/target/surefire" />
+ <excludeFolder url="file://$MODULE_DIR$/target/test-classes" />
+ <excludeFolder url="file://$MODULE_DIR$/target/work" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="library" name="Maven: org.nuiton:nuiton-utils:2.1-SNAPSHOT" level="project" />
+ <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.1.1" level="project" />
+ <orderEntry type="library" name="Maven: commons-primitives:commons-primitives:1.0" level="project" />
+ <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.1" level="project" />
+ <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.8.3" level="project" />
+ <orderEntry type="library" name="Maven: org.nuiton.i18n:nuiton-i18n:2.3.1" level="project" />
+ <orderEntry type="library" name="Maven: commons-io:commons-io:2.0.1" level="project" />
+ <orderEntry type="library" name="Maven: org.nuiton.wikitty:wikitty-api:3.0.5-SNAPSHOT" level="project" />
+ <orderEntry type="library" name="Maven: gnu.cajo:cajo:1.168" level="project" />
+ <orderEntry type="library" name="Maven: org.apache.jcs:jcs:1.3" level="project" />
+ <orderEntry type="library" name="Maven: concurrent:concurrent:1.0" level="project" />
+ <orderEntry type="library" name="Maven: net.iharder:base64:2.3.8" level="project" />
+ <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
+ <orderEntry type="library" name="Maven: xpp3:xpp3:1.1.4c" level="project" />
+ <orderEntry type="library" name="Maven: net.sf.opencsv:opencsv:2.1" level="project" />
+ <orderEntry type="library" name="Maven: jboss.jbossts:jbossjta:4.9.0.GA" level="project" />
+ <orderEntry type="library" name="Maven: javax.transaction:jta:1.1" level="project" />
+ <orderEntry type="library" name="Maven: com.thoughtworks.xstream:xstream:1.2.2" level="project" />
+ <orderEntry type="library" name="Maven: xpp3:xpp3_min:1.1.3.4.O" level="project" />
+ <orderEntry type="library" name="Maven: jivesoftware:smack:3.1.0" level="project" />
+ <orderEntry type="library" name="Maven: jivesoftware:smackx:3.1.0" level="project" />
+ <orderEntry type="library" name="Maven: org.apache.struts:struts2-core:2.1.8.1" level="project" />
+ <orderEntry type="library" name="Maven: com.opensymphony:xwork-core:2.1.6" level="project" />
+ <orderEntry type="library" name="Maven: org.springframework:spring-test:2.5.6" level="project" />
+ <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.8.2" level="project" />
+ <orderEntry type="library" name="Maven: ognl:ognl:2.7.3" level="project" />
+ <orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.15" level="project" />
+ <orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.2.1" level="project" />
+ <orderEntry type="library" name="Maven: com.sun:tools:1.5.0" level="project" />
+ <orderEntry type="library" name="Maven: org.htmlparser:htmlparser:1.6" level="project" />
+ <orderEntry type="library" name="Maven: javax.mail:mail:1.4.3" level="project" />
+ <orderEntry type="library" name="Maven: javax.activation:activation:1.1" level="project" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven: javax.servlet:servlet-api:2.5" level="project" />
+ <orderEntry type="library" scope="PROVIDED" name="Maven: javax.servlet:jsp-api:2.0" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: log4j:log4j:1.2.16" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.nuiton.wikitty:wikitty-jdbc-impl:3.0.5-SNAPSHOT" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.nuiton.wikitty:wikitty-solr-impl:3.0.5-SNAPSHOT" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.solr:solr-core:1.4.1" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.solr:solr-solrj:1.4.1" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.slf4j:slf4j-api:1.6.1" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: commons-httpclient:commons-httpclient:3.1" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: commons-codec:commons-codec:1.3" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.codehaus.woodstox:wstx-asl:3.2.7" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: stax:stax-api:1.0.1" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.geronimo.specs:geronimo-stax-api_1.0_spec:1.0.1" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.lucene:lucene-analyzers:2.9.3" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.lucene:lucene-core:2.9.4" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.lucene:lucene-highlighter:2.9.3" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.lucene:lucene-memory:2.9.3" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.lucene:lucene-queries:2.9.3" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.lucene:lucene-snowball:2.9.3" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.lucene:lucene-misc:2.9.3" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.lucene:lucene-spellchecker:2.9.3" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.solr:solr-commons-csv:1.4.1" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: woodstox:wstx-asl:3.2.7" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: commons-dbcp:commons-dbcp:1.4" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: commons-pool:commons-pool:1.5.4" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.slf4j:slf4j-log4j12:1.6.1" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: com.h2database:h2:1.2.134" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.struts:struts2-spring-plugin:2.1.8.1" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.springframework:spring-beans:2.5.6" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.springframework:spring-core:2.5.6" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.springframework:spring-context:2.5.6" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: aopalliance:aopalliance:1.0" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.springframework:spring-web:2.5.6" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.struts:struts2-config-browser-plugin:2.1.8.1" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.struts:struts2-sitemesh-plugin:2.1.8.1" level="project" />
+ <orderEntry type="library" scope="RUNTIME" name="Maven: opensymphony:sitemesh:2.4.2" level="project" />
+ </component>
+</module>
+
Modified: trunk/bow-ui/src/license/THIRD-PARTY.properties
===================================================================
--- trunk/bow-ui/src/license/THIRD-PARTY.properties 2011-08-18 02:37:38 UTC (rev 306)
+++ trunk/bow-ui/src/license/THIRD-PARTY.properties 2011-08-18 06:42:25 UTC (rev 307)
@@ -1,7 +1,6 @@
# Generated by org.codehaus.mojo.license.AddThirdPartyMojo
#-------------------------------------------------------------------------------
# Already used licenses in project :
-# - Apache 2
# - Apache License
# - Apache Software License, Version 1.1
# - Apache Software License, version 1.1
@@ -9,14 +8,15 @@
# - BSD style
# - BSD-style license
# - CDDL
+# - COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
# - COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) v1.0
-# - Common Development and Distribution License (CDDL) v1.0
# - Common Public License
# - Common Public License Version 1.0
# - GPLv2+CE
# - Indiana University Extreme! Lab Software License, vesion 1.1.1
-# - LGPL 2.1
# - Lesser General Public License (LGPL) v 3.0
+# - Lesser General Public License (LPGL)
+# - Lesser General Public License (LPGL) v 2.1
# - MIT License
# - MPL 1.1
# - Public Domain
@@ -25,22 +25,23 @@
# - The Apache Software License, Version 1.1
# - The Apache Software License, Version 2.0
# - The H2 License, Version 1.0
+# - http://asm.ow2.org/license.html
#-------------------------------------------------------------------------------
# Please fill the missing licenses for dependencies :
#
#
-#Tue May 17 16:35:20 CEST 2011
-antlr--antlr--2.7.2--jar=BSD License
-asm--asm--3.1--jar=http://asm.ow2.org/license.html
-asm--asm-commons--3.1--jar=http://asm.ow2.org/license.html
-asm--asm-tree--3.1--jar=http://asm.ow2.org/license.html
-commons-primitives--commons-primitives--1.0--jar=The Apache Software License, Version 2.0
-concurrent--concurrent--1.0--jar=TECHNOLOGY LICENSE FROM SUN MICROSYSTEMS, INC.
-dom4j--dom4j--1.1--jar=BSD License
-jakarta-regexp--jakarta-regexp--1.4--jar=The Apache Software License, Version 2.0
-javax.servlet--jsp-api--2.0--jar=Common Development and Distribution License (CDDL) v1.0
-javax.servlet--servlet-api--2.5--jar=Common Development and Distribution License (CDDL) v1.0
-javax.transaction--jta--1.1--jar=COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) v1.0
-org.apache.zookeeper--zookeeper--3.3.1--jar=The Apache Software License, Version 2.0
-oro--oro--2.0.8--jar=The Apache Software License, Version 2.0
-xpp3--xpp3_min--1.1.3.4.O--jar=Indiana University Extreme\! Lab Software License, vesion 1.1.1
+#Thu Aug 18 08:41:56 CEST 2011
+antlr--antlr--2.7.2=BSD License
+asm--asm--3.1=http\://asm.ow2.org/license.html
+asm--asm-commons--3.1=http\://asm.ow2.org/license.html
+asm--asm-tree--3.1=http\://asm.ow2.org/license.html
+commons-primitives--commons-primitives--1.0=The Apache Software License, Version 2.0
+concurrent--concurrent--1.0=TECHNOLOGY LICENSE FROM SUN MICROSYSTEMS, INC.
+dom4j--dom4j--1.1=BSD License
+jakarta-regexp--jakarta-regexp--1.4=The Apache Software License, Version 2.0
+javax.servlet--jsp-api--2.0=Common Development and Distribution License (CDDL) v1.0
+javax.servlet--servlet-api--2.5=Common Development and Distribution License (CDDL) v1.0
+javax.transaction--jta--1.1=COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) v1.0
+org.apache.zookeeper--zookeeper--3.3.1=The Apache Software License, Version 2.0
+oro--oro--2.0.8=The Apache Software License, Version 2.0
+xpp3--xpp3_min--1.1.3.4.O=Indiana University Extreme\! Lab Software License, vesion 1.1.1
1
0
18 Aug '11
Author: bpoussin
Date: 2011-08-18 04:37:38 +0200 (Thu, 18 Aug 2011)
New Revision: 306
Url: http://chorem.org/repositories/revision/bow/306
Log:
Evolution #438: Refactore source code and simplify all
- continuation du nettoyage, le plus gros est fini, et tout semble refonctionner
- plus de popup pour l'edition pour l'instant
- suppression de tous les fichiers qui ne serve pas
- suppression de tous les getTexts et remplacement par _()
- suppression de presque toutes les utilisations de request
- nettoyage des imports
- nettoyage des jsp
- ...
Removed:
trunk/bow-ui/src/main/java/org/chorem/bow/AliasServlet.java
trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkActions.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/OrderAction.java
trunk/bow-ui/src/main/webapp/js/jquery-1.5.2.min.js
trunk/bow-ui/src/main/webapp/js/jquery-ui-1.8.11.custom.min.js
trunk/bow-ui/src/main/webapp/jsp/inc/errorFrame.jsp
trunk/bow-ui/src/main/webapp/jsp/inc/popupAddUrl.jsp
Modified:
trunk/bow-ui/pom.xml
trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java
trunk/bow-ui/src/main/java/org/chorem/bow/BowConfig.java
trunk/bow-ui/src/main/java/org/chorem/bow/BowConfigOption.java
trunk/bow-ui/src/main/java/org/chorem/bow/BowMail.java
trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/AddUrlAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/AliasAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteImportAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/EditBookmarkAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/GenerateTokenAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/HomeAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/LocaleAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/LoginAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/LogoutAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/MigrateDataAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/ReIndexationAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/RegisterAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/RemoveBookmarkAction.java
trunk/bow-ui/src/main/resources/bow.properties
trunk/bow-ui/src/main/resources/org/chorem/bow/action/ForgotPasswordAction-validation.xml
trunk/bow-ui/src/main/resources/org/chorem/bow/action/LoginAction-validation.xml
trunk/bow-ui/src/main/resources/org/chorem/bow/action/RegisterAction-validation.xml
trunk/bow-ui/src/main/resources/struts.xml
trunk/bow-ui/src/main/webapp/WEB-INF/decorators.xml
trunk/bow-ui/src/main/webapp/WEB-INF/decorators/main.jsp
trunk/bow-ui/src/main/webapp/css/bookmark.css
trunk/bow-ui/src/main/webapp/js/bookmark.js
trunk/bow-ui/src/main/webapp/jsp/admin.jsp
trunk/bow-ui/src/main/webapp/jsp/editBookmark.jsp
trunk/bow-ui/src/main/webapp/jsp/error.jsp
trunk/bow-ui/src/main/webapp/jsp/home.jsp
trunk/bow-ui/src/main/webapp/jsp/inc/bookmark.jsp
trunk/bow-ui/src/main/webapp/jsp/inc/footer.jsp
trunk/bow-ui/src/main/webapp/jsp/inc/rightMenu.jsp
trunk/bow-ui/src/main/webapp/jsp/inc/tagsCloud.jsp
trunk/bow-ui/src/main/webapp/jsp/preferences.jsp
trunk/bow-ui/src/main/webapp/jsp/suggestions.jsp
trunk/pom.xml
Modified: trunk/bow-ui/pom.xml
===================================================================
--- trunk/bow-ui/pom.xml 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/pom.xml 2011-08-18 02:37:38 UTC (rev 306)
@@ -66,6 +66,11 @@
</dependency>
<dependency>
+ <groupId>com.jgeppert.struts2.jquery</groupId>
+ <artifactId>struts2-jquery-plugin</artifactId>
+ </dependency>
+
+ <dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<scope>runtime</scope>
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/AliasServlet.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/AliasServlet.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/AliasServlet.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -1,99 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow;
-
-import org.apache.commons.lang.StringUtils;
-import org.nuiton.wikitty.WikittyProxy;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-/**
- * TODO poussin 20110216 a revoir avec le ticket http://www.chorem.org/issues/show/295
- *
- * @author bbrossaud
- * @deprecated transformed to struts action since 0.5
- */
-@Deprecated
-public class AliasServlet extends HttpServlet {
-
- private static final long serialVersionUID = 1L;
- protected String bowServletUrl = "";
-
- public AliasServlet() {
- bowServletUrl = BowConfig.getBowUrl() + BowConfig.getServletBow();
- }
-
- @Override
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException {
- doPost(request, response);
- }
-
- /* @param request servlet request
- * @param response servlet response
- * @throws ServletException if a servlet error occurs
- */
- @Override
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException {
- try {
- String alias = request.getPathInfo();
- if (!StringUtils.isEmpty(alias)) {
- // remove first '/'
- alias = alias.substring(1);
- BowSession session = BowSession.getBowSession(request);
- WikittyProxy proxy = session.getProxy();
-
- /*Criteria criteria = Search.query().eq(
- BowAlias.FQ_FIELD_BOWALIAS_ALIAS, alias).criteria();
-
- BowAlias bowAlias = proxy.findByCriteria(BowAlias.class, criteria);
- String bookmarkId;
- if (bowAlias == null) {
- bookmarkId = alias;
- } else {
- bookmarkId = bowAlias.getBowBookmark();
- }
- BowBookmark bookmark = proxy.restore(BowBookmark.class, bookmarkId);
- if (bookmark != null) {
- String redirect = bookmark.getLink();
- int clicks = bookmark.getClick() + 1;
- bookmark.setClick(clicks);
- proxy.store(bookmark);
- response.sendRedirect(redirect);
- } else {
- response.sendRedirect(bowServletUrl);
- }*/
- } else {
- response.sendRedirect(bowServletUrl);
- }
- } catch (Exception eee) {
- request.getRequestDispatcher("error.jsp").forward(request, response);
- }
- }
-}
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkActions.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkActions.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkActions.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -1,194 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.commons.lang.StringUtils;
-import org.nuiton.util.StringUtil;
-import org.nuiton.wikitty.search.FacetTopic;
-import org.nuiton.wikitty.search.PagedResult;
-
-/**
- *
- * @author bbrossaud
- */
-public class BookmarkActions {
-
- protected String fullTextLine = "";
- protected List<BowBookmark> bookmarks = new ArrayList<BowBookmark>(); // bookmarks which contain the search tags
- protected List<BowBookmark> lastBookmarks = new ArrayList<BowBookmark>();
- protected List<FacetTopic> tagsCloud = new ArrayList<FacetTopic>(); // associate a tag with its frequency
- protected List<String> tagsSearch = new ArrayList<String>(); // contains the tags taped in the search field
- protected int tmax = -1;
- protected int tmin = -1;
-
- public BookmarkActions() {
- }
-
- public BookmarkActions(PagedResult<BowBookmark> booklist) {
- List<FacetTopic> topics = booklist.getTopic(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
- }
-
- public void createTagCloud(List<FacetTopic> cpy) {
- setTagCloud(cpy);
- deleteTagBySearch();
- defineTValues();
- }
-
- public void setTagCloud(List<FacetTopic> cpy) {
- if (cpy != null) {
- tagsCloud = new ArrayList<FacetTopic>(cpy);
- }
- }
-
- public void deleteTagBySearch() {
- List<FacetTopic> save = new ArrayList<FacetTopic>(tagsCloud);
- for (FacetTopic topic : save) {
- String name = topic.getTopicName();
- if (tagsSearch.contains(name)) {
- tagsCloud.remove(topic);
- }
- }
- }
-
- protected void defineTValues() {
- tmax = -1; // correspond to the most tag frequency in the tag cloud
- tmin = -1; // correspond to the less tag frequency in the tag cloud
- for (FacetTopic tag : tagsCloud) {
- int value = tag.getCount();
- if (tmax < value) { // search the most tag frequancy
- tmax = value;
- }
- if (tmin == -1) {
- tmin = value;
- } else if (tmin > value) { // search less tag frequency
- tmin = value;
- }
- }
- }
-
- public void addTags(String str) {
- List<String> tags = BowUtils.getWords(str);
- for (String tag : tags) {
- if (!tagsSearch.contains(tag)) {
- tagsSearch.add(tag);
- }
- }
- }
-
- public void emptySearchline() {
- List<BowBookmark> bookmarkList = new ArrayList<BowBookmark>(bookmarks);
- for (BowBookmark bookmark : bookmarkList) {
- Set<String> tags = bookmark.getLabels();
- if (tags != null && !tags.isEmpty()) {
- bookmarks.remove(bookmark);
- }
- }
- }
-
- public void reset() {
- bookmarks.clear();
- tagsCloud.clear();
- tagsSearch.clear();
- tmax = -1;
- tmin = -1;
- }
-
- public void setFullTextLine(String line) {
- if (line == null) {
- fullTextLine = "";
- } else {
- fullTextLine = line;
- }
- }
-
- public void setBookmarks(List<BowBookmark> bookmarksList) {
- List<BowBookmark> newList = new ArrayList<BowBookmark>(bookmarksList);
- bookmarks = newList;
- }
-
- public void setLastBookmarks(List<BowBookmark> bookmarksList) {
- List<BowBookmark> newList = new ArrayList<BowBookmark>(bookmarksList);
- lastBookmarks = newList;
- }
-
- public void setTagSearch(List<String> cpy) {
- tagsSearch = new ArrayList<String>();
- if (cpy != null) {
- tagsSearch.addAll(cpy);
- }
- }
-
- public String getSearchLine() {
- if (tagsSearch != null) {
- return StringUtil.join(tagsSearch, " ", true); // return the search line created with the tags
- }
- return StringUtils.EMPTY;
- }
-
- public int getFont(int ti) {
- int font = 1;
- if (tmax > tmin) {
- font = 30 * (ti - tmin) / (tmax - tmin); // get the font size for a tag frequency
- }
- if (font < 10) {
- font = 10;
- }
- return font;
- }
-
- public List<FacetTopic> getTagsCloud() {
- return tagsCloud;
- }
-
- public List<String> getTagsSearch() {
- return tagsSearch;
- }
-
- public List<BowBookmark> getBookmarks() {
- return bookmarks;
- }
-
- public List<BowBookmark> getLastBookmarks() {
- return lastBookmarks;
- }
-
- public int getTmin() {
- return tmin;
- }
-
- public int getTmax() {
- return tmax;
- }
-
- public String getFullTextLine() {
- if (fullTextLine == null) {
- return StringUtils.EMPTY;
- }
- return fullTextLine;
- }
-}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -32,8 +32,6 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import javax.servlet.http.HttpServletRequest;
-import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
@@ -42,7 +40,6 @@
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.search.FacetTopic;
-import org.nuiton.wikitty.search.PagedResult;
import org.nuiton.wikitty.WikittyProxy;
import org.nuiton.wikitty.search.operators.Element;
import org.nuiton.wikitty.search.Search;
@@ -121,33 +118,7 @@
return criteria;
}
- static public BookmarkActions createBookmarkActions(HttpServletRequest request,
- PagedResult<BowBookmark> result, String searchLine) {
- String fullText = request.getParameter("fullTextLine");
- BookmarkActions bookmarkActions = new BookmarkActions();
- bookmarkActions.setFullTextLine(fullText);
- List<BowBookmark> bookList = result.getAll();
-
- if (bookList != null) {
- bookmarkActions.setBookmarks(bookList);
- }
- if (fullText == null || fullText.isEmpty()) {
- if (StringUtils.isEmpty(searchLine)) {
- bookmarkActions.emptySearchline();
- } else {
- bookmarkActions.addTags(searchLine); //Adds the new tags
- }
- }
- List<FacetTopic> topics = result.getTopic(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
- if (log.isDebugEnabled()) {
- log.debug(String.format("There are %s tag in cloud", CollectionUtils.isEmpty(topics)?0:topics.size()));
- }
- bookmarkActions.createTagCloud(topics);
- return bookmarkActions;
- }
-
- static public Map<String, Integer> getBookmarksByImportDate(HttpServletRequest request, BowUser user) throws ParseException {
- BowSession session = BowSession.getBowSession(request);
+ static public Map<String, Integer> getBookmarksByImportDate(BowSession session, BowUser user) throws ParseException {
WikittyProxy proxy = session.getProxy();
Criteria criteria = Search.query()
.eq(Element.ELT_EXTENSION, BowImport.EXT_BOWIMPORT)
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowConfig.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowConfig.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowConfig.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -23,8 +23,6 @@
*/
package org.chorem.bow;
-import static org.nuiton.i18n.I18n._;
-
import org.apache.commons.lang.UnhandledException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -148,70 +146,6 @@
}
/**
- * Get bow servlet as string.
- * Default bow applicationConfig will be used
- *
- * @return servlet name
- */
- public static String getServletBow() {
- return getServletBow(getConfig());
- }
-
- /**
- * Get bow servlet as string.
- *
- * @param config bow configuration
- * @return servlet name
- */
- public static String getServletBow(ApplicationConfig config) {
- return config.getOption(BowConfigOption.SERVLET_BOW.key);
- }
-
- /**
- * Get alias servlet as string.
- * Default bow applicationConfig will be used
- *
- * @return servlet name
- */
- public static String getServletAlias() {
- return getServletAlias(getConfig());
- }
-
- /**
- * Get alias servlet as string.
- *
- * @param config bow configuration
- * @return servlet name
- */
- public static String getServletAlias(ApplicationConfig config) {
- return config.getOption(BowConfigOption.SERVLET_ALIAS.key);
- }
-
- /**
- * Get alias servlet url as string.
- * Default bow applicationConfig will be used
- *
- * @return servlet name
- */
- public static String getServletAliasUrl() {
- return getServletAliasUrl(getConfig());
- }
-
- /**
- * Get alias servlet url as string.
- *
- * @param config bow configuration
- * @return servlet name
- */
- public static String getServletAliasUrl(ApplicationConfig config) {
- String result = getAliasUrl(config) + getServletAlias(config);
- if (result != null && result.charAt(result.length() - 1) != '/') {
- result += '/';
- }
- return result;
- }
-
- /**
* Get bow smtp server as string.
* Default bow applicationConfig will be used
*
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowConfigOption.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowConfigOption.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowConfigOption.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -49,15 +49,6 @@
"alias.url",
_("bow.config.alias.url.description"),
"alias/", String.class, false, false),
- SERVLET_BOW(
- "servlet.bow",
- _("bow.config.servlet.bow.description"),
- null, String.class, false, false),
- // For apache url rewriting
- SERVLET_ALIAS(
- "servlet.alias",
- _("bow.config.servlet.bow.description"),
- null, String.class, false, false),
SEARCH_ENGINE(
"search.engine",
_("bow.config.search.engine.description"),
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowMail.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowMail.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowMail.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -23,8 +23,6 @@
*/
package org.chorem.bow;
-import org.nuiton.util.ApplicationConfig;
-
import java.util.Properties;
import javax.mail.Message;
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -84,16 +84,18 @@
*/
static public String redirectTo(String searchLine, String fullTextLine) {
String result = "home.action";
+ boolean searchLineNotBlank = StringUtils.isNotBlank(searchLine);
+ boolean fullTextLineNotBlank = StringUtils.isNotBlank(fullTextLine);
- if (!StringUtils.isEmpty(searchLine) || !StringUtils.isEmpty(fullTextLine)) {
- result = "search.action?";
- if (searchLine != null) {
+ if (searchLineNotBlank || fullTextLineNotBlank) {
+ result += "?";
+ if (searchLineNotBlank) {
result += "searchLine=" + searchLine;
}
- if (searchLine != null && fullTextLine != null) {
+ if (searchLineNotBlank && fullTextLineNotBlank) {
result += "&";
}
- if (fullTextLine != null) {
+ if (fullTextLineNotBlank) {
result += "fullTextLine=" + fullTextLine;
}
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/AddUrlAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/AddUrlAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/AddUrlAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -28,7 +28,6 @@
import org.chorem.bow.BowBookmark;
import org.chorem.bow.BowUser;
import org.chorem.bow.BowUtils;
-import static org.nuiton.i18n.I18n.n_;
import org.nuiton.wikitty.WikittyProxy;
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.search.PagedResult;
@@ -52,8 +51,6 @@
protected String tags;
protected String nameAndTags;
protected String redirectTo;
- protected String searchLine = "";
- protected String fullTextLine = "";
public String getBookmarkId() {
return bookmarkId;
@@ -148,34 +145,6 @@
return redirectTo;
}
- /**
- * @return the searchLine
- */
- public String getSearchLine() {
- return searchLine;
- }
-
- /**
- * @param searchLine the searchLine to set
- */
- public void setSearchLine(String searchLine) {
- this.searchLine = searchLine;
- }
-
- /**
- * @return the fullTextLine
- */
- public String getFullTextLine() {
- return fullTextLine;
- }
-
- /**
- * @param fullTextLine the fullTextLine to set
- */
- public void setFullTextLine(String fullTextLine) {
- this.fullTextLine = fullTextLine;
- }
-
public String execute() {
try {
WikittyProxy proxy = getBowProxy();
@@ -184,7 +153,7 @@
BowUser user = getBowSession().getUser();
String userId = user.getWikittyId();
- if (bookmarkId != null && !StringUtils.isEmpty(bookmarkId)) {
+ if (StringUtils.isNotBlank(bookmarkId)) {
bookmarkToModify = proxy.restore(BowBookmark.class, bookmarkId);
}
if (log.isDebugEnabled()) {
@@ -198,13 +167,13 @@
// TODO sletellier 20110416 : return error message when public or private alias is already used
Criteria privateAliasCriteria = null;
Criteria publicAliasCriteria = null;
- if (privateAlias != null && !privateAlias.isEmpty()) {
+ if (StringUtils.isNotEmpty(privateAlias)) {
privateAliasCriteria = Search.query()
.eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_PRIVATEALIAS, privateAlias)
.eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, userId)
.criteria().setEndIndex(0);
}
- if (publicAlias != null && !publicAlias.isEmpty()) {
+ if (StringUtils.isNotEmpty(publicAlias)) {
publicAliasCriteria = Search.query()
.eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_PUBLICALIAS, publicAlias)
.criteria().setEndIndex(0);
@@ -278,15 +247,15 @@
if (bookmark != null || bookmarkToModify != null) {
proxy.store(bookmark, bookmarkToModify); //Stores the bookmark if everything is ok
- addActionMessage(getText(n_("bow.bookmark.add.successful")));
+ addActionMessage(_("bow.bookmark.add.successful"));
if (log.isDebugEnabled()) {
log.debug("Adding URL");
}
}
redirectTo = BowUtils.redirectTo(searchLine, fullTextLine);
- } catch (Exception e) {
- addActionError(getText(n_("bow.error.internal")));
- log.error(e.getMessage(), e);
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
}
return SUCCESS;
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/AliasAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/AliasAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/AliasAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -27,7 +27,6 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.chorem.bow.BowBookmark;
-import static org.nuiton.i18n.I18n.n_;
import org.nuiton.wikitty.WikittyProxy;
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.search.Search;
@@ -91,7 +90,7 @@
}
}
} catch (Exception eee) {
- addActionError(getText(n_("bow.error.internal")));
+ addActionError(_("bow.error.internal"));
log.error(eee.getMessage(), eee);
result = ERROR;
}
@@ -109,7 +108,7 @@
BowBookmark bookmark = proxy.findByCriteria(BowBookmark.class, criteria);
if (bookmark != null) {
- addActionError(getText(n_("bow.alias.already.exists"), new String[]{alias}));
+ addActionError(_("bow.alias.already.exists", alias));
log.error("A bookmark already exists with alias " + alias);
result = ERROR;
@@ -119,14 +118,14 @@
bookmark.setPublicAlias(alias);
proxy.store(bookmark);
} else {
- addActionError(getText(n_("bow.alias.bookmarkId.unknown"), new String[]{bookmarkId}));
+ addActionError(_("bow.alias.bookmarkId.unknown", bookmarkId));
log.debug("No bookmark with id " + bookmarkId);
result = ERROR;
}
}
}
} catch (Exception eee) {
- addActionError(getText(n_("bow.error.internal")));
+ addActionError(_("bow.error.internal"));
log.error(eee.getMessage(), eee);
result = ERROR;
}
@@ -145,12 +144,12 @@
bookmark.setPublicAlias(null);
proxy.store(bookmark);
} else {
- addActionError(getText(n_("bow.alias.bookmarkId.unknown"), new String[]{bookmarkId}));
+ addActionError(_("bow.alias.bookmarkId.unknown", bookmarkId));
log.error("No bookmark with id " + bookmarkId);
result = ERROR;
}
} catch (Exception eee) {
- addActionError(getText(n_("bow.error.internal")));
+ addActionError(_("bow.error.internal"));
log.error(eee.getMessage(), eee);
result = ERROR;
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteImportAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteImportAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteImportAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -32,7 +32,6 @@
import org.nuiton.wikitty.WikittyProxy;
import org.nuiton.wikitty.search.Search;
-import static org.nuiton.i18n.I18n.n_;
/**
* Supprime un import de bookmark
@@ -76,10 +75,10 @@
proxy.delete(bookmarks);
- addActionMessage(getText(n_("bow.bookmark.import.delete.successful")));
+ addActionMessage(_("bow.bookmark.import.delete.successful"));
}
} catch (Exception e) {
- addActionError(getText(n_("bow.error.internal")));
+ addActionError(_("bow.error.internal"));
log.error(e.getMessage(), e);
}
return SUCCESS;
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -23,23 +23,16 @@
*/
package org.chorem.bow.action;
-import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
-import org.chorem.bow.BowBookmark;
import org.chorem.bow.BookmarkUtils;
import org.chorem.bow.BowPreference;
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.WikittyProxy;
-import org.nuiton.wikitty.search.Search;
-import static org.nuiton.i18n.I18n.n_;
-
/**
- * Supprime des bookmarks qui satisfont le critere de recherche. Si fullTextLine
- * est non vide, alors elle est utilisee, pour la recherche, sinon on utilise
- * searchLine
+ * Supprime des bookmarks qui satisfont le critere de recherche.
*
* @author poussin
*/
@@ -55,18 +48,26 @@
if (StringUtils.isNotBlank(searchLine)
|| StringUtils.isNotBlank(fullTextLine)) {
BowPreference user = getBowSession().getPreference();
+ // FIXME poussin 20110817 ATTENTION, la recherche remonte
+ // potentiellement des bookmarks qui ne nous appartiennent pas,
+ // dans ce cas, ne faudrait-il pas seulement ce supprimer des
+ // reader/write/admin ?
Criteria criteria = BookmarkUtils.getBookmarkListCriteriaByUser(
user, searchLine, fullTextLine, null);
WikittyProxy proxy = getBowProxy();
List<String> ids = proxy.findAllIdByCriteria(criteria).getAll();
+ if (log.isDebugEnabled()) {
+ log.debug("Will delete " + ids.size() + " bookmarks");
+ }
+
proxy.delete(ids);
- addActionMessage(getText(n_("bow.search.results.deleted")));
+ addActionMessage(_("bow.search.results.deleted"));
}
- } catch (Exception e) {
- addActionError(getText(n_("bow.error.internal")));
- log.error(e.getMessage(), e);
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
}
return SUCCESS;
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/EditBookmarkAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/EditBookmarkAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/EditBookmarkAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -30,8 +30,6 @@
import org.nuiton.wikitty.search.Search;
import org.nuiton.wikitty.search.operators.Element;
-import static org.nuiton.i18n.I18n.n_;
-
/**
* Load a bookmark to display it on modification page, used when javascript
* is not available on client
@@ -66,11 +64,11 @@
try {
WikittyProxy proxy = getBowProxy();
Criteria criteria = Search.query()
- .eq(Element.ELT_ID, id).criteria();
+ .eq(Element.ELT_ID, id).criteria();
bookmark = proxy.findByCriteria(BowBookmark.class, criteria);
- } catch (Exception e) {
- addActionError(getText(n_("bow.error.internal")));
- log.error(e.getMessage(), e);
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
}
return SUCCESS;
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -64,6 +64,7 @@
/**
* Exports the bookmarks in HTML format
*/
+ @Override
public String execute() {
WikittyProxy proxy = getBowProxy();
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -27,6 +27,7 @@
import javax.mail.internet.AddressException;
import org.apache.commons.lang.RandomStringUtils;
+import org.apache.commons.lang.StringUtils;
import org.chorem.bow.BowMail;
import org.chorem.bow.BowUser;
import org.nuiton.util.StringUtil;
@@ -34,8 +35,6 @@
import org.nuiton.wikitty.WikittyProxy;
import org.nuiton.wikitty.search.Search;
-import static org.nuiton.i18n.I18n.n_;
-
/**
* Genere un nouveau mot de passe pour l'utilisateur et lui envoie par mail
* TODO poussin 20110211 il faudrait ajouter une securite pour eviter que
@@ -64,73 +63,60 @@
this.email = email;
}
-// protected boolean passwordExists(String password) {
-// WikittyProxy proxy = getBowProxy();
-// Criteria criteria = Search.query().eq(User.FQ_FIELD_USER_PASSWORD, password).criteria();
-// List<User> users = proxy.findAllByCriteria(User.class, criteria).getAll();
-// if (users != null && users.size() > 0) {
-// return true;
-// }
-// return false;
-// }
-
/**
* Generates a new password and sends it to the user
*/
+ @Override
public String execute() {
String result = INPUT;
try {
- if (email != null) {
+ if (StringUtils.isNotBlank(email)) {
email = email.trim();
- if (!email.isEmpty()) {
- WikittyProxy proxy = getBowProxy();
- Criteria criteria = Search.query()
- .eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria();
- BowUser user = proxy.findByCriteria(BowUser.class, criteria);
+ WikittyProxy proxy = getBowProxy();
+ Criteria criteria = Search.query()
+ .eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria();
+ BowUser user = proxy.findByCriteria(BowUser.class, criteria);
- if (user != null) { //If the email address exists
- String password = "";
- String md5 = "";
+ if (user != null) { //If the email address exists
+ String password = "";
+ String md5 = "";
- password = RandomStringUtils.randomAlphanumeric(20);
- md5 = StringUtil.encodeMD5(password);
- try {
- String mailContent;
+ password = RandomStringUtils.randomAlphanumeric(20);
+ md5 = StringUtil.encodeMD5(password);
+ try {
+ String mailContent;
- mailContent = getText(n_("bow.register.mailHi")) +
- ",\n\n" + getText(n_("bow.register.mailPwd")) + ": " +
- password + "\n\n" + getText(n_("bow.register.mailEmail")) +
- ": " + email + "\n\n";
- BowMail.sendMail(email,
- getText(n_("bow.register.mailSubject")),
- mailContent);
+ mailContent = _("bow.register.mailHi") +
+ ",\n\n" + _("bow.register.mailPwd") + ": " +
+ password + "\n\n" + _("bow.register.mailEmail") +
+ ": " + email + "\n\n";
+ BowMail.sendMail(email,
+ _("bow.register.mailSubject"),
+ mailContent);
- //The password is changed only if the mail has been sent
- user.setPassword(md5);
- proxy.store(user);
- } catch (AddressException e) {
- //If the email address is invalid
- String message = getText("bow.mail.badFormat");
-
- addActionError(n_(message));
- log.error(message + " (email:" + email + ")", e);
- } catch (MessagingException e) {
- String message = getText("bow.mail.sendError");
-
- addActionError(n_(message));
- log.error(message + "(" + e.getMessage() + ")", e);
- }
- result = SUCCESS;
- } else { //If the email is not associated with an account
- addFieldError("email",
- getText(n_("bow.forgotPassword.emailDoesntExist")));
+ //The password is changed only if the mail has been sent
+ user.setPassword(md5);
+ proxy.store(user);
+ } catch (AddressException eee) {
+ //If the email address is invalid
+ addActionError(_("bow.mail.badFormat"));
+ log.error(String.format("Can't send message email to '%s'",
+ email), eee);
+ } catch (MessagingException eee) {
+ addActionError("bow.mail.sendError");
+ log.error(String.format("Can't send message email to '%s'",
+ email), eee);
}
+ result = SUCCESS;
+ } else { //If the email is not associated with an account
+ addFieldError("email",
+ _("bow.forgotPassword.emailDoesntExist"));
}
}
- } catch (Exception e) {
- addActionError(getText(n_("bow.error.internal")));
- log.error(e.getMessage(), e);
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
}
return result;
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/GenerateTokenAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/GenerateTokenAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/GenerateTokenAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -27,8 +27,6 @@
import org.chorem.bow.BowUtils;
import org.nuiton.wikitty.WikittyProxy;
-import static org.nuiton.i18n.I18n.n_;
-
/**
* Force la regeneration de token permanent et temporaire
*
@@ -41,6 +39,7 @@
/**
* Generates a new permanent and temporary token
*/
+ @Override
public String execute() {
try {
BowUser user = getBowSession().getUser();
@@ -52,10 +51,10 @@
String temporaryToken = BowUtils.generateToken();
getBowSession().setTemporaryToken(temporaryToken);
- addActionMessage(getText(n_("bow.token.generate.successful")));
- } catch (Exception e) {
- addActionError(getText(n_("bow.error.internal")));
- log.error(e.getMessage(), e);
+ addActionMessage(_("bow.token.generate.successful"));
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
}
return SUCCESS;
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/HomeAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/HomeAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/HomeAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -30,20 +30,10 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.struts2.interceptor.ServletRequestAware;
-import org.chorem.bow.BookmarkUtils;
-import org.chorem.bow.BowBookmark;
-import org.chorem.bow.BowConfig;
-import org.chorem.bow.BowPreference;
import org.chorem.bow.BowSearchResult;
import org.chorem.bow.BowSession;
import org.nuiton.util.TimeLog;
-import org.nuiton.wikitty.WikittyProxy;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.PagedResult;
-import static org.nuiton.i18n.I18n.n_;
-
/**
* Prepare l'affichage de la page d'accueil
*
@@ -120,7 +110,7 @@
BowSession s = getBowSession();
searchResult = new BowSearchResult(s, searchLine, fullTextLine, order);
} catch (Exception eee) {
- addActionError(getText(n_("bow.error.internal")));
+ addActionError(_("bow.error.internal"));
log.error(eee.getMessage(), eee);
}
timeLog.log(start, "execute");
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -30,7 +30,6 @@
import java.util.Date;
import java.util.List;
-import org.apache.struts2.interceptor.ServletRequestAware;
import org.chorem.bow.BookmarkUtils;
import org.chorem.bow.BowBookmark;
import org.chorem.bow.BowImportHelper;
@@ -44,15 +43,12 @@
import org.nuiton.wikitty.WikittyProxy;
import org.nuiton.wikitty.entities.Wikitty;
-import static org.nuiton.i18n.I18n.n_;
-
/**
* Import un bookmark HTML
*
* @author poussin
*/
-public class ImportBookmarksAction extends PreferencesAction implements
- ServletRequestAware {
+public class ImportBookmarksAction extends PreferencesAction {
private static final long serialVersionUID = -5962680416570797028L;
@@ -154,6 +150,7 @@
}
}
+ @Override
public String execute() {
log.info("Importing boormarks : " + upfile);
@@ -174,33 +171,23 @@
new ArrayList<String>());
proxy.store(bookmarks);
-// redirectTo = BowUtils.redirectTo(searchLine, fullTextLine);
-// if (StringUtils.isEmpty(searchLine)) {
-// BowInit.initHomePage(request, user);
-// } else {
-// BowSearch.search(request, user);
-// }
- addActionMessage(getText(n_("bow.bookmark.import.successful")));
+ addActionMessage(_("bow.bookmark.import.successful"));
} catch (ParserException eee) {
- log.error(String.format("Can't parse imported file '%s'", getUpfileFileName()), eee);
- addActionError(getText(n_("bow.bookmark.badFileFormat")));
-
-// if (searchLine == null || searchLine.isEmpty()) {
-// BowInit.initHomePage(request, user);
-// } else {
-// BowSearch.search(request, user);
-// }
+ log.error(String.format("Can't parse imported file '%s'",
+ getUpfileFileName()), eee);
+ addActionError(_("bow.bookmark.badFileFormat"));
} catch (IOException eee) {
- log.error(String.format("Can't read imported file '%s'", getUpfileFileName()), eee);
- addActionError(getText(n_("bow.error.internal")));
+ log.error(String.format("Can't read imported file '%s'",
+ getUpfileFileName()), eee);
+ addActionError(_("bow.error.internal"));
return ERROR;
}
} else {
- addActionError(getText(n_("bow.bookmark.badFileFormat")));
+ addActionError(_("bow.bookmark.badFileFormat"));
return ERROR;
}
} catch (Exception eee) {
- addActionError(getText(n_("bow.error.internal")));
+ addActionError(_("bow.error.internal"));
log.error(eee.getMessage(), eee);
return ERROR;
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/LocaleAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/LocaleAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/LocaleAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -26,7 +26,8 @@
public class LocaleAction extends BowBaseAction {
private static final long serialVersionUID = 9124549040894568467L;
+ @Override
public String execute() {
- return SUCCESS;
+ return SUCCESS;
}
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/LoginAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/LoginAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/LoginAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -24,9 +24,8 @@
package org.chorem.bow.action;
-import javax.servlet.http.HttpServletRequest;
+import org.apache.commons.lang.StringUtils;
-import org.apache.struts2.interceptor.ServletRequestAware;
import org.chorem.bow.BowConfig;
import org.chorem.bow.BowUser;
import org.chorem.bow.BowUserImpl;
@@ -35,18 +34,17 @@
import org.nuiton.wikitty.WikittyProxy;
import org.nuiton.wikitty.search.Search;
-import static org.nuiton.i18n.I18n.n_;
-
/**
* authentifie l'utilisateur et place son objet User dans la bow session
*
* @author poussin
*/
-public class LoginAction extends BowBaseAction implements ServletRequestAware {
+public class LoginAction extends BowBaseAction {
+
private static final long serialVersionUID = 6891064800288772246L;
+
protected String email;
protected String password;
- protected HttpServletRequest servletRequest;
public String getEmail() {
return email;
@@ -64,44 +62,37 @@
this.password = password;
}
- @Override
- public void setServletRequest(HttpServletRequest request) {
- this.servletRequest = request;
- }
-
/**
* Check password in solr index, if fail try to check password admin in config file
- *
- * @param email
- * @param password
+ *
+ * @param email non null et non vide email
+ * @param password non null et non vide email
* @return
*/
protected BowUser checkLogin(String email, String password) {
BowUser result = null;
- if (email != null && password != null) {
- if (!email.isEmpty() && !password.equals(StringUtil.encodeMD5(""))) {
- WikittyProxy proxy = getBowProxy();
- Criteria criteria = Search.query().eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).
- eq(BowUser.FQ_FIELD_WIKITTYUSER_PASSWORD, password).criteria();
- result = proxy.findByCriteria(BowUser.class, criteria);
- if (result == null) {
- // failback: try to authenticate admin with config info
- String configPassword = BowConfig.getAdminPassword(email);
- log.info("failback password: " + password + " configPassword: " + configPassword);
- if (password.equals(configPassword)) {
- // admin authenticate with config, this is possible when
- // solr index is corrupted or missed. Admin must go to admin
- // page en recreate index
- result = new BowUserImpl();
- result.setLogin(email);
- result.setPassword(configPassword);
- addActionMessage(getText(n_("bow.login.admin.failback")));
- log.warn(getText(n_("bow.login.admin.failback")));
- } else {
- addActionError(getText(n_("bow.login.authenticationFailure")));
- }
- }
+ WikittyProxy proxy = getBowProxy();
+ Criteria criteria = Search.query().eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).
+ eq(BowUser.FQ_FIELD_WIKITTYUSER_PASSWORD, password).criteria();
+ result = proxy.findByCriteria(BowUser.class, criteria);
+
+ if (result == null) {
+ // failback: try to authenticate admin with config info
+ String configPassword = BowConfig.getAdminPassword(email);
+ log.info(String.format("failback password: '%s' configPassword: '%s'",
+ password, configPassword));
+ if (password.equals(configPassword)) {
+ // admin authenticate with config, this is possible when
+ // solr index is corrupted or missed. Admin must go to admin
+ // page en recreate index
+ result = new BowUserImpl();
+ result.setLogin(email);
+ result.setPassword(configPassword);
+ addActionMessage(_("bow.login.admin.failback"));
+ log.warn(_("bow.login.admin.failback"));
+ } else {
+ addActionError(_("bow.login.authenticationFailure"));
}
}
return result;
@@ -110,29 +101,28 @@
/**
* Authenticates the user if his email and password are valid
*/
+ @Override
public String execute() {
String result = INPUT;
try {
- if (email != null) {
+ if (StringUtils.isNotBlank(email)) {
email = email.trim();
- if (password != null) {
+ if (StringUtils.isNotEmpty(password)) {
String md5 = StringUtil.encodeMD5(password);
BowUser user;
user = checkLogin(email, md5);
if (user != null) {
getBowSession().setUser(user);
-// BowPreference pref = getBowSession().getPreference();
-// BowInit.initHomePage(servletRequest, pref);
result = SUCCESS;
}
}
}
- } catch (Exception e) {
- addActionError(getText(n_("bow.error.internal")));
- log.error(e.getMessage(), e);
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
}
return result;
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/LogoutAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/LogoutAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/LogoutAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -33,6 +33,7 @@
public class LogoutAction extends BowBaseAction {
private static final long serialVersionUID = 4806944250461551896L;
+ @Override
public String execute() {
BowSession.invalidate(session);
return SUCCESS;
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/MigrateDataAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/MigrateDataAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/MigrateDataAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -33,8 +33,6 @@
import org.nuiton.util.VersionUtil;
import org.nuiton.wikitty.WikittyProxy;
-import static org.nuiton.i18n.I18n.n_;
-
/**
* Lance la migration des données de la version 0.4 vers 0.5
*
@@ -61,6 +59,7 @@
this.versionTo = versionTo;
}
+ @Override
public String execute() {
try {
if (StringUtils.isBlank(versionFrom) || StringUtils.isBlank(versionTo)) {
@@ -73,11 +72,11 @@
if (VersionUtil.equals(versionFrom, "0.4")
&& VersionUtil.equals(versionTo, "0.5")) {
BowMigration04To05.migrate(proxy);
- addActionMessage(getText(n_("bow.admin.dataMigration.success")));
+ addActionMessage(_("bow.admin.dataMigration.success"));
} else if (VersionUtil.equals(versionFrom, "0.6")
&& VersionUtil.equals(versionTo, "1.1")) {
BowMigration06To11.migrate(proxy);
- addActionMessage(getText(n_("bow.admin.dataMigration.success")));
+ addActionMessage(_("bow.admin.dataMigration.success"));
} else {
addActionMessage(String.format(
"No migration found for %s to %s",
@@ -85,9 +84,9 @@
}
}
}
- } catch (Exception e) {
- addActionError(getText(n_("bow.error.internal")));
- log.error(e.getMessage(), e);
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
}
return SUCCESS;
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -23,20 +23,15 @@
*/
package org.chorem.bow.action;
-import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
-import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.chorem.bow.BowBookmark;
-import org.chorem.bow.BookmarkActions;
-import org.chorem.bow.BookmarkUtils;
import org.chorem.bow.BowConfig;
import org.chorem.bow.BowUtils;
import org.chorem.bow.BowPreference;
import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.PagedResult;
import org.nuiton.wikitty.WikittyProxy;
import org.nuiton.wikitty.search.Search;
@@ -46,13 +41,11 @@
*
* @author poussin
*/
-public class OpenSearchResultAction extends BowBaseAction implements ServletRequestAware,
-ServletResponseAware {
+public class OpenSearchResultAction extends BowBaseAction implements ServletResponseAware {
private static final long serialVersionUID = -1691325797986483856L;
protected String token;
protected String redirectTo;
- protected HttpServletRequest request;
protected HttpServletResponse response;
/**
@@ -77,20 +70,16 @@
}
@Override
- public void setServletRequest(HttpServletRequest request) {
- this.request = request;
- }
-
- @Override
public void setServletResponse(HttpServletResponse response) {
- this.response = response;
+ this.response = response;
}
+ @Override
public String execute() {
BowPreference user = getBowSession().getPreference();
if (searchLine != null && searchLine.matches("^http://[^ ]*")) {
- redirectTo = BowUtils.redirectTo(searchLine, null);
+ redirectTo = searchLine;
} else if (searchLine != null
&& (searchLine.startsWith(":") || searchLine.startsWith("t:"))) {
@@ -98,28 +87,10 @@
int index = searchLine.indexOf(":");
searchLine = searchLine.substring(index + 1); //Suppresses first ":"
- WikittyProxy proxy = getBowProxy();
- Criteria criteria = BookmarkUtils.getBookmarkListCriteriaByUser(
- user, searchLine, null, null);
- criteria = criteria.addSortDescending(BowBookmark.FQ_FIELD_BOWBOOKMARK_CLICK);
- PagedResult<BowBookmark> result = proxy.findAllByCriteria(
- BowBookmark.class, criteria); //Retrieves bookmarks by search
- BookmarkActions bookmarkActions = BookmarkUtils.createBookmarkActions(
- request, result, searchLine);
- request.setAttribute("bookmarkActions", bookmarkActions);
- request.setAttribute("token", token);
redirectTo = BowUtils.redirectTo(searchLine, null);
} else if (searchLine != null && searchLine.startsWith("f:")) {
// Fulltext search in bow
String fullText = searchLine.substring(2);
- WikittyProxy proxy = getBowProxy();
- Criteria criteria;
- criteria = BookmarkUtils.getBookmarkListCriteriaByUser(user, null, searchLine, null);
-
- PagedResult<BowBookmark> result = proxy.findAllByCriteria(BowBookmark.class, criteria);
- BookmarkActions bookmarkActions = BookmarkUtils.createBookmarkActions(request, result, null);
- request.setAttribute("bookmarkActions", bookmarkActions);
- request.setAttribute("token", token);
redirectTo = BowUtils.redirectTo(null, fullText);
} else if (searchLine != null && searchLine.startsWith("a:")) {
// Redirects to the requested alias
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -23,13 +23,10 @@
*/
package org.chorem.bow.action;
+import com.opensymphony.xwork2.ActionContext;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.struts2.interceptor.ServletRequestAware;
import org.chorem.bow.BowBookmark;
import org.chorem.bow.OpenSearchActions;
import org.chorem.bow.BowUser;
@@ -46,21 +43,27 @@
*
* @author poussin
*/
-public class OpenSearchSuggestionAction extends BowBaseAction implements ServletRequestAware {
+public class OpenSearchSuggestionAction extends BowBaseAction {
+
private static final long serialVersionUID = 3973618635494129146L;
- protected HttpServletRequest request;
+ static public OpenSearchSuggestionAction getAction() {
+ Object action = ActionContext.getContext().get(CONTEXT_ACTION_KEY);
+ return (OpenSearchSuggestionAction) action;
+ }
- @Override
- public void setServletRequest(HttpServletRequest request) {
- this.request = request;
+ protected OpenSearchActions openSearchActions;
+
+ public OpenSearchActions getOpenSearchActions() {
+ return openSearchActions;
}
+ @Override
public String execute() {
BowUser user = getBowSession().getUser();
if (searchLine != null) {
- OpenSearchActions openSearchActions = new OpenSearchActions();
+ openSearchActions = new OpenSearchActions();
WikittyProxy proxy = getBowProxy();
List<String> searchLineList = BowUtils.getWords(searchLine);
@@ -90,7 +93,6 @@
openSearchActions.setBookmarkList(bookList);
openSearchActions.setSuggestionList(topics);
openSearchActions.findSuggestions(searchLineList);
- request.setAttribute("openSearchAction", openSearchActions);
}
return SUCCESS;
}
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/OrderAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/OrderAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/OrderAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -1,119 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.struts2.interceptor.ServletRequestAware;
-import org.chorem.bow.BowBookmark;
-import org.chorem.bow.BookmarkActions;
-import org.chorem.bow.BookmarkUtils;
-import org.chorem.bow.BowPreference;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.PagedResult;
-import org.nuiton.wikitty.WikittyProxy;
-
-import static org.nuiton.i18n.I18n.n_;
-
-/**
- * Permet de modifie l'ordre de tri des bookmarks
- * TODO poussin 20110211 cette action n'est pas vraiment pertinente et devrait
- * etre des options de l'action de recherche
- *
- * @author poussin
- */
-public class OrderAction extends BowBaseAction implements ServletRequestAware {
- private static final long serialVersionUID = 203690999710176818L;
-
- protected String order;
- protected HttpServletRequest request;
-
- public String getOrder() {
- return order;
- }
-
- public void setOrder(String order) {
- this.order = order;
- }
-
- @Override
- public void setServletRequest(HttpServletRequest request) {
- this.request = request;
- }
-
- /**
- * Orders the bookmarks according to a criteria
- */
- public String execute() {
- try {
- BowPreference user = getBowSession().getPreference();
- Criteria baseCriteria = BookmarkUtils.getBookmarkListCriteriaByUser(
- user, searchLine, fullTextLine, order);
-
- if (order != null && baseCriteria != null && !order.isEmpty()) {
- WikittyProxy proxy = getBowProxy();
- PagedResult<BowBookmark> result = null;
-
- if (order.equals("ascName")) {
- Criteria criteria = baseCriteria.addSortAscending(
- BowBookmark.FQ_FIELD_BOWBOOKMARK_DESCRIPTION);
- result = proxy.findAllByCriteria(BowBookmark.class, criteria);
- addActionMessage(getText(n_("bow.search.order.ascName")));
- } else if (order.equals("ascDate")) {
- Criteria criteria = baseCriteria.addSortAscending(
- BowBookmark.FQ_FIELD_BOWBOOKMARK_CREATIONDATE);
- result = proxy.findAllByCriteria(BowBookmark.class, criteria);
- addActionMessage(getText(n_("bow.search.order.ascDate")));
- } else if (order.equals("ascClick")) {
- Criteria criteria = baseCriteria.addSortAscending(
- BowBookmark.FQ_FIELD_BOWBOOKMARK_CLICK);
- result = proxy.findAllByCriteria(BowBookmark.class, criteria);
- addActionMessage(getText(n_("bow.search.order.ascClick")));
- } else if (order.equals("descName")) {
- Criteria criteria = baseCriteria.addSortDescending(
- BowBookmark.FQ_FIELD_BOWBOOKMARK_DESCRIPTION);
- result = proxy.findAllByCriteria(BowBookmark.class, criteria);
- addActionMessage(getText(n_("bow.search.order.descName")));
- } else if (order.equals("descDate")) {
- Criteria criteria = baseCriteria.addSortDescending(
- BowBookmark.FQ_FIELD_BOWBOOKMARK_CREATIONDATE);
- result = proxy.findAllByCriteria(BowBookmark.class, criteria);
- addActionMessage(getText(n_("bow.search.order.descDate")));
- } else if (order.equals("descClick")) {
- Criteria criteria = baseCriteria.addSortDescending(
- BowBookmark.FQ_FIELD_BOWBOOKMARK_CLICK);
- result = proxy.findAllByCriteria(BowBookmark.class, criteria);
- addActionMessage(getText(n_("bow.search.order.descClick")));
- }
- BookmarkActions bookmarkActions =
- BookmarkUtils.createBookmarkActions(request, result, searchLine);
- request.setAttribute("bookmarkActions", bookmarkActions);
- }
- } catch (Exception e) {
- addActionError(getText(n_("bow.error.internal")));
- log.error(e.getMessage(), e);
- }
- return SUCCESS;
- }
-}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -29,36 +29,35 @@
import org.chorem.bow.BowProxy;
import org.chorem.bow.BowUser;
import com.opensymphony.xwork2.ActionContext;
+import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.TreeSet;
-import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.time.DateUtils;
+import org.chorem.bow.BowSession;
-import org.apache.struts2.interceptor.ServletRequestAware;
import org.nuiton.util.StringUtil;
import org.nuiton.wikitty.WikittyProxy;
+import org.nuiton.wikitty.WikittyUtil;
import org.nuiton.wikitty.entities.Wikitty;
import org.nuiton.wikitty.entities.WikittyLabel;
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.search.FacetTopic;
-import org.nuiton.wikitty.search.FacetTopicNameComparator;
import org.nuiton.wikitty.search.PagedResult;
import org.nuiton.wikitty.search.Search;
-import static org.nuiton.i18n.I18n.n_;
-
/**
* Change les preferences de l'utilisateur (couleur, password, email, ...)
*
* @author poussin
*/
-public class PreferencesAction extends BowBaseAction implements ServletRequestAware {
+public class PreferencesAction extends BowBaseAction {
private static final long serialVersionUID = -58341106356599721L;
static public PreferencesAction getAction() {
@@ -77,9 +76,8 @@
protected String confirmNewPassword;
protected String update;
protected Map<String, Integer> bookmarksImportDate;
- protected HttpServletRequest request;
- protected Set<FacetTopic> labels;
+ protected List<FacetTopic> labels;
protected String[] selectedLabels;
protected String rename;
protected String delete;
@@ -263,7 +261,7 @@
this.bookmarksImportDate = bookmarksImportDate;
}
- public Set<FacetTopic> getLabels() {
+ public List<FacetTopic> getLabels() {
return labels;
}
@@ -274,18 +272,31 @@
public void setSelectedLabels(String[] selectedLabels) {
this.selectedLabels = selectedLabels;
}
-
- @Override
- public void setServletRequest(HttpServletRequest request) {
- this.request = request;
+
+ /**
+ * Date est une date mais au format String qui vient de Solr
+ * Elle est de la forme '2011-08-18T00:25:16.028Z'
+ * qui n'est pas presentable a l'utilisateur
+ * On la remet sous une vrai forme date
+ */
+ public Date stringToDate(String date) {
+ try {
+ Date result = WikittyUtil.parseDate(date);
+ return result;
+
+// String result = date.replaceAll("[^0-9:-]+", " ").trim();
+// result = result.substring(0, date.lastIndexOf(' '));
+ } catch (ParseException eee) {
+ return new Date(0);
+ }
}
protected BowPreference changePreference(BowPreference preference) {
preference.setColors(colors);
- if ((tagsNb != null && !tagsNb.isEmpty())) {
+ if (StringUtils.isNotBlank(tagsNb)) {
preference.setTags(Integer.valueOf(tagsNb));
}
- if (bookmarksHomePage != null && !bookmarksHomePage.isEmpty()) {
+ if (StringUtils.isNotBlank(bookmarksHomePage)) {
preference.setBookmarks(Integer.valueOf(bookmarksHomePage));
}
preference.setSearchEngineUrlSuggestions(searchEngineUrlSuggestions);
@@ -295,19 +306,20 @@
}
protected BowUser changeUser(BowUser newUser) {
- if (email != null && !email.isEmpty()) {
+ if (StringUtils.isNotBlank(email)) {
+ email = email.trim();
newUser.setLogin(email);
}
- if (newPassword != null && confirmNewPassword != null && currentPassword != null) {
- if (!newPassword.isEmpty() && !confirmNewPassword.isEmpty() && !currentPassword.isEmpty()) {
- if (newPassword.equals(confirmNewPassword)) {
- currentPassword = StringUtil.encodeMD5(currentPassword);
- if (currentPassword.equals(newUser.getPassword())) {
- newUser.setPassword(StringUtil.encodeMD5(newPassword));
- } else {
- addFieldError("currentPassword", getText(n_("bow.preferences.badCurrentPassword")));
- return null;
- }
+ if (StringUtils.isNotBlank(newPassword)
+ && StringUtils.isNotBlank(confirmNewPassword)
+ && StringUtils.isNotBlank(currentPassword)) {
+ if (newPassword.equals(confirmNewPassword)) {
+ currentPassword = StringUtil.encodeMD5(currentPassword);
+ if (currentPassword.equals(newUser.getPassword())) {
+ newUser.setPassword(StringUtil.encodeMD5(newPassword));
+ } else {
+ addFieldError("currentPassword", _("bow.preferences.badCurrentPassword"));
+ return null;
}
}
}
@@ -325,14 +337,14 @@
Criteria c = Search.query()
.exteq(BowBookmark.EXT_WIKITTYLABEL)
.eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, userId)
- .criteria().setEndIndex(0)
- .setFacetMinCount(0)
+ .criteria().setEndIndex(0) // on ne veut aucun resultat, c'est la facet dont on a besoin
+ .setFacetMinCount(1) // on demande meme les labels avec 1 seul item
+ .setFacetLimit(-1) // on demande tous les labels
.addFacetField(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
PagedResult<Wikitty> result = proxy.findAllByCriteria(c);
- List<FacetTopic> topics = result.getTopic(
- BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
- labels = new TreeSet<FacetTopic>(new FacetTopicNameComparator(true));
- labels.addAll(topics);
+ // lorsqu'on demande tout (facetLimit(-1)), les topics sont trie
+ // alphabetiquement pas besoin de les retrier
+ labels = result.getTopic(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
}
/**
@@ -381,7 +393,7 @@
}
proxy.store(toStore);
} catch (Exception eee) {
- addActionError(getText(n_("bow.error.internal")));
+ addActionError(_("bow.error.internal"));
log.error(eee.getMessage(), eee);
}
return result;
@@ -391,17 +403,19 @@
/**
* Action executer lorsque l'utilisateur demande la page
*/
+ @Override
public String execute() {
String result = SUCCESS;
try {
- BowProxy proxy = getBowSession().getProxy();
+ BowSession session = getBowSession();
+ BowProxy proxy = session.getProxy();
// BowPreference extends BowUser, donc on l'utilise pour tout
BowPreference preference = getBowSession().getPreference();
loadLabels(proxy);
Map<String,Integer> bookmarksByImportDate =
- BookmarkUtils.getBookmarksByImportDate(request, preference);
+ BookmarkUtils.getBookmarksByImportDate(session, preference);
if (log.isDebugEnabled()) {
log.debug("bookmarksByImportDate found : " + (bookmarksByImportDate == null ? "null" : bookmarksByImportDate.size()));
@@ -434,12 +448,12 @@
newUser = proxy.store(newUser);
getBowSession().setUser(newUser);
result = "update";
- addActionMessage(getText(n_("bow.preferences.update.successful")));
+ addActionMessage(_("bow.preferences.update.successful"));
}
} else {
// this email address is already used by someone else
setEmail(preference.getLogin());
- addActionError(getText("bow.preferences.emailAldyExists"));
+ addActionError(_("bow.preferences.emailAldyExists"));
result = ERROR;
}
}
@@ -453,12 +467,9 @@
setSearchEngineUrlSuggestions(preference.getSearchEngineUrlSuggestions());
setSearchEngineUrlResults(preference.getSearchEngineUrlResults());
}
-// // retrieve last reference
-// preference = getBowSession().getPreference();
-// BowInit.initHomePage(request, preference);
- } catch (Exception e) {
- addActionError(getText(n_("bow.error.internal")));
- log.error(e.getMessage(), e);
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
}
return result;
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/ReIndexationAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/ReIndexationAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/ReIndexationAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -26,8 +26,6 @@
import org.chorem.bow.BowSession;
import org.nuiton.wikitty.WikittyProxy;
-import static org.nuiton.i18n.I18n.n_;
-
/**
* Lance la reindexation solr
*
@@ -37,6 +35,7 @@
private static final long serialVersionUID = 6226574522402739559L;
+ @Override
public String execute() {
try {
BowSession session = getBowSession();
@@ -44,11 +43,11 @@
WikittyProxy proxy = getBowProxy();
proxy.getWikittyService().syncSearchEngine(proxy.getSecurityToken());
- addActionMessage(getText(n_("bow.admin.reIndexationDone")));
+ addActionMessage(_("bow.admin.reIndexationDone"));
}
- } catch (Exception e) {
- addActionError(getText(n_("bow.error.internal")));
- log.error(e.getMessage(), e);
+ } catch (Exception eee) {
+ addActionError(("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
}
return SUCCESS;
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/RegisterAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/RegisterAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/RegisterAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -25,9 +25,8 @@
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
-import javax.servlet.http.HttpServletRequest;
+import org.apache.commons.lang.StringUtils;
-import org.apache.struts2.interceptor.ServletRequestAware;
import org.chorem.bow.BowMail;
import org.chorem.bow.BowUser;
import org.chorem.bow.BowUserImpl;
@@ -37,19 +36,18 @@
import org.nuiton.wikitty.WikittyProxy;
import org.nuiton.wikitty.search.Search;
-import static org.nuiton.i18n.I18n.n_;
-
/**
* Enregistre un nouvel utilisateur
*
* @author poussin
*/
-public class RegisterAction extends BowBaseAction implements ServletRequestAware {
+public class RegisterAction extends BowBaseAction {
+
private static final long serialVersionUID = 2204772861770399542L;
+
protected String email;
protected String password;
protected String repeatPassword;
- protected HttpServletRequest request;
/**
* @return the email
@@ -92,54 +90,48 @@
public void setRepeatPassword(String repeatPassword) {
this.repeatPassword = repeatPassword;
}
-
- @Override
- public void setServletRequest(HttpServletRequest request) {
- this.request = request;
- }
-
+
/**
*
- * @param passwordMD5 the user password hashed in md5
+ * @param email non null and non blank email
* @return false if the email address isn't already registered, true
* otherwise
*/
- protected boolean alreadyRegistered(String passwordMD5) {
+ protected boolean alreadyRegistered(String email) {
boolean result = true;
- if (email != null && passwordMD5 != null) {
- if (!email.isEmpty() && !passwordMD5.equals(StringUtil.encodeMD5(""))) {
- WikittyProxy proxy = getBowProxy();
- Criteria criteria = Search.query().eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria(); //Retrieves user by user name (email)
+ WikittyProxy proxy = getBowProxy();
+ //Retrieves user by user name (email)
+ Criteria criteria = Search.query()
+ .eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria();
- //If the user doesn't already exist
- if (proxy.findByCriteria(BowUser.class, criteria) == null) {
- result = false;
- } else { //The email address is already used by someone
- addFieldError("email", getText(n_("bow.register.emailAldyUsed")));
- }
- }
- }
- return result;
+ result = proxy.findByCriteria(BowUser.class, criteria) != null;
+ //If the user doesn't already exist
+ if (result) {
+ //The email address is already used by someone
+ addFieldError("email", _("bow.register.emailAldyUsed"));
+ }
+ return result;
}
/**
* Registers the new user and sends an email to confirm registration
*/
+ @Override
public String execute() {
String result = INPUT;
try {
- if (email != null) {
+ if (StringUtils.isNotBlank(email)) {
email = email.trim();
- if (password != null) {
+ if (StringUtils.isNotBlank(password)) {
if (!password.equals(repeatPassword)) {
- addActionError(getText(n_("bow.register.pwdDontMatch")));
+ addActionError(_("bow.register.pwdDontMatch"));
} else {
String md5 = StringUtil.encodeMD5(password);
//If the email address isn't already used
- if (!alreadyRegistered(md5)) {
+ if (!alreadyRegistered(email)) {
WikittyProxy proxy = getBowProxy();
BowUserImpl newUser = new BowUserImpl();
newUser.setPassword(md5);
@@ -150,28 +142,26 @@
//If there was an error when storing the user
if (login == null) {
- addFieldError("email", getText(n_("bow.register.invalidLogin")));
+ addFieldError("email", _("bow.register.invalidLogin"));
} else {
getBowSession().setUser(login);
-// BowPreference pref = getBowSession().getPreference();
-// BowInit.initHomePage(request, pref);
-
try {
String mailContent;
- mailContent = getText(n_("bow.register.mailHi")) + ",\n\n" + getText(n_("bow.register.mailPwd")) + ": " + password + "\n\n" + getText(n_("bow.register.mailEmail")) + ": " + email + "\n\n";
- BowMail.sendMail(email, getText(n_("bow.register.mailSubject")), mailContent);
- } catch (AddressException e) {
+ mailContent =
+ _("bow.register.mailHi") + ",\n\n" +
+ _("bow.register.mailPwd") + ": " + password + "\n\n" +
+ _("bow.register.mailEmail") + ": " + email + "\n\n";
+ BowMail.sendMail(email, _("bow.register.mailSubject"), mailContent);
+ } catch (AddressException eee) {
//If the email address is invalid
- String message = getText("bow.mail.badFormat");
-
- addActionError(n_(message));
- log.error(message + " (email:" + email + ")", e);
- } catch (MessagingException e) {
- String message = getText("bow.mail.sendError");
-
- addActionError(n_(message));
- log.error(message + "(" + e.getMessage() + ")", e);
+ addActionError(_("bow.mail.badFormat"));
+ log.error(String.format("Can't send message email to '%s'",
+ email), eee);
+ } catch (MessagingException eee) {
+ addActionError("bow.mail.sendError");
+ log.error(String.format("Can't send message email to '%s'",
+ email), eee);
}
result = SUCCESS;
}
@@ -179,9 +169,9 @@
}
}
}
- } catch (Exception e) {
- addActionError(getText(n_("bow.error.internal")));
- log.error(e.getMessage(), e);
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error(eee.getMessage(), eee);
}
return result;
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/RemoveBookmarkAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/RemoveBookmarkAction.java 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/RemoveBookmarkAction.java 2011-08-18 02:37:38 UTC (rev 306)
@@ -23,22 +23,21 @@
*/
package org.chorem.bow.action;
+import org.apache.commons.lang.StringUtils;
import org.chorem.bow.BowBookmark;
import org.chorem.bow.BowUtils;
import org.nuiton.wikitty.WikittyProxy;
-import static org.nuiton.i18n.I18n.n_;
-
/**
* Supprime un bookmark
*
* @author poussin
*/
public class RemoveBookmarkAction extends BowBaseAction {
+
private static final long serialVersionUID = 820566716695285561L;
+
protected String bookmarkId;
- protected String searchLine;
- protected String fullTextLine;
protected String redirectTo;
/**
@@ -56,34 +55,6 @@
}
/**
- * @return the searchLine
- */
- public String getSearchLine() {
- return searchLine;
- }
-
- /**
- * @param searchLine the searchLine to set
- */
- public void setSearchLine(String searchLine) {
- this.searchLine = searchLine;
- }
-
- /**
- * @return the fullTextLine
- */
- public String getFullTextLine() {
- return fullTextLine;
- }
-
- /**
- * @param fullTextLine the fullTextLine to set
- */
- public void setFullTextLine(String fullTextLine) {
- this.fullTextLine = fullTextLine;
- }
-
- /**
* @return the redirectTo
*/
public String getRedirectTo() {
@@ -93,19 +64,16 @@
/**
* Removes a bookmark
*/
+ @Override
public String execute() {
- if (bookmarkId != null && !bookmarkId.isEmpty()) {
+ if (StringUtils.isNotEmpty(bookmarkId)) {
try {
WikittyProxy proxy = getBowProxy();
- BowBookmark bookmark = proxy.restore(BowBookmark.class, bookmarkId);
-
- if (bookmark != null) {
- proxy.delete(bookmarkId);
- addActionMessage(getText(n_("bow.bookmark.remove.successful")));
- }
- } catch (Exception e) {
- addActionError(getText(n_("bow.error.internal")));
- log.error("Can't do action", e);
+ proxy.delete(bookmarkId);
+ addActionMessage(_("bow.bookmark.remove.successful"));
+ } catch (Exception eee) {
+ addActionError(_("bow.error.internal"));
+ log.error("Can't do action", eee);
}
}
redirectTo = BowUtils.redirectTo(searchLine, fullTextLine);
Modified: trunk/bow-ui/src/main/resources/bow.properties
===================================================================
--- trunk/bow-ui/src/main/resources/bow.properties 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/resources/bow.properties 2011-08-18 02:37:38 UTC (rev 306)
@@ -23,9 +23,7 @@
###
application.version=${project.version}
bow.url=http://localhost:8080/
-alias.url=http://localhost:8080/
-servlet.bow=bow
-servlet.alias=alias
+alias.url=http://localhost:8080/alias
bow.smtpServer=smtp
bow.addressFrom=bow(a)chorem.org
bow.admins=poussin(a)codelutin.com
Modified: trunk/bow-ui/src/main/resources/org/chorem/bow/action/ForgotPasswordAction-validation.xml
===================================================================
--- trunk/bow-ui/src/main/resources/org/chorem/bow/action/ForgotPasswordAction-validation.xml 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/resources/org/chorem/bow/action/ForgotPasswordAction-validation.xml 2011-08-18 02:37:38 UTC (rev 306)
@@ -22,15 +22,16 @@
#L%
-->
<!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
+ "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
+ "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="email">
- <field-validator type="requiredstring">
- <message key="bow.login.email.required" />
- </field-validator>
- <field-validator type="email">
+ <field-validator type="requiredstring">
+ <message key="bow.login.email.required" />
+ </field-validator>
+ <field-validator type="regex">
+ <param name="expression">^[a-z0-9!#$%&'*+/=?^_`{|}~-]+((\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)?)+@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9\-]*[a-z0-9])?$</param>
<message key="bow.login.email.wrongformat" />
</field-validator>
</field>
Modified: trunk/bow-ui/src/main/resources/org/chorem/bow/action/LoginAction-validation.xml
===================================================================
--- trunk/bow-ui/src/main/resources/org/chorem/bow/action/LoginAction-validation.xml 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/resources/org/chorem/bow/action/LoginAction-validation.xml 2011-08-18 02:37:38 UTC (rev 306)
@@ -22,15 +22,16 @@
#L%
-->
<!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
+ "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
+ "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="email">
- <field-validator type="requiredstring">
- <message key="bow.login.email.required" />
- </field-validator>
- <field-validator type="email">
+ <field-validator type="requiredstring">
+ <message key="bow.login.email.required" />
+ </field-validator>
+ <field-validator type="regex">
+ <param name="expression">^[a-z0-9!#$%&'*+/=?^_`{|}~-]+((\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)?)+@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9\-]*[a-z0-9])?$</param>
<message key="bow.login.email.wrongformat" />
</field-validator>
</field>
Modified: trunk/bow-ui/src/main/resources/org/chorem/bow/action/RegisterAction-validation.xml
===================================================================
--- trunk/bow-ui/src/main/resources/org/chorem/bow/action/RegisterAction-validation.xml 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/resources/org/chorem/bow/action/RegisterAction-validation.xml 2011-08-18 02:37:38 UTC (rev 306)
@@ -22,15 +22,16 @@
#L%
-->
<!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
+ "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
+ "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="email">
- <field-validator type="requiredstring">
- <message key="bow.login.email.required" />
- </field-validator>
- <field-validator type="email">
+ <field-validator type="requiredstring">
+ <message key="bow.login.email.required" />
+ </field-validator>
+ <field-validator type="regex">
+ <param name="expression">^[a-z0-9!#$%&'*+/=?^_`{|}~-]+((\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)?)+@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9\-]*[a-z0-9])?$</param>
<message key="bow.login.email.wrongformat" />
</field-validator>
</field>
@@ -40,13 +41,13 @@
</field-validator>
</field>
<field name="repeatPassword">
- <field-validator type="requiredstring">
- <message key="bow.login.repeatPassword.required" />
- </field-validator>
+ <field-validator type="requiredstring">
+ <message key="bow.login.repeatPassword.required" />
+ </field-validator>
</field>
<validator type="expression">
- <param name="expression">password.equals(repeatPassword)</param>
- <message key="bow.register.pwdDontMatch" />
+ <param name="expression">password.equals(repeatPassword)</param>
+ <message key="bow.register.pwdDontMatch" />
</validator>
</validators>
Modified: trunk/bow-ui/src/main/resources/struts.xml
===================================================================
--- trunk/bow-ui/src/main/resources/struts.xml 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/resources/struts.xml 2011-08-18 02:37:38 UTC (rev 306)
@@ -143,11 +143,21 @@
<action name="addUrl" class="org.chorem.bow.action.AddUrlAction">
<result type="redirect">${redirectTo}</result>
</action>
+ <action name="editBookmark" class="org.chorem.bow.action.EditBookmarkAction">
+ <result>/jsp/editBookmark.jsp</result>
+ </action>
</package>
+ <!-- Fragment: en prevision de faire un peu d'ajax si l'utilisateur le souhaite -->
+ <package name="fragment" namespace="/fragment" extends="restrictedArea">
+ <action name="editBookmark" class="org.chorem.bow.action.EditBookmarkAction">
+ <result>/jsp/editBookmark.jsp</result>
+ </action>
+ </package>
+
<package name="search" extends="restrictedArea">
- <action name="order" class="org.chorem.bow.action.OrderAction">
- <result>/jsp/search.jsp</result>
+ <action name="home" class="org.chorem.bow.action.HomeAction">
+ <result>/jsp/home.jsp</result>
</action>
<action name="openSearchResult" class="org.chorem.bow.action.OpenSearchResultAction">
<result type="redirect">${redirectTo}</result>
@@ -158,22 +168,18 @@
<action name="deleteSearchResults" class="org.chorem.bow.action.DeleteSearchResultsAction">
<result type="redirectAction">home</result>
</action>
+ <action name="*Xml">
+ <result>/jsp/{1}Xml.jsp</result>
+ </action>
</package>
- <package name="misc" extends="restrictedArea">
- <action name="home" class="org.chorem.bow.action.HomeAction">
- <result>/jsp/home.jsp</result>
- <result name="input" type="redirectAction">home</result>
- </action>
+ <package name="preference" extends="restrictedArea">
<action name="locale" class="org.chorem.bow.action.LocaleAction">
<result type="redirect">/jsp/login.jsp</result>
</action>
<action name="regenPermToken" class="org.chorem.bow.action.GenerateTokenAction">
<result type="redirectAction">preferences</result>
</action>
- <action name="*Xml">
- <result>/jsp/{1}Xml.jsp</result>
- </action>
<action name="adminlabels" class="org.chorem.bow.action.PreferencesAction" method="adminlabels">
<result type="redirectAction">preferences</result>
@@ -184,6 +190,9 @@
<result name="error">/jsp/preferences.jsp</result>
<result>/jsp/preferences.jsp</result>
</action>
+ </package>
+
+ <package name="admin" extends="restrictedArea">
<action name="admin">
<result name="error">/jsp/login.jsp</result>
<result>/jsp/admin.jsp</result>
@@ -194,8 +203,5 @@
<action name="migrateData" class="org.chorem.bow.action.MigrateDataAction">
<result>/jsp/admin.jsp</result>
</action>
- <action name="editBookmark" class="org.chorem.bow.action.EditBookmarkAction">
- <result>/jsp/editBookmark.jsp</result>
- </action>
</package>
</struts>
Modified: trunk/bow-ui/src/main/webapp/WEB-INF/decorators/main.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/WEB-INF/decorators/main.jsp 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/WEB-INF/decorators/main.jsp 2011-08-18 02:37:38 UTC (rev 306)
@@ -29,6 +29,7 @@
<%@taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %>
<%@taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page" %>
<%@taglib prefix="s" uri="/struts-tags" %>
+<%@taglib prefix="sj" uri="/struts-jquery-tags" %>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
@@ -47,15 +48,15 @@
<link rel="search" type="application/opensearchdescription+xml" title="Bow (temporary)" href="${temporaryXml}" />
<link rel="search" type="application/opensearchdescription+xml" title="Bow (permanent)" href="${permanentXml}" />
</s:if>
+
+ <sj:head/>
+
<s:url var="jqueryUiCSS" value="/css/jquery-ui-1.8.11.custom.bow.css" />
<s:url var="globalCSS" value="/css/global.css" />
<link href="${jqueryUiCSS}" rel="stylesheet" type="text/css" media="all" />
<link href="${globalCSS}" rel="stylesheet" type="text/css" media="all" />
- <s:url var="jqueryJS" value="/js/jquery-1.5.2.min.js" />
- <s:url var="jqueryUiJS" value="/js/jquery-ui-1.8.11.custom.min.js" />
+
<s:url var="bookmarkJS" value="/js/bookmark.js" />
- <script type="text/javascript" src="${jqueryJS}"></script>
- <script type="text/javascript" src="${jqueryUiJS}"></script>
<script type="text/javascript" src="${bookmarkJS}"></script>
</head>
<body id="page-home">
@@ -63,7 +64,6 @@
<div id="page">
<%@include file="/jsp/inc/header.jsp" %>
<div id="main">
- <%@include file="/jsp/inc/errorFrame.jsp" %>
<decorator:body />
</div>
<s:if test="%{#session.BowSession.user != null}">
Modified: trunk/bow-ui/src/main/webapp/WEB-INF/decorators.xml
===================================================================
--- trunk/bow-ui/src/main/webapp/WEB-INF/decorators.xml 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/WEB-INF/decorators.xml 2011-08-18 02:37:38 UTC (rev 306)
@@ -27,6 +27,7 @@
<decorators defaultdir="/WEB-INF/decorators">
<!-- Any urls that are excluded will never be decorated by Sitemesh -->
<excludes>
+ <pattern>/fragment/*</pattern>
<pattern>/nodecorate/*</pattern>
<pattern>/styles/*</pattern>
<pattern>/scripts/*</pattern>
Modified: trunk/bow-ui/src/main/webapp/css/bookmark.css
===================================================================
--- trunk/bow-ui/src/main/webapp/css/bookmark.css 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/css/bookmark.css 2011-08-18 02:37:38 UTC (rev 306)
@@ -372,6 +372,8 @@
.formFrame{
+ float: left; /* pour que le contenu en float ne deborde pas du cadre */
+ width: 90%;
min-width:400px;
/* min-height: 315px; */
position:relative;
@@ -514,3 +516,17 @@
font-size:11px;
font-weight:bold;
}
+
+#labelsForm .list input{
+ float: left;
+ clear:left;
+}
+
+#labelsForm .list label {
+ float: left;
+}
+
+#labelsForm .action {
+ float: left;
+ clear:left;
+}
Modified: trunk/bow-ui/src/main/webapp/js/bookmark.js
===================================================================
--- trunk/bow-ui/src/main/webapp/js/bookmark.js 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/js/bookmark.js 2011-08-18 02:37:38 UTC (rev 306)
@@ -21,22 +21,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
-function modify(name, alias, tags, link, action, id) {
- var form = $("#bookmarkForm")[0];
- form.link.value = link;
- form.name.value = name;
- form.tags.value = tags;
- form.alias.value = alias;
- form.action = action;
-
- var tab = document.getElementsByName(id);
- for (var count = 0; count < tab.length; count++) {
- tab[count].style.display = 'inline';
- }
- return false;
-
-}
-
function deleteBookmarkConfirmation(goTo, bookmarkName) {
deleteConfirmation(goTo, bookmarkName, 0, undefined);
}
@@ -49,11 +33,11 @@
// TODO sletellier 20110516 : use i18n to translate this !
var confMsg = "Do you really want to delete ";
-
+
if (bookmarksNb > 1) {
confMsg += "these " + bookmarksNb + " bookmarks";
} else {
- confMsg += "bookmark '" + bookmarkName + "'";
+ confMsg += "bookmark:\n'" + bookmarkName + "'";
}
if (importDate !== undefined)
Deleted: trunk/bow-ui/src/main/webapp/js/jquery-1.5.2.min.js
===================================================================
--- trunk/bow-ui/src/main/webapp/js/jquery-1.5.2.min.js 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/js/jquery-1.5.2.min.js 2011-08-18 02:37:38 UTC (rev 306)
@@ -1,39 +0,0 @@
-/*
- * #%L
- * BOW UI
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-/*!
- * jQuery JavaScript Library v1.5.2
- * http://jquery.com/
- *
- * Copyright 2011, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Thu Mar 31 15:28:23 2011 -0400
- */
-(function(a,b){function ci(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cf(a){if(!b_[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";b_[a]=c}return b_[a]}function ce(a,b){var c={};d.each(cd.concat.apply([],cd.slice(0,b)),function(){c[this]=a});return c}function b$(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bZ(){try{return new a.XMLHttpRequest}catch(b){}}function bY(){d(a).unload(function(){for(var a in bW)bW[a](0,1)})}function bS(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bR(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bQ(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bs.test(a)?e(a,f):bQ(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bQ(a+"["+f+"]",b[f],c,e)}function bP(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bJ,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bP(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bP(a,c,d,e,"*",g));return l}function bO(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bD),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bq(a,b,c){var e=b==="width"?bk:bl,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function bc(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function bb(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function ba(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function _(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function $(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Q(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(L.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function P(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function H(a,b){return(a&&a!=="*"?a+".":"")+b.replace(t,"`").replace(u,"&")}function G(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p=[],q=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(r,"")===a.type?q.push(g.selector):t.splice(i--,1);f=d(a.target).closest(q,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){f=p[j];if(c&&f.level>c)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function E(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function y(){return!0}function x(){return!1}function i(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function h(a,c,e){if(e===b&&a.nodeType===1){e=a.getAttribute("data-"+c);if(typeof e==="string"){try{e=e==="true"?!0:e==="false"?!1:e==="null"?null:d.isNaN(e)?g.test(e)?d.parseJSON(e):e:parseFloat(e)}catch(f){}d.data(a,c,e)}else e=b}return e}var c=a.document,d=function(){function G(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(G,1);return}d.ready()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=navigator.userAgent,w,x,y,z=Object.prototype.toString,A=Object.prototype.hasOwnProperty,B=Array.prototype.push,C=Array.prototype.slice,D=String.prototype.trim,E=Array.prototype.indexOf,F={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.2",length:0,size:function(){return this.length},toArray:function(){return C.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var e=this.constructor();d.isArray(a)?B.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),x.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(C.apply(this,arguments),"slice",C.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:B,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!=="object"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){e=i[c],f=a[c];if(i===f)continue;l&&f&&(d.isPlainObject(f)||(g=d.isArray(f)))?(g?(g=!1,h=e&&d.isArray(e)?e:[]):h=e&&d.isPlainObject(e)?e:{},i[c]=d.extend(l,h,f)):f!==b&&(i[c]=f)}return i},d.extend({noConflict:function(b){a.$=f,b&&(a.jQuery=e);return d},isReady:!1,readyWait:1,ready:function(a){a===!0&&d.readyWait--;if(!d.readyWait||a!==!0&&!d.isReady){if(!c.body)return setTimeout(d.ready,1);d.isReady=!0;if(a!==!0&&--d.readyWait>0)return;x.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=d._Deferred();if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",y,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",y),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&G()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):F[z.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!A.call(a,"constructor")&&!A.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||A.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.head||c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g<h;)if(c.apply(a[g++],e)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(var j=a[0];g<h&&c.call(j,g,j)!==!1;j=a[++g]){}return a},trim:D?function(a){return a==null?"":D.call(a)}:function(a){return a==null?"":(a+"").replace(j,"").replace(k,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var e=d.type(a);a.length==null||e==="string"||e==="function"||e==="regexp"||d.isWindow(a)?B.call(c,a):d.merge(c,a)}return c},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,b,c){var d=[],e;for(var f=0,g=a.length;f<g;f++)e=b(a[f],f,c),e!=null&&(d[d.length]=e);return d.concat.apply([],d)},guid:1,proxy:function(a,c,e){arguments.length===2&&(typeof c==="string"?(e=a,a=e[c],c=b):c&&!d.isFunction(c)&&(e=c,c=b)),!c&&a&&(c=function(){return a.apply(e||this,arguments)}),a&&(c.guid=a.guid=a.guid||c.guid||d.guid++);return c},access:function(a,c,e,f,g,h){var i=a.length;if(typeof c==="object"){for(var j in c)d.access(a,j,c[j],f,g,e);return a}if(e!==b){f=!h&&f&&d.isFunction(e);for(var k=0;k<i;k++)g(a[k],c,f?e.call(a[k],k,g(a[k],c)):e,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){F["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.version=w.version),d.browser.webkit&&(d.browser.safari=!0),E&&(d.inArray=function(a,b){return E.call(b,a)}),i.test(" ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?y=function(){c.removeEventListener("DOMContentLoaded",y,!1),d.ready()}:c.attachEvent&&(y=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",y),d.ready())});return d}(),e="then done fail isResolved isRejected promise".split(" "),f=[].slice;d.extend({_Deferred:function(){var a=[],b,c,e,f={done:function(){if(!e){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=d.type(i),j==="array"?f.done.apply(f,i):j==="function"&&a.push(i);k&&f.resolveWith(k[0],k[1])}return this},resolveWith:function(d,f){if(!e&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(d,f)}finally{b=[d,f],c=0}}return this},resolve:function(){f.resolveWith(this,arguments);return this},isResolved:function(){return c||b},cancel:function(){e=1,a=[];return this}};return f},Deferred:function(a){var b=d._Deferred(),c=d._Deferred(),f;d.extend(b,{then:function(a,c){b.done(a).fail(c);return this},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,promise:function(a){if(a==null){if(f)return f;f=a={}}var c=e.length;while(c--)a[e[c]]=b[e[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?f.call(arguments,0):c,--g||h.resolveWith(h,f.call(b,0))}}var b=arguments,c=0,e=b.length,g=e,h=e<=1&&a&&d.isFunction(a.promise)?a:d.Deferred();if(e>1){for(;c<e;c++)b[c]&&d.isFunction(b[c].promise)?b[c].promise().then(i(c),h.reject):--g;g||h.resolveWith(h,b)}else h!==a&&h.resolveWith(h,e?[a]:[]);return h.promise()}}),function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0,reliableMarginRight:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e)}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(a.style.width="1px",a.style.marginRight="0",d.support.reliableMarginRight=(parseInt(c.defaultView.getComputedStyle(a,null).marginRight,10)||0)===0),b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function");return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}}();var g=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?d.cache[a[d.expando]]:a[d.expando];return!!a&&!i(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||typeof c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,g=b.nodeType,h=g?d.cache:b,j=g?b[d.expando]:d.expando;if(!h[j])return;if(c){var k=e?h[j][f]:h[j];if(k){delete k[c];if(!i(k))return}}if(e){delete h[j][f];if(!i(h[j]))return}var l=h[j][f];d.support.deleteExpando||h!=a?delete h[j]:h[j]=null,l?(h[j]={},g||(h[j].toJSON=d.noop),h[j][f]=l):g&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var f=this[0].attributes,g;for(var i=0,j=f.length;i<j;i++)g=f[i].name,g.indexOf("data-")===0&&(g=g.substr(5),h(this[0],g,e[g]))}}return e}if(typeof a==="object")return this.each(function(){d.data(this,a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(c===b){e=this.triggerHandler("getData"+k[1]+"!",[k[0]]),e===b&&this.length&&(e=d.data(this[0],a),e=h(this[0],a,e));return e===b&&k[1]?this.data(k[0]):e}return this.each(function(){var b=d(this),e=[k[0],c];b.triggerHandler("setData"+k[1]+"!",e),d.data(this,a,c),b.triggerHandler("changeData"+k[1]+"!",e)})},removeData:function(a){return this.each(function(){d.removeData(this,a)})}}),d.extend({queue:function(a,b,c){if(a){b=(b||"fx")+"queue";var e=d._data(a,b);if(!c)return e||[];!e||d.isArray(c)?e=d._data(a,b,d.makeArray(c)):e.push(c);return e}},dequeue:function(a,b){b=b||"fx";var c=d.queue(a,b),e=c.shift();e==="inprogress"&&(e=c.shift()),e&&(b==="fx"&&c.unshift("inprogress"),e.call(a,function(){d.dequeue(a,b)})),c.length||d.removeData(a,b+"queue",!0)}}),d.fn.extend({queue:function(a,c){typeof a!=="string"&&(c=a,a="fx");if(c===b)return d.queue(this[0],a);return this.each(function(b){var e=d.queue(this,a,c);a==="fx"&&e[0]!=="inprogress"&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},delay:function(a,b){a=d.fx?d.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){d.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var j=/[\n\t\r]/g,k=/\s+/,l=/\r/g,m=/^(?:href|src|style)$/,n=/^(?:button|input)$/i,o=/^(?:button|input|object|select|textarea)$/i,p=/^a(?:rea)?$/i,q=/^(?:radio|checkbox)$/i;d.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"},d.fn.extend({attr:function(a,b){return d.access(this,a,b,!0,d.attr)},removeAttr:function(a,b){return this.each(function(){d.attr(this,a,""),this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.addClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"){var b=(a||"").split(k);for(var c=0,e=this.length;c<e;c++){var f=this[c];if(f.nodeType===1)if(f.className){var g=" "+f.className+" ",h=f.className;for(var i=0,j=b.length;i<j;i++)g.indexOf(" "+b[i]+" ")<0&&(h+=" "+b[i]);f.className=d.trim(h)}else f.className=a}}return this},removeClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"||a===b){var c=(a||"").split(k);for(var e=0,f=this.length;e<f;e++){var g=this[e];if(g.nodeType===1&&g.className)if(a){var h=(" "+g.className+" ").replace(j," ");for(var i=0,l=c.length;i<l;i++)h=h.replace(" "+c[i]+" "," ");g.className=d.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,e=typeof b==="boolean";if(d.isFunction(a))return this.each(function(c){var e=d(this);e.toggleClass(a.call(this,c,e.attr("class"),b),b)});return this.each(function(){if(c==="string"){var f,g=0,h=d(this),i=b,j=a.split(k);while(f=j[g++])i=e?i:!h.hasClass(f),h[i?"addClass":"removeClass"](f)}else if(c==="undefined"||c==="boolean")this.className&&d._data(this,"__className__",this.className),this.className=this.className||a===!1?"":d._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(j," ").indexOf(b)>-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var j=i?f:0,k=i?f+1:h.length;j<k;j++){var m=h[j];if(m.selected&&(d.support.optDisabled?!m.disabled:m.getAttribute("disabled")===null)&&(!m.parentNode.disabled||!d.nodeName(m.parentNode,"optgroup"))){a=d(m).val();if(i)return a;g.push(a)}}if(i&&!g.length&&h.length)return d(h[f]).val();return g}if(q.test(c.type)&&!d.support.checkOn)return c.getAttribute("value")===null?"on":c.value;return(c.value||"").replace(l,"")}return b}var n=d.isFunction(a);return this.each(function(b){var c=d(this),e=a;if(this.nodeType===1){n&&(e=a.call(this,b,c.val())),e==null?e="":typeof e==="number"?e+="":d.isArray(e)&&(e=d.map(e,function(a){return a==null?"":a+""}));if(d.isArray(e)&&q.test(this.type))this.checked=d.inArray(c.val(),e)>=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=m.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selectedIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&n.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var k=a.getAttributeNode("tabIndex");return k&&k.specified?k.value:o.test(a.nodeName)||p.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var l=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return l===null?b:l}h&&(a[c]=e);return a[c]}});var r=/\.(.*)$/,s=/^(?:textarea|input|select)$/i,t=/\./g,u=/ /g,v=/[^\w\s.|`]/g,w=function(a){return a.replace(v,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a)}catch(h){}if(f===!1)f=x;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(a){return typeof d!=="undefined"&&d.event.triggered!==a.type?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=x);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),w).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))d.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=d.event.special[h]||{};for(j=f||0;j<p.length;j++){q=p[j];if(e.guid===q.guid){if(l||n.test(q.namespace))f==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(f!=null)break}}if(p.length===0||f!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&d.removeEvent(a,h,s.handle),g=null,delete t[h]}if(d.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,d.isEmptyObject(s)&&d.removeData(a,b,!0)}}},trigger:function(a,c,e){var f=a.type||a,g=arguments[3];if(!g){a=typeof a==="object"?a[d.expando]?a:d.extend(d.Event(f),a):d.Event(f),f.indexOf("!")>=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(r,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=a.type,l[m]())}catch(p){}k&&(l["on"+m]=k),d.event.triggered=b}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l<m;l++){var n=f[l];if(e||h.test(n.namespace)){c.handler=n.handler,c.data=n.data,c.handleObj=n;var o=n.handler.apply(this,k);o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[d.expando])return a;var e=a;a=d.Event(e);for(var f=this.props.length,g;f;)g=this.props[--f],a[g]=e[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=c.documentElement,i=c.body;a.pageX=a.clientX+(h&&h.scrollLeft||i&&i.scrollLeft||0)-(h&&h.clientLeft||i&&i.clientLeft||0),a.pageY=a.clientY+(h&&h.scrollTop||i&&i.scrollTop||0)-(h&&h.clientTop||i&&i.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:d.proxy,special:{ready:{setup:d.bindReady,teardown:d.noop},live:{add:function(a){d.event.add(this,H(a.origType,a.selector),d.extend({},a,{handler:G,guid:a.handler.guid}))},remove:function(a){d.event.remove(this,H(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){d.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},d.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},d.Event=function(a){if(!this.preventDefault)return new d.Event(a);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?y:x):this.type=a,this.timeStamp=d.now(),this[d.expando]=!0},d.Event.prototype={preventDefault:function(){this.isDefaultPrevented=y;var a=this.originalEvent;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=y;var a=this.originalEvent;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=y,this.stopPropagation()},isDefaultPrevented:x,isPropagationStopped:x,isImmediatePropagationStopped:x};var z=function(a){var b=a.relatedTarget;try{if(b&&b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&(a.type=a.data,d.event.handle.apply(this,arguments))}catch(e){}},A=function(a){a.type=a.data,d.event.handle.apply(this,arguments)};d.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){d.event.special[a]={setup:function(c){d.event.add(this,b,c&&c.selector?A:z,a)},teardown:function(a){d.event.remove(this,b,a&&a.selector?A:z)}}}),d.support.submitBubbles||(d.event.special.submit={setup:function(a,b){if(this.nodeName&&this.nodeName.toLowerCase()!=="form")d.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&d(b).closest("form").length&&E("submit",this,arguments)}),d.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&d(b).closest("form").length&&a.keyCode===13&&E("submit",this,arguments)});else return!1},teardown:function(a){d.event.remove(this,".specialSubmit")}});if(!d.support.changeBubbles){var B,C=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},D=function D(a){var c=a.target,e,f;if(s.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=C(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:D,beforedeactivate:D,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&D.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&D.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",C(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in B)d.event.add(this,c+".specialChange",B[c]);return s.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return s.test(this.nodeName)}},B=d.event.special.change.filters,B.focus=B.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function f(a){var c=d.event.fix(a);c.type=b,c.originalEvent={},d.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var e=0;d.event.special[b]={setup:function(){e++===0&&c.addEventListener(a,f,!0)},teardown:function(){--e===0&&c.removeEventListener(a,f,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i<j;i++)d.event.add(this[i],a,h,e);return this}}),d.fn.extend({unbind:function(a,b){if(typeof a!=="object"||a.preventDefault)for(var e=0,f=this.length;e<f;e++)d.event.remove(this[e],a,b);else for(var c in a)this.unbind(c,a[c]);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var c=d.Event(a);c.preventDefault(),c.stopPropagation(),d.event.trigger(c,b,this[0]);return c.result}},toggle:function(a){var b=arguments,c=1;while(c<b.length)d.proxy(a,b[c++]);return this.click(d.proxy(a,function(e){var f=(d._data(this,"lastToggle"+a.guid)||0)%c;d._data(this,"lastToggle"+a.guid,f+1),e.preventDefault();return b[f].apply(this,arguments)||!1}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var F={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};d.each(["live","die"],function(a,c){d.fn[c]=function(a,e,f,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:d(this.context);if(typeof a==="object"&&!a.preventDefault){for(var o in a)n[c](o,e,a[o],m);return this}d.isFunction(e)&&(f=e,e=b),a=(a||"").split(" ");while((h=a[i++])!=null){j=r.exec(h),k="",j&&(k=j[0],h=h.replace(r,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,h==="focus"||h==="blur"?(a.push(F[h]+k),h=h+k):h=(F[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)d.event.add(n[p],"live."+H(h,m),{data:e,selector:m,handler:f,origType:h,origHandler:f,preType:l});else n.unbind("live."+H(h,m),f)}return this}}),d.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){d.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!=="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!=="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(f){if(f===!0)continue}else g=o=!0}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1){}a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return"text"===c&&(b===c||b===null)},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){g=!0;return 0}if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!=="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};d.find=k,d.expr=k.selectors,d.expr[":"]=d.expr.filters,d.unique=k.uniqueSort,d.text=k.getText,d.isXMLDoc=k.isXML,d.contains=k.contains}();var I=/Until$/,J=/^(?:parents|prevUntil|prevAll)/,K=/,/,L=/^.[^:#\[\.,]*$/,M=Array.prototype.slice,N=d.expr.match.POS,O={children:!0,contents:!0,next:!0,prev:!0};d.fn.extend({find:function(a){var b=this.pushStack("","find",a),c=0;for(var e=0,f=this.length;e<f;e++){c=b.length,d.find(a,this[e],b);if(e>0)for(var g=c;g<b.length;g++)for(var h=0;h<c;h++)if(b[h]===b[g]){b.splice(g--,1);break}}return b},has:function(a){var b=d(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(d.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(Q(this,a,!1),"not",a)},filter:function(a){return this.pushStack(Q(this,a,!0),"filter",a)},is:function(a){return!!a&&d.filter(a,this).length>0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e<f;e++)i=a[e],j[i]||(j[i]=d.expr.match.POS.test(i)?d(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=N.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e<f;e++){g=this[e];while(g){if(l?l.index(g)>-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(P(c[0])||P(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=M.call(arguments);I.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!O[a]?d.unique(f):f,(this.length>1||K.test(e))&&J.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var R=/ jQuery\d+="(?:\d+|null)"/g,S=/^\s+/,T=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,U=/<([\w:]+)/,V=/<tbody/i,W=/<|&#?\w+;/,X=/<(?:script|object|embed|option|style)/i,Y=/checked\s*(?:[^=]|=\s*.checked.)/i,Z={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};Z.optgroup=Z.option,Z.tbody=Z.tfoot=Z.colgroup=Z.caption=Z.thead,Z.th=Z.td,d.support.htmlSerialize||(Z._default=[1,"div<div>","</div>"]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=d(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(R,""):null;if(typeof a!=="string"||X.test(a)||!d.support.leadingWhitespace&&S.test(a)||Z[(U.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(T,"<$1></$2>");try{for(var c=0,e=this.length;c<e;c++)this[c].nodeType===1&&(d.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(f){this.empty().append(a)}}return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(d.isFunction(a))return this.each(function(b){var c=d(this),e=c.html();c.replaceWith(a.call(this,b,e))});typeof a!=="string"&&(a=d(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;d(this).remove(),b?d(b).before(a):d(c).append(a)})}return this.length?this.pushStack(d(d.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,e){var f,g,h,i,j=a[0],k=[];if(!d.support.checkClone&&arguments.length===3&&typeof j==="string"&&Y.test(j))return this.each(function(){d(this).domManip(a,c,e,!0)});if(d.isFunction(j))return this.each(function(f){var g=d(this);a[0]=j.call(this,f,c?g.html():b),g.domManip(a,c,e)});if(this[0]){i=j&&j.parentNode,d.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?f={fragment:i}:f=d.buildFragment(a,this,k),h=f.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&d.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)e.call(c?$(this[l],g):this[l],f.cacheable||m>1&&l<n?d.clone(h,!0,!0):h)}k.length&&d.each(k,bc)}return this}}),d.buildFragment=function(a,b,e){var f,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]==="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!X.test(a[0])&&(d.support.checkClone||!Y.test(a[0]))&&(g=!0,h=d.fragments[a[0]],h&&(h!==1&&(f=h))),f||(f=i.createDocumentFragment(),d.clean(a,i,f,e)),g&&(d.fragments[a[0]]=h?f:1);return{fragment:f,cacheable:g}},d.fragments={},d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(c){var e=[],f=d(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&f.length===1){f[b](this[0]);return this}for(var h=0,i=f.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){ba(a,e),f=bb(a),g=bb(e);for(h=0;f[h];++h)ba(f[h],g[h])}if(b){_(a,e);if(c){f=bb(a),g=bb(e);for(h=0;f[h];++h)_(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||W.test(i)){if(typeof i==="string"){i=i.replace(T,"<$1></$2>");var j=(U.exec(i)||["",""])[1].toLowerCase(),k=Z[j]||Z._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=V.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]==="<table>"&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&S.test(i)&&m.insertBefore(b.createTextNode(S.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var bd=/alpha\([^)]*\)/i,be=/opacity=([^)]*)/,bf=/-([a-z])/ig,bg=/([A-Z]|^ms)/g,bh=/^-?\d+(?:px)?$/i,bi=/^-?\d/,bj={position:"absolute",visibility:"hidden",display:"block"},bk=["Left","Right"],bl=["Top","Bottom"],bm,bn,bo,bp=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bm(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bm)return bm(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bf,bp)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bq(a,b,e):d.swap(a,bj,function(){f=bq(a,b,e)});if(f<=0){f=bm(a,b,b),f==="0px"&&bo&&(f=bo(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bh.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return be.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bd.test(f)?f.replace(bd,e):c.filter+" "+e}}),d(function(){d.support.reliableMarginRight||(d.cssHooks.marginRight={get:function(a,b){var c;d.swap(a,{display:"inline-block"},function(){b?c=bm(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bn=function(a,c,e){var f,g,h;e=e.replace(bg,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bo=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bh.test(d)&&bi.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bm=bn||bo,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var br=/%20/g,bs=/\[\]$/,bt=/\r?\n/g,bu=/#.*$/,bv=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bw=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bx=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,by=/^(?:GET|HEAD)$/,bz=/^\/\//,bA=/\?/,bB=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bC=/^(?:select|textarea)/i,bD=/\s+/,bE=/([?&])_=[^&]*/,bF=/(^|\-)([a-z])/g,bG=function(a,b,c){return b+c.toUpperCase()},bH=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bI=d.fn.load,bJ={},bK={},bL,bM;try{bL=c.location.href}catch(bN){bL=c.createElement("a"),bL.href="",bL=bL.href}bM=bH.exec(bL.toLowerCase())||[],d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bI)return bI.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b):typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?d("<div>").append(c.replace(bB,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bC.test(this.nodeName)||bw.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(bt,"\r\n")}}):{name:b.name,value:c.replace(bt,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFunction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bL,isLocal:bx.test(bM[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bO(bJ),ajaxTransport:bO(bK),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",u.readyState=a?4:0;var q,t,v,w=l?bR(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bS(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;if(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bF,bG)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r===2){if(!n){n={};while(c=bv.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bu,"").replace(bz,bM[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bD),e.crossDomain==null&&(q=bH.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bM[1]||q[2]!=bM[2]||(q[3]||(q[1]==="http:"?80:443))!=(bM[3]||(bM[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bP(bJ,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!by.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(bA.test(e.url)?"&":"?")+e.data),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bE,"$1_="+w);e.url=x+(x===e.url?(bA.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModified[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bP(bK,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bQ(g,a[g],c,f);return e.join("&").replace(br,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bT=d.now(),bU=/(\=)\?(&|$)|\?\?/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bT++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bU.test(b.url)||f&&bU.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bU,l),b.url===j&&(f&&(k=k.replace(bU,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script json"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var bV=d.now(),bW,bX;d.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&bZ()||b$()}:bZ,bX=d.ajaxSettings.xhr(),d.support.ajax=!!bX,d.support.cors=bX&&"withCredentials"in bX,bX=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),!a.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bW[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isLocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bW||(bW={},bY()),h=bV++,g.onreadystatechange=bW[h]=c):c()},abort:function(){c&&c(0,1)}}}});var b_={},ca=/^(?:toggle|show|hide)$/,cb=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cc,cd=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(ce("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)e=this[g],f=e.style.display,!d._data(e,"olddisplay")&&f==="none"&&(f=e.style.display=""),f===""&&d.css(e,"display")==="none"&&d._data(e,"olddisplay",cf(e.nodeName));for(g=0;g<h;g++){e=this[g],f=e.style.display;if(f===""||f==="none")e.style.display=d._data(e,"olddisplay")||""}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ce("hide",3),a,b,c);for(var e=0,f=this.length;e<f;e++){var g=d.css(this[e],"display");g!=="none"&&!d._data(this[e],"olddisplay")&&d._data(this[e],"olddisplay",g)}for(e=0;e<f;e++)this[e].style.display="none";return this},_toggle:d.fn.toggle,toggle:function(a,b,c){var e=typeof a==="boolean";d.isFunction(a)&&d.isFunction(b)?this._toggle.apply(this,arguments):a==null||e?this.each(function(){var b=e?a:d(this).is(":hidden");d(this)[b?"show":"hide"]()}):this.animate(ce("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,e){var f=d.speed(b,c,e);if(d.isEmptyObject(a))return this.each(f.complete);return this[f.queue===!1?"each":"queue"](function(){var b=d.extend({},f),c,e=this.nodeType===1,g=e&&d(this).is(":hidden"),h=this;for(c in a){var i=d.camelCase(c);c!==i&&(a[i]=a[c],delete a[c],c=i);if(a[c]==="hide"&&g||a[c]==="show"&&!g)return b.complete.call(this);if(e&&(c==="height"||c==="width")){b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(d.css(this,"display")==="inline"&&d.css(this,"float")==="none")if(d.support.inlineBlockNeedsLayout){var j=cf(this.nodeName);j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)}else this.style.display="inline-block"}d.isArray(a[c])&&((b.specialEasing=b.specialEasing||{})[c]=a[c][1],a[c]=a[c][0])}b.overflow!=null&&(this.style.overflow="hidden"),b.curAnim=d.extend({},a),d.each(a,function(c,e){var f=new d.fx(h,b,c);if(ca.test(e))f[e==="toggle"?g?"show":"hide":e](a);else{var i=cb.exec(e),j=f.cur();if(i){var k=parseFloat(i[2]),l=i[3]||(d.cssNumber[c]?"":"px");l!=="px"&&(d.style(h,c,(k||1)+l),j=(k||1)/f.cur()*j,d.style(h,c,j+l)),i[1]&&(k=(i[1]==="-="?-1:1)*k+j),f.custom(j,k,l)}else f.custom(j,e,"")}});return!0})},stop:function(a,b){var c=d.timers;a&&this.queue([]),this.each(function(){for(var a=c.length-1;a>=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:ce("show",1),slideUp:ce("hide",1),slideToggle:ce("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!cc&&(cc=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||d.fx.stop()},interval:13,stop:function(){clearInterval(cc),cc=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){d.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),d.expr&&d.expr.filters&&(d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return a===b.elem}).length});var cg=/^t(?:able|d|h)$/i,ch=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?d.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,g=f.documentElement;if(!c||!d.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=f.body,i=ci(f),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||d.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||d.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:d.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);d.offset.initialize();var c,e=b.offsetParent,f=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(d.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===e&&(l+=b.offsetTop,m+=b.offsetLeft,d.offset.doesNotAddBorder&&(!d.offset.doesAddBorderForTableAndCells||!cg.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),f=e,e=b.offsetParent),d.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;d.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},d.offset={initialize:function(){var a=c.body,b=c.createElement("div"),e,f,g,h,i=parseFloat(d.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=(e==="absolute"||e==="fixed")&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=ch.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!ch.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=ci(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=ci(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window);
\ No newline at end of file
Deleted: trunk/bow-ui/src/main/webapp/js/jquery-ui-1.8.11.custom.min.js
===================================================================
--- trunk/bow-ui/src/main/webapp/js/jquery-ui-1.8.11.custom.min.js 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/js/jquery-ui-1.8.11.custom.min.js 2011-08-18 02:37:38 UTC (rev 306)
@@ -1,137 +0,0 @@
-/*
- * #%L
- * BOW UI
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-/*!
- * jQuery UI 1.8.11
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI
- */
-(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.11",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
-NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,
-"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");
-if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,
-"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,
-d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}});
-c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&
-b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
-;/*!
- * jQuery UI Widget 1.8.11
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Widget
- */
-(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,
-a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.charAt(0)==="_")return h;
-e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,
-this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},
-widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},
-enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
-;/*
- * jQuery UI Position 1.8.11
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Position
- */
-(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY,
-left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+=
-k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-=
-m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left=
-d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+=
-a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b),
-g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery);
-;/*
- * jQuery UI Button 1.8.11
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Button
- *
- * Depends:
- * jquery.ui.core.js
- * jquery.ui.widget.js
- */
-(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,f=a([]);if(c)f=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return f};a.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",
-i);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",f="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",
-function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||a(this).removeClass(f)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active");
-b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var e=b.element[0];h(e).not(e).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");
-g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(e){if(c.disabled)return false;if(e.keyCode==a.ui.keyCode.SPACE||e.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(e){e.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled",
-c.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type==="radio"){var b=this.element.parents().filter(":last"),c="label[for="+this.element.attr("id")+"]";this.buttonElement=b.find(c);if(!this.buttonElement.length){b=b.length?b.siblings():this.element.siblings();this.buttonElement=b.filter(c);if(!this.buttonElement.length)this.buttonElement=b.find(c)}this.element.addClass("ui-helper-hidden-accessible");
-(b=this.element.is(":checked"))&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement=this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());
-this.hasTitle||this.buttonElement.removeAttr("title");a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")h(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed",
-true):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"),
-c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,f=d.primary&&d.secondary,e=[];if(d.primary||d.secondary){if(this.options.text)e.push("ui-button-text-icon"+(f?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){e.push(f?"ui-button-icons-only":
-"ui-button-icon-only");this.hasTitle||b.attr("title",c)}}else e.push("ui-button-text-only");b.addClass(e.join(" "))}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()},
-destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery);
-;/*
- * jQuery UI Dialog 1.8.11
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Dialog
- *
- * Depends:
- * jquery.ui.core.js
- * jquery.ui.widget.js
- * jquery.ui.button.js
- * jquery.ui.draggable.js
- * jquery.ui.mouse.js
- * jquery.ui.position.js
- * jquery.ui.resizable.js
- */
-(function(c,j){var k={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},l={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&
-c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||" ",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",
--1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role",
-"button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id",e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=
-b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");a.uiDialog.remove();a.originalTitle&&
-a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==b.uiDialog[0]){e=c(this).css("z-index");
-isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index",c.ui.dialog.maxZ);
-d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===f[0]&&e.shiftKey){g.focus(1);return false}}});
-c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("<div></div>").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a,function(f,
-h){h=c.isFunction(h)?{click:h,text:f}:h;f=c('<button type="button"></button>').attr(h,true).unbind("click").click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.fn.button&&f.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=
-d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,originalSize:f.originalSize,
-position:f.position,size:f.size}}a=a===j?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",f,b(h))},stop:function(f,
-h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length===
-1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f);if(g in k)e=true;if(g in
-l)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled");
-break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=this.options,b,d,e=
-this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-b,0));this.uiDialog.is(":data(resizable)")&&
-this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.11",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length===
-0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()<c.ui.dialog.overlay.maxZ)return false})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),
-height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
-b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,
-function(){a=a.add(this)});a.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
-;
\ No newline at end of file
Modified: trunk/bow-ui/src/main/webapp/jsp/admin.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/admin.jsp 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/jsp/admin.jsp 2011-08-18 02:37:38 UTC (rev 306)
@@ -43,8 +43,8 @@
<s:if test="#session.BowSession.isAdmin()">
<ul id="adminActions">
<li><s:a action="reIndexation"><s:text name="bow.admin.dataReindexation" /></s:a></li>
- <li><s:a action="migrateData?versionFrom=0.4&versionTo=0.5"><s:text name="bow.admin.dataMigration04to05" /></s:a></li>
- <li><s:a action="migrateData?versionFrom=0.6&versionTo=1.1"><s:text name="bow.admin.dataMigration05to06" /></s:a></li>
+ <li><s:a action="migrateData?versionFrom=0.4&versionTo=0.5"><s:text name="bow.admin.dataMigration04to05" /></s:a></li>
+ <li><s:a action="migrateData?versionFrom=0.6&versionTo=1.1"><s:text name="bow.admin.dataMigration05to06" /></s:a></li>
<li><s:a action="home" id="homePage"><s:text name="bow.admin.home" /></s:a></li>
</ul>
</s:if>
Modified: trunk/bow-ui/src/main/webapp/jsp/editBookmark.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/editBookmark.jsp 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/jsp/editBookmark.jsp 2011-08-18 02:37:38 UTC (rev 306)
@@ -23,11 +23,7 @@
-->
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
-<%@page import="org.chorem.bow.BowBookmark"%>
-<%
-BowBookmark bookmark = null;
-%>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
xmlns:jsp="http://java.sun.com/JSP/Page"
@@ -46,12 +42,17 @@
<s:form id="popupAddUrlForm" action="addUrl" method="post">
<s:hidden name="searchLine" value="%{searchLine}" />
<s:hidden name="fullTextLine" value="%{fullTextLine}" />
- <input type="hidden" id="popupAddUrlFormBookmarkId" name="bookmarkId" value="<%=bookmark == null ? null : bookmark.getWikittyId()%>"/>
- <s:textfield key="popup.addurl.link" id="popupAddUrlFormLink" name="link" labelSeparator=" " value="%{bookmark.link}" />
- <s:textarea key="popup.addurl.name" id="popupAddUrlFormName" name="name" labelSeparator=" " value="%{bookmark.description}" />
- <s:textfield key="popup.addurl.alias.private" id="popupAddUrlFormPrivateAlias" name="privateAlias" labelSeparator=" " value="%{bookmark.privateAlias}" />
- <s:textfield key="popup.addurl.alias.public" id="popupAddUrlFormPublicAlias" name="publicAlias" labelSeparator=" " value="%{bookmark.publicAlias}" />
- <s:textfield key="popup.addurl.tags" id="popupAddUrlFormTags" name="tags" labelSeparator=" " value="%{@org.chorem.bow.BookmarkUtils@getBookmarkTagsString(#request.bookmark)}" />
+ <s:hidden name="bookmarkId" value="%{bookmark.wikittyId}"/>
+ <s:textfield name="link" labelSeparator=" " key="popup.addurl.link"
+ value="%{bookmark.link}" />
+ <s:textarea name="name" labelSeparator=" " key="popup.addurl.name"
+ value="%{bookmark.description}" />
+ <s:textfield name="privateAlias" labelSeparator=" " key="popup.addurl.alias.private"
+ value="%{bookmark.privateAlias}" />
+ <s:textfield name="publicAlias" labelSeparator=" " key="popup.addurl.alias.public"
+ value="%{bookmark.publicAlias}" />
+ <s:textfield name="tags" labelSeparator=" " key="popup.addurl.tags"
+ value="%{@org.chorem.bow.BookmarkUtils@getBookmarkTagsString(bookmark)}" />
<s:submit key="popup.commons.submit" name="submit" />
</s:form>
</div>
Modified: trunk/bow-ui/src/main/webapp/jsp/error.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/error.jsp 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/jsp/error.jsp 2011-08-18 02:37:38 UTC (rev 306)
@@ -35,7 +35,14 @@
</head>
<body>
<div id="main">
- <jsp:include page="inc/errorFrame.jsp" flush="true" />
+ <div id="msg">
+ <div id="actionmessageHeader">
+ <s:actionmessage />
+ </div>
+ <div id="actionerrorHeader">
+ <s:actionerror />
+ </div>
+ </div>
</div>
</body>
</html>
Modified: trunk/bow-ui/src/main/webapp/jsp/home.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/home.jsp 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/jsp/home.jsp 2011-08-18 02:37:38 UTC (rev 306)
@@ -1,6 +1,3 @@
-<%@page import="org.chorem.bow.BowSearchResult"%>
-<%@page import="org.chorem.bow.action.HomeAction"%>
-<%@page import="org.chorem.bow.BowConfig"%>
<!--
#%L
bow
@@ -27,9 +24,11 @@
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<%@page import="org.chorem.bow.BowBookmark" %>
-<%@page import="org.chorem.bow.BookmarkActions" %>
<%@page import="java.text.SimpleDateFormat" %>
<%@page import="java.util.List" %>
+<%@page import="org.chorem.bow.BowSearchResult"%>
+<%@page import="org.chorem.bow.action.HomeAction"%>
+<%@page import="org.chorem.bow.BowConfig"%>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
@@ -56,11 +55,9 @@
</s:url>
<s:a id="deleteSearchResultsButton" title="delete all" href="" onclick="deleteConfirmation('%{deleteSearchResults}', %{#bookmarksToDelete}); return(false);"></s:a>
</s:if>
- <s:form action="home" method="get">
- <p>
- <label for="order"><s:text name="bow.search.orderby" /></label>
- <s:select id="order" name="order" list="possibleOrder"/>
- </p>
+ <s:form action="home" method="get" theme="simple">
+ <label for="order"><s:text name="bow.search.orderby" /></label>
+ <s:select id="order" name="order" list="possibleOrder"/>
<s:submit key="bow.search.submit" name="submit" />
<s:hidden name="searchLine" value="%{searchResult.searchLine}" />
<s:hidden name="fullTextLine" value="%{searchResult.fullTextLine}" />
Modified: trunk/bow-ui/src/main/webapp/jsp/inc/bookmark.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/inc/bookmark.jsp 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/jsp/inc/bookmark.jsp 2011-08-18 02:37:38 UTC (rev 306)
@@ -23,9 +23,7 @@
-->
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
-<%@page import="org.chorem.bow.BowBookmark" %>
-<%@page import="org.chorem.bow.BowUtils"%>
-<%@page import="org.apache.commons.lang.StringEscapeUtils"%>
+<%@taglib prefix="sj" uri="/struts-jquery-tags" %>
<div class="bookmark"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
@@ -43,21 +41,20 @@
<s:property value="%{#bookmark.publicAlias}" />
</s:a>
</s:if>
- <s:url var="editBookmark" action="modifyBookmark" escapeAmp="true">
- <s:param name="bookmarkId"><s:property value="%{#bookmark.wikittyId}" /></s:param>
+ <s:url var="editBookmark" action="editBookmark" escapeAmp="true">
+ <s:param name="id"><s:property value="%{#bookmark.wikittyId}" /></s:param>
<s:param name="searchLine"><s:property value="%{searchLine}" /></s:param>
<s:param name="fullTextLine"><s:property value="%{fullTextLine}" /></s:param>
</s:url>
- <s:a cssClass="edit" href="%{editBookmark}"
- onclick="return openPopupAddUrl('%{#bookmark.wikittyId}', '%{#bookmark.link}', '%{@org.apache.commons.lang.StringEscapeUtils@escapeJavaScript(#bookmark.description)}', '%{#bookmark.privateAlias}', '%{#bookmark.publicAlias}', '%{@org.chorem.bow.BookmarkUtils@getBookmarkTagsString(#bookmark)}');">
- </s:a>
+ <s:a cssClass="edit" href="%{editBookmark}"/>
+
<s:url var="removeBookmark" action="removeBookmark" escapeAmp="true">
<s:param name="bookmarkId"><s:property value="%{#bookmark.wikittyId}" /></s:param>
<s:param name="searchLine"><s:property value="%{searchLine}" /></s:param>
<s:param name="fullTextLine"><s:property value="%{fullTextLine}" /></s:param>
</s:url>
<s:a cssClass="supprim" href="%{removeBookmark}"
- onclick="return deleteConfirmation('%{#removeBookmark}','%{#bookmark.privateAlias}');"></s:a>
+ onclick="return deleteConfirmation('%{#removeBookmark}','%{#bookmark.link}');"></s:a>
</div>
<div class="bookmarkcontenu">
Deleted: trunk/bow-ui/src/main/webapp/jsp/inc/errorFrame.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/inc/errorFrame.jsp 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/jsp/inc/errorFrame.jsp 2011-08-18 02:37:38 UTC (rev 306)
@@ -1,36 +0,0 @@
-<!--
- #%L
- bow
-
- $Id$
- $HeadURL$
- %%
- Copyright (C) 2010 - 2011 CodeLutin
- %%
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- #L%
- -->
-<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
-
- <%
- String userError = (String)request.getAttribute("errorMsgUser");
- String techError = (String)request.getAttribute("errorMsgTech");
-
- if (userError != null) {
- %>
- <div class="menu clearfix">
- <h2>Error</h2>
- </div>
- <pre class="error"><%=userError%><% if (techError != null) { %><br /><br />Detailed error :<br /><%=techError%><% } %></pre>
- <% } %>
Modified: trunk/bow-ui/src/main/webapp/jsp/inc/footer.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/inc/footer.jsp 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/jsp/inc/footer.jsp 2011-08-18 02:37:38 UTC (rev 306)
@@ -27,21 +27,21 @@
<div id="footer"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
xmlns:jsp="http://java.sun.com/JSP/Page">
- <p>
- <a shape="rect" href="http://www.chorem.org/projects/show/bow">bow</a>
- <a shape="rect" href="http://www.chorem.org/projects/bow/files"></a> -
- <a shape="rect" href="http://www.gnu.org/licenses/agpl.html"><s:text name="bow.footer.license" /></a> -
- <span title="Copyright">©2011</span>
- <a shape="rect" href="http://www.codelutin.com">Code Lutin</a> -
- <a shape="rect" href="http://www.chorem.org/projects/bow/issues"><s:text name="bow.footer.bugreport" /></a> -
+ <p>
+ <a shape="rect" href="http://www.chorem.org/projects/show/bow">bow</a>
+ <a shape="rect" href="http://www.chorem.org/projects/bow/files"></a> -
+ <a shape="rect" href="http://www.gnu.org/licenses/agpl.html"><s:text name="bow.footer.license" /></a> -
+ <span title="Copyright">©2011</span>
+ <a shape="rect" href="http://www.codelutin.com">Code Lutin</a> -
+ <a shape="rect" href="http://www.chorem.org/projects/bow/issues"><s:text name="bow.footer.bugreport" /></a> -
<a shape="rect" href="http://list.chorem.org/cgi-bin/mailman/listinfo/bow-users"><s:text name="bow.footer.userSupport" /></a> -
- <s:url var="localeEN">
- <s:param name="request_locale">en_GB</s:param>
- </s:url>
- <s:url var="localeFR">
- <s:param name="request_locale">fr_FR</s:param>
- </s:url>
- <s:a href="%{localeEN}"><s:text name="bow.action.locale.english" /></s:a> -
- <s:a href="%{localeFR}"><s:text name="bow.action.locale.french" /></s:a>
- </p>
+ <s:url var="localeEN">
+ <s:param name="request_locale">en_GB</s:param>
+ </s:url>
+ <s:url var="localeFR">
+ <s:param name="request_locale">fr_FR</s:param>
+ </s:url>
+ <s:a href="%{localeEN}"><s:text name="bow.action.locale.english" /></s:a> -
+ <s:a href="%{localeFR}"><s:text name="bow.action.locale.french" /></s:a>
+ </p>
</div>
Deleted: trunk/bow-ui/src/main/webapp/jsp/inc/popupAddUrl.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/inc/popupAddUrl.jsp 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/jsp/inc/popupAddUrl.jsp 2011-08-18 02:37:38 UTC (rev 306)
@@ -1,94 +0,0 @@
-<!--
- #%L
- BOW UI
-
- $Id$
- $HeadURL$
- %%
- Copyright (C) 2010 - 2011 CodeLutin
- %%
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- #L%
- -->
-<%--
- Document : popupAddUrl
- Created on : 20 avr. 2011, 17:03:37
- Author : poussin
---%>
-
-<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-<%@taglib prefix="s" uri="/struts-tags" %>
-
-<script>
- function openPopupAddUrl(bookmarkId, link, name, privateAlias, publicAlias, tags) {
- $("#popupAddUrlFormBookmarkId")[0].value = bookmarkId;
- $("#popupAddUrlFormLink")[0].value = link;
- $("#popupAddUrlFormName")[0].innerHTML = name;
- $("#popupAddUrlFormPrivateAlias")[0].value = privateAlias;
- $("#popupAddUrlFormPublicAlias")[0].value = publicAlias;
- $("#popupAddUrlFormTags")[0].value = tags;
-
- $("#addUrlPopup").dialog("open");
- return false;
- }
-
- $(function() {
- $( "#addUrlPopup" ).dialog({
- autoOpen: false,
- width: 400,
- modal: true,
-// buttons: {
-// "Validate": function() {
-// $("#popupAddUrlForm").submit();
-// $( this ).dialog( "close" );
-// },
-// Cancel: function() {
-// $( this ).dialog( "close" );
-// }
-// },
- close: function() {
- //allFields.val( "" ).removeClass( "ui-state-error" );
- }
- });
- });
-
- function submitAddUrl() {
- $("#popupAddUrlForm").submit();
- closePopupAddUrl();
- }
-
- function closePopupAddUrl() {
- $( "#addUrlPopup" ).dialog( "close" )
- }
-</script>
-
-<s:set id="title">
- <s:text name="popup.addurl.title"/>
-</s:set>
-
-<div xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
- id="addUrlPopup" title="${title}">
- <s:form id="popupAddUrlForm" action="addUrl" method="post">
- <s:hidden id="popupAddUrlFormBookmarkId" name="bookmarkId" />
- <s:hidden name="searchLine" value="%{searchLine}" />
- <s:hidden name="fullTextLine" value="%{fullTextLine}" />
- <s:textfield key="popup.addurl.link" id="popupAddUrlFormLink" name="link" labelSeparator=" " />
- <s:textarea key="popup.addurl.name" id="popupAddUrlFormName" name="name" labelSeparator=" " />
- <s:textfield key="popup.addurl.alias.private" id="popupAddUrlFormPrivateAlias" name="privateAlias" labelSeparator=" " />
- <s:textfield key="popup.addurl.alias.public" id="popupAddUrlFormPublicAlias" name="publicAlias" labelSeparator=" " />
- <s:textfield key="popup.addurl.tags" id="popupAddUrlFormTags" name="tags" labelSeparator=" " />
- </s:form>
- <a class="button" onclick="submitAddUrl()"><s:text name="popup.commons.submit"/> </a>
- <a class="button" onclick="closePopupAddUrl()"><s:text name="popup.commons.cancel"/> </a>
-</div>
Modified: trunk/bow-ui/src/main/webapp/jsp/inc/rightMenu.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/inc/rightMenu.jsp 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/jsp/inc/rightMenu.jsp 2011-08-18 02:37:38 UTC (rev 306)
@@ -23,14 +23,13 @@
-->
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@taglib prefix="s" uri="/struts-tags" %>
-<%@page import="org.chorem.bow.BowConfig" %>
-<%
-String bowUrl = BowConfig.getBowUrl();
+<%@taglib prefix="sj" uri="/struts-jquery-tags" %>
-if (request.getAttribute("formAction") == null) {
- request.setAttribute("formAction", "addUrl");
-}
-%>
+<sj:dialog id="editBookmark"
+ title="Ajout/Modification d'un bookmark"
+ modal="true"
+ autoOpen="false" />
+
<div id="logoutDiv" xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
xmlns:jsp="http://java.sun.com/JSP/Page">
<s:form action="logout" theme="simple">
@@ -38,22 +37,25 @@
<s:submit key="bow.rightMenu.logout" name="submit" />
</div>
</s:form>
- <a href="http://maven-site.chorem.org/bow/" class="help" onclick="window.open(this.href); return false;"><s:text name="bow.rightMenu.help" /></a>
+ <a href="http://maven-site.chorem.org/bow/" class="help" target="_blank">
+ <s:text name="bow.rightMenu.help" />
+ </a>
</div>
+
<div id="side" xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
xmlns:jsp="http://java.sun.com/JSP/Page">
- <s:include value="popupAddUrl.jsp" />
- <s:set var="searchLine" value="%{request.bookmarkActions.searchLine}" />
- <s:set var="fullTextLine" value="%{request.bookmarkActions.fullTextLine}" />
<div id="colonneD">
<ul class="droite">
- <s:if test="#session.BowSession.isAdmin()">
+ <s:if test="bowSession.admin">
<li><s:a action="admin"><s:text name="bow.rightMenu.admin" /></s:a></li>
</s:if>
<li><s:a action="preferences"><s:text name="bow.preferences.title" /></s:a></li>
<li>
- <s:url var="editBookmark" action="editBookmark"/>
- <s:a href="%{editBookmark}" onclick="return openPopupAddUrl('', '', '', '', '', '');">
+ <s:url var="editBookmark" action="editBookmark" escapeAmp="true">
+ <s:param name="searchLine"><s:property value="%{searchLine}" /></s:param>
+ <s:param name="fullTextLine"><s:property value="%{fullTextLine}" /></s:param>
+ </s:url>
+ <s:a href="%{editBookmark}">
<s:text name="bow.rightMenu.addUrl.link" />
</s:a>
</li>
@@ -61,6 +63,7 @@
<!--div id="nuage"-->
<jsp:include page="tagsCloud.jsp" flush="true">
<jsp:param name="searchLine" value="%{searchLine}" />
+ <jsp:param name="fullTextLine" value="%{fullTextLine}"/>
</jsp:include>
<!--/div-->
<div class="colonnebas">
Modified: trunk/bow-ui/src/main/webapp/jsp/inc/tagsCloud.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/inc/tagsCloud.jsp 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/jsp/inc/tagsCloud.jsp 2011-08-18 02:37:38 UTC (rev 306)
@@ -23,7 +23,6 @@
-->
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@taglib prefix="s" uri="/struts-tags" %>
-<%@page import="org.chorem.bow.BookmarkActions"%>
<div id="nuage"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
@@ -35,6 +34,9 @@
<s:param name="fullTextLine" value="%{fullTextLine}"/>
</s:url>
<!-- -->
- <s:a href="%{search}" title="%{#tag.count} results" cssClass="tag" cssStyle="font-size: %{searchResult.getFont(#tag.count)}px"><s:property value="%{#tag.topicName}" /></s:a>
+ <s:a href="%{search}" title="%{#tag.count} results" cssClass="tag"
+ cssStyle="font-size: %{searchResult.getFont(#tag.count)}px">
+ <s:property value="%{#tag.topicName}" />
+ </s:a>
</s:iterator>
</div>
\ No newline at end of file
Modified: trunk/bow-ui/src/main/webapp/jsp/preferences.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/preferences.jsp 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/jsp/preferences.jsp 2011-08-18 02:37:38 UTC (rev 306)
@@ -22,16 +22,8 @@
#L%
-->
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
-<%@page import="org.chorem.bow.BowConfig"%>
-<%@page import="org.nuiton.wikitty.search.FacetTopic"%>
-<%@page import="org.chorem.bow.action.PreferencesAction"%>
<%@taglib prefix="s" uri="/struts-tags" %>
-<%
- PreferencesAction action = PreferencesAction.getAction();
- String bowUrl = BowConfig.getBowUrl();
-%>
-
<html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
xmlns:jsp="http://java.sun.com/JSP/Page">
<head>
@@ -52,16 +44,16 @@
<s:set var="temporaryToken" value="#session.BowSession.getTemporaryToken()" />
<ul>
<li>
- <a title="%{getText('bow.rightMenu.bookmark.temporaryLinkDescription')}"
- href="javascript:var%20url=location.href;var%20nameAndTags=prompt('Entrez%20le%20nom%20du%20lien%20et%20la%20liste%20des%20tags%20sous%20la%20forme:%20name|tag1%20tag2%20tag3',%20document.title+'|');if%20(nameAndTags!=(document.title+'|')){var%20link='<%=bowUrl%>addUrl.action?token=${temporaryToken}&url='+encodeURIComponent(url)+'&nameAndTags='+encodeURIComponent(nameAndTags);var%20script=document.createElement('script');script.src=link;script.type='text/javascript';document.body.appendChild(script);}void(0);">
+ <s:a title="%{getText('bow.rightMenu.bookmark.temporaryLinkDescription')}"
+ href="javascript:var%20url=location.href;var%20nameAndTags=prompt('Entrez%20le%20nom%20du%20lien%20et%20la%20liste%20des%20tags%20sous%20la%20forme:%20name|tag1%20tag2%20tag3',%20document.title+'|');if%20(nameAndTags!=(document.title+'|')){var%20link='%{config.bowUrl}addUrl.action?token=%{temporaryToken}&url='+encodeURIComponent(url)+'&nameAndTags='+encodeURIComponent(nameAndTags);var%20script=document.createElement('script');script.src=link;script.type='text/javascript';document.body.appendChild(script);}void(0);">
<s:text name="bow.rightMenu.bookmark.temporaryLink" />
- </a>
+ </s:a>
</li>
<li>
- <a title="%{getText('bow.rightMenu.bookmark.permanentLinkDescription')}"
- href="javascript:var%20url=location.href;var%20nameAndTags=prompt('Entrez%20le%20nom%20du%20lien%20et%20la%20liste%20des%20tags%20sous%20la%20forme:%20name|tag1%20tag2%20tag3',%20document.title+'|');if%20(nameAndTags!=(document.title+'|')){var%20link='<%=bowUrl%>addUrl.action?token=${permanentToken}&url='+encodeURIComponent(url)+'&nameAndTags='+encodeURIComponent(nameAndTags);var%20script=document.createElement('script');script.src=link;script.type='text/javascript';document.body.appendChild(script);}void(0);">
+ <s:a title="%{getText('bow.rightMenu.bookmark.permanentLinkDescription')}"
+ href="javascript:var%20url=location.href;var%20nameAndTags=prompt('Entrez%20le%20nom%20du%20lien%20et%20la%20liste%20des%20tags%20sous%20la%20forme:%20name|tag1%20tag2%20tag3',%20document.title+'|');if%20(nameAndTags!=(document.title+'|')){var%20link='%{config.bowUrl}addUrl.action?token=%{permanentToken}&url='+encodeURIComponent(url)+'&nameAndTags='+encodeURIComponent(nameAndTags);var%20script=document.createElement('script');script.src=link;script.type='text/javascript';document.body.appendChild(script);}void(0);">
<s:text name="bow.rightMenu.bookmark.permanentLink" />
- </a>
+ </s:a>
</li>
<li>
<a href="extensions/bow4chromium.crx">
@@ -137,27 +129,18 @@
</div>
<div class="formFrame fond">
- <h3><s:text name="bow.preferences.labels"/></h3>
+ <h3><s:text name="bow.preferences.labels"/>(<s:property value="labels.size()"/>)</h3>
<br/>
<s:form id="labelsForm" action="adminlabels" method="post" theme="simple">
- <ul>
- <% for (FacetTopic topic : action.getLabels()) { %>
- <div>
- <%-- impossible de mettre un <s:checkbox, a priori erreur soit
- disant que la tld ne permet pas d'expression :(. Comme
- ca marche tres bien en HTML pure, vive le HTML :) --%>
- <input type="checkbox" name="selectedLabels"
- value="<%=topic.getTopicName()%>">
- <%=topic.getTopicName()%>(<%=topic.getCount()%>)
- </input>
- </div>
- <% } %>
- <div>
- <s:text name="bow.preferences.labels.name.field"/><s:textfield name="newLabel" />
- <s:submit name="rename" key="bow.preferences.labels.rename.submit" />
- <s:submit name="delete" key="bow.preferences.labels.delete.submit" />
- </div>
- </ul>
+ <div class="list">
+ <s:checkboxlist name="selectedLabels" list="labels"
+ listKey="topicName" listValue="%{topicName+'('+count+')'}"/>
+ </div>
+ <div class="action">
+ <s:text name="bow.preferences.labels.name.field"/><s:textfield name="newLabel" />
+ <s:submit name="rename" key="bow.preferences.labels.rename.submit" />
+ <s:submit name="delete" key="bow.preferences.labels.delete.submit" />
+ </div>
</s:form>
</div>
@@ -181,23 +164,17 @@
<s:if test="bookmarksImportDate != null">
<s:iterator value="bookmarksImportDate">
+ <s:set name="date" value="%{key}"/>
+ <s:set name="nb" value="%{value}"/>
+ <s:date name="%{stringToDate(#date)}" var="dateString"/>
<div class="deleteImport">
- <%
- String date = (String) request.getAttribute("key");
- String dateSave = date;
-
- date = date.replaceAll("[^0-9:-]+", " ").trim();
- date = date.substring(0, date.lastIndexOf(' '));
- %>
- <span><%=date%> (<s:property value="value"/> bookmarks)</span>
+ <span><s:property value="dateString"/> (<s:property value="#nb"/> bookmarks)</span>
<s:url var="deleteImport" action="deleteImport">
- <s:param name="date"><%=dateSave%>
- </s:param>
+ <s:param name="date" value="#date"/>
</s:url>
- <s:set name="date" value="%{key}"/>
- <s:set name="count" value="%{value}"/>
- <a class="deleteImportButton" href="%{deleteImport}"
- onclick="return deleteConfirmation('${deleteImport}','${count}','<%=date%>');"></a>
+ <s:a cssClass="deleteImportButton" href="%{deleteImport}"
+ onclick="return deleteConfirmation('%{deleteImport}','%{nb}','%{dateString}');">
+ </s:a>
</div>
</s:iterator>
</s:if>
Modified: trunk/bow-ui/src/main/webapp/jsp/suggestions.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/suggestions.jsp 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/bow-ui/src/main/webapp/jsp/suggestions.jsp 2011-08-18 02:37:38 UTC (rev 306)
@@ -24,18 +24,20 @@
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="org.chorem.bow.OpenSearchActions" %>
<%@page import="org.nuiton.wikitty.search.FacetTopic" %>
+<%@page import="org.chorem.bow.action.OpenSearchSuggestionAction"%>
<%@page import="java.util.List" %>
<%
-OpenSearchActions osa = (OpenSearchActions) request.getAttribute("openSearchAction");
+OpenSearchSuggestionAction action = OpenSearchSuggestionAction.getAction();
+OpenSearchActions osa = action.getOpenSearchActions();
if (osa != null) {
String[] word = osa.getSearch();
if (word != null) {
List<FacetTopic> suggestions = osa.getSuggestionList();
if (suggestions != null) {
- %>
- <%=osa.getJsonResult()%>
- <%
+%>
+<%=osa.getJsonResult()%>
+<%
}
}
}
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2011-08-16 23:13:25 UTC (rev 305)
+++ trunk/pom.xml 2011-08-18 02:37:38 UTC (rev 306)
@@ -126,6 +126,7 @@
<wikittyVersion>3.2-SNAPSHOT</wikittyVersion>
<slf4jVersion>1.6.1</slf4jVersion>
<struts2Version>2.2.3</struts2Version>
+ <struts2jqueryVersion>3.1.0</struts2jqueryVersion>
<htmlParserVersion>1.6</htmlParserVersion>
<javaxMailVersion>1.4.3</javaxMailVersion>
<servletApiVersion>2.5</servletApiVersion>
@@ -179,6 +180,12 @@
</dependency>
<dependency>
+ <groupId>com.jgeppert.struts2.jquery</groupId>
+ <artifactId>struts2-jquery-plugin</artifactId>
+ <version>${struts2jqueryVersion}</version>
+ </dependency>
+
+ <dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12.1.GA</version>
1
0
Author: tchemit
Date: 2011-08-17 01:13:25 +0200 (Wed, 17 Aug 2011)
New Revision: 305
Url: http://chorem.org/repositories/revision/bow/305
Log:
Update mavenpom4redmine to 3.0.1.
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2011-08-16 18:19:34 UTC (rev 304)
+++ trunk/pom.xml 2011-08-16 23:13:25 UTC (rev 305)
@@ -10,7 +10,7 @@
<parent>
<groupId>org.nuiton</groupId>
<artifactId>mavenpom4redmine</artifactId>
- <version>3.0</version>
+ <version>3.0.1</version>
</parent>
<groupId>org.chorem</groupId>
1
0
r304 - in trunk: . bow-ui bow-ui/src/main/java/org/chorem/bow bow-ui/src/main/java/org/chorem/bow/action bow-ui/src/main/resources bow-ui/src/main/resources/i18n bow-ui/src/main/webapp/jsp bow-ui/src/main/webapp/jsp/inc bow-ui/src/main/xmi src/site/rst/developper
by bpoussin@users.chorem.org 16 Aug '11
by bpoussin@users.chorem.org 16 Aug '11
16 Aug '11
Author: bpoussin
Date: 2011-08-16 20:19:34 +0200 (Tue, 16 Aug 2011)
New Revision: 304
Url: http://chorem.org/repositories/revision/bow/304
Log:
Evolution #438: Refactore source code and simplify all
- utilisation de BaseAction de nuiton-web
- utilisation de struts I18n de nuiton-web
- simplification de tous le concept de recherche et de page Home
- modification du modele pour utilise WikittyAuthorisation pour faire le lien entre les bookmarks et ceux qui peuvent y acceder
- ajout de la migration vers ce nouveau modele
- l'action de migration a ete rendu generic pour supporter les migrations de n'importe quelle version
- suppression de certain action en double (redirectToUrl-> alias) et qui ne servent plus (search,fulltextsearch,order->home)
- debug de preference action qui faisait des exceptions ou qui ne fonctionnait pas (manque de tag dans la liste d'admin)
Added:
trunk/bow-ui/src/main/java/org/chorem/bow/BowMigration06To11.java
trunk/bow-ui/src/main/java/org/chorem/bow/BowSearchResult.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/MigrateDataAction.java
trunk/bow-ui/src/main/webapp/jsp/home.jsp
trunk/src/site/rst/developper/bow-model.rst
Removed:
trunk/bow-ui/src/main/java/org/chorem/bow/BowInit.java
trunk/bow-ui/src/main/java/org/chorem/bow/BowSearch.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/FullTextSearchAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/Migrate04To05Action.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/RedirectToUrlAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/SearchAction.java
trunk/bow-ui/src/main/webapp/jsp/home.jsp
trunk/bow-ui/src/main/webapp/jsp/inc/popupPublicAlias.jsp
trunk/bow-ui/src/main/webapp/jsp/search.jsp
Modified:
trunk/bow-ui/pom.xml
trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkActions.java
trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java
trunk/bow-ui/src/main/java/org/chorem/bow/BowConfig.java
trunk/bow-ui/src/main/java/org/chorem/bow/BowMigration04To05.java
trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/AddUrlAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/AliasAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/BowBaseAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteImportAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/HomeAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/LoginAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/OrderAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java
trunk/bow-ui/src/main/java/org/chorem/bow/action/RegisterAction.java
trunk/bow-ui/src/main/resources/i18n/bow-ui_en_GB.properties
trunk/bow-ui/src/main/resources/i18n/bow-ui_fr_FR.properties
trunk/bow-ui/src/main/resources/log4j.properties
trunk/bow-ui/src/main/resources/struts.xml
trunk/bow-ui/src/main/webapp/jsp/admin.jsp
trunk/bow-ui/src/main/webapp/jsp/inc/bookmark.jsp
trunk/bow-ui/src/main/webapp/jsp/inc/header.jsp
trunk/bow-ui/src/main/webapp/jsp/inc/rightMenu.jsp
trunk/bow-ui/src/main/webapp/jsp/inc/tagsCloud.jsp
trunk/bow-ui/src/main/webapp/jsp/preferences.jsp
trunk/bow-ui/src/main/xmi/bow.zargo
trunk/pom.xml
Modified: trunk/bow-ui/pom.xml
===================================================================
--- trunk/bow-ui/pom.xml 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/pom.xml 2011-08-16 18:19:34 UTC (rev 304)
@@ -41,6 +41,11 @@
</dependency>
<dependency>
+ <groupId>org.nuiton.web</groupId>
+ <artifactId>nuiton-struts2</artifactId>
+ </dependency>
+
+ <dependency>
<groupId>org.nuiton.i18n</groupId>
<artifactId>nuiton-i18n</artifactId>
</dependency>
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkActions.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkActions.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkActions.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -30,6 +30,7 @@
import org.apache.commons.lang.StringUtils;
import org.nuiton.util.StringUtil;
import org.nuiton.wikitty.search.FacetTopic;
+import org.nuiton.wikitty.search.PagedResult;
/**
*
@@ -45,7 +46,13 @@
protected int tmax = -1;
protected int tmin = -1;
-
+ public BookmarkActions() {
+ }
+
+ public BookmarkActions(PagedResult<BowBookmark> booklist) {
+ List<FacetTopic> topics = booklist.getTopic(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
+ }
+
public void createTagCloud(List<FacetTopic> cpy) {
setTagCloud(cpy);
deleteTagBySearch();
@@ -85,15 +92,10 @@
}
public void addTags(String str) {
- if (str != null) {
- if (!str.isEmpty()) {
- str = str.trim();
- String[] tags = str.split("\\s+");
- for (String tag : tags) {
- if (!tagsSearch.contains(tag)) {
- tagsSearch.add(tag);
- }
- }
+ List<String> tags = BowUtils.getWords(str);
+ for (String tag : tags) {
+ if (!tagsSearch.contains(tag)) {
+ tagsSearch.add(tag);
}
}
}
@@ -135,7 +137,10 @@
}
public void setTagSearch(List<String> cpy) {
- tagsSearch = cpy;
+ tagsSearch = new ArrayList<String>();
+ if (cpy != null) {
+ tagsSearch.addAll(cpy);
+ }
}
public String getSearchLine() {
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -24,11 +24,17 @@
package org.chorem.bow;
import java.text.ParseException;
-import java.util.*;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -48,22 +54,70 @@
*/
public static Log log = LogFactory.getLog(BookmarkUtils.class);
- static public Criteria getBookmarkListCriteriaByUser(BowPreference user, String searchLine) {
- Criteria criteria = null;
- if (user != null) {
- if (searchLine != null && !searchLine.isEmpty()) {
- String[] words = searchLine.split("\\s+"); //Puts the tags in an array
- List<String> tags = new ArrayList<String>(Arrays.asList(words));
- criteria = Search.query()
- .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_BOWUSER, user.getWikittyId())
- .eq(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS, tags).criteria()
- .addFacetField(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
- } else {
- criteria = Search.query().eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_BOWUSER, user.getWikittyId()).
- criteria().addFacetField(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
- }
- criteria.setEndIndex(user.getBookmarks());
+ static public Search addEqUser(Search search, String userId) {
+ Search result = search.or();
+ result = result.eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, userId);
+ result = result.eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_READER, userId);
+ result = result.eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_WRITER, userId);
+ result = result.eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_ADMIN, userId);
+ return search;
+ }
+
+ static public Criteria getBookmarkListCriteriaByUser(BowPreference user) {
+ Criteria criteria = getBookmarkListCriteriaByUser(user, null, null, null);
+ return criteria;
+ }
+
+ static public Criteria getBookmarkListCriteriaByUser(
+ BowPreference user, String searchLine, String fullTextLine, String order) {
+ Search search = Search.query();
+ BookmarkUtils.addEqUser(search, user.getWikittyId());
+
+ if (StringUtils.isNotBlank(fullTextLine)) {
+ search.keyword(fullTextLine);
}
+
+ if (StringUtils.isNotBlank(searchLine)) {
+ List<String> tags = BowUtils.getWords(searchLine);
+ search.eq(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS, tags);
+ }
+
+ Criteria criteria = search.criteria();
+ criteria.addFacetField(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
+ // on fixe le nombre de tag max souhaite par l'utilisateur
+ criteria.setFacetLimit(user.getTags());
+
+ // on fixe le nombre max d'element a ce qu'a defini l'utilisateur
+ criteria.setEndIndex(user.getBookmarks());
+
+ boolean sortOrderAscending = StringUtils.startsWith(order, "asc");
+ String sortOrderField = null;
+ if (StringUtils.equals(order,"ascName")) {
+ sortOrderField = BowBookmark.FQ_FIELD_BOWBOOKMARK_DESCRIPTION;
+ } else if (StringUtils.equals(order,"ascDate")) {
+ sortOrderField = BowBookmark.FQ_FIELD_BOWBOOKMARK_CREATIONDATE;
+ } else if (StringUtils.equals(order,"ascClick")) {
+ sortOrderField = BowBookmark.FQ_FIELD_BOWBOOKMARK_CLICK;
+ } else if (StringUtils.equals(order,"descName")) {
+ sortOrderField = BowBookmark.FQ_FIELD_BOWBOOKMARK_DESCRIPTION;
+ } else if (StringUtils.equals(order,"descDate")) {
+ sortOrderField = BowBookmark.FQ_FIELD_BOWBOOKMARK_CREATIONDATE;
+ } else if (StringUtils.equals(order,"descClick")) {
+ sortOrderField = BowBookmark.FQ_FIELD_BOWBOOKMARK_CLICK;
+ }
+ if (sortOrderField == null) {
+ // default sort order
+ // TODO poussin 20110815 rendre configurable par l'utilisateur l'ordre par defaut qu'il prefere
+ sortOrderField = BowBookmark.FQ_FIELD_BOWBOOKMARK_CLICK;
+ sortOrderAscending = false;
+ }
+
+ if (sortOrderAscending) {
+ criteria.setSortAscending(sortOrderField);
+ } else {
+ criteria.setSortDescending(sortOrderField);
+ }
+
return criteria;
}
@@ -78,13 +132,16 @@
bookmarkActions.setBookmarks(bookList);
}
if (fullText == null || fullText.isEmpty()) {
- if (searchLine != null && searchLine.isEmpty()) {
+ if (StringUtils.isEmpty(searchLine)) {
bookmarkActions.emptySearchline();
} else {
bookmarkActions.addTags(searchLine); //Adds the new tags
}
}
List<FacetTopic> topics = result.getTopic(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("There are %s tag in cloud", CollectionUtils.isEmpty(topics)?0:topics.size()));
+ }
bookmarkActions.createTagCloud(topics);
return bookmarkActions;
}
@@ -94,7 +151,7 @@
WikittyProxy proxy = session.getProxy();
Criteria criteria = Search.query()
.eq(Element.ELT_EXTENSION, BowImport.EXT_BOWIMPORT)
- .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_BOWUSER, user.getWikittyId()).criteria()
+ .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, user.getWikittyId()).criteria()
.addFacetField(BowImport.FQ_FIELD_BOWIMPORT_IMPORTDATE)
.setFirstIndex(0).setEndIndex(0);
@@ -231,10 +288,11 @@
if (nameIndex >= 0) {
tags = nameAndTags.substring(nameIndex + 1); // get tags, +1 because of '|'
}
- addTagsToBookmark(tags, bookmark);
+ addTagsToBookmark(BowUtils.getWords(tags), bookmark);
addUrlToBookmark(url, bookmark);
bookmark.setClick(0);
- bookmark.setBowUser(user.getWikittyId()); // set the email (user name)
+ bookmark.setOwner(user.getWikittyId());
+ bookmark.addReader(user.getWikittyId()); // only owner can read it
bookmark.setCreationDate(new Date()); // set the date
return bookmark;
}
@@ -251,18 +309,10 @@
}
}
- public static void addTagsToBookmark(String tags, BowBookmark bookmark) {
- if (tags != null && !tags.isEmpty()) {
- String[] tagsTab = tags.split("\\s+"); // put the tags in an array
- List<String> tagList = Arrays.asList(tagsTab);
- addTagsToBookmark(tagList, bookmark);
- }
- }
-
public static void addTagsToBookmark(List<String> tagList, BowBookmark bookmark) {
if (tagList != null) {
for (String tag : tagList) {
- if (tag != null && !tag.isEmpty()) {
+ if (StringUtils.isNotEmpty(tag)) {
// on peut ajouter plusieurs fois le meme tag, car on les
// stocke dans un Set
bookmark.addLabels(tag);
@@ -293,13 +343,14 @@
bookmark.setDescription("");
}
- addTagsToBookmark(tags, bookmark);
+ addTagsToBookmark(BowUtils.getWords(tags), bookmark);
addUrlToBookmark(url, bookmark);
bookmark.setClick(0);
- bookmark.setBowUser(user.getWikittyId()); // set the email (user name)
+ bookmark.setOwner(user.getWikittyId());
+ bookmark.addReader(user.getWikittyId()); // only owner can read it
if (date == null) {
date = new Date();
}
@@ -334,7 +385,7 @@
}
addUrlToBookmark(link, bookmark);
bookmark.clearLabels();
- addTagsToBookmark(tags, bookmark);
+ addTagsToBookmark(BowUtils.getWords(tags), bookmark);
if (privateAlias != null) {
privateAlias = privateAlias.trim();
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowConfig.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowConfig.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowConfig.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -47,7 +47,12 @@
/** Singleton instance. */
protected static ApplicationConfig config;
- private BowConfig() {
+ /**
+ * constructeur public seulement pour pouvoir mettre une variable de ce
+ * type dans BowBaseAction et acceder facilement au donnees dans les jsp
+ * en ognl
+ */
+ public BowConfig() {
}
public static ApplicationConfig getConfig(String... args) {
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/BowInit.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowInit.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowInit.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -1,136 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow;
-
-import org.nuiton.wikitty.WikittyProxy;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.PagedResult;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.List;
-import org.nuiton.wikitty.search.Search;
-
-public class BowInit {
-
- protected static final int MAX_ELEMENT_NUMBER = 10;
-
- private static final String ALIAS_SERVLET_URL = "aliasServletUrl";
-
-// static public void checkAdmin(Map<String, Object> session, String login) {
-// String[] admins = BowConfig.getInstance().getAdmins();
-//
-// boolean isAdmin = false;
-// if (admins != null) {
-// for (String admin : admins) {
-// if (login.equals(admin)) {
-// isAdmin = true;
-// break;
-// }
-// }
-// }
-// BowSession bowSession = BowSession.getBowSession(session);
-// bowSession.setAdmin(isAdmin);
-// }
-//
-// /**
-// * load token if not already loaded, or create new bow token if token not
-// * found in data
-// *
-// * @param session
-// * @param login
-// * @throws NoSuchAlgorithmException
-// */
-// static public void initializeToken(Map<String, Object> session, User login)
-// throws NoSuchAlgorithmException {
-// BowSession bowSession = BowSession.getBowSession(session);
-// BowToken bowToken = bowSession.getBowToken();
-// if (bowToken == null) {
-// WikittyProxy proxy = bowSession.getProxy();
-// Criteria criteria = Search.query().eq(Token.FQ_FIELD_TOKEN_EMAIL, login.getEmail()).criteria();
-// Token token = proxy.findByCriteria(Token.class, criteria);
-// bowToken = new BowToken();
-//
-// if (token == null) {
-// token = new TokenImpl();
-// String newToken = bowToken.generateToken();
-// token.setToken(newToken);
-// token.setEmail(login.getEmail());
-// proxy.store(token);
-// }
-// bowToken.setPermanentToken(token.getToken());
-// String temporaryToken = bowToken.generateToken();
-// bowToken.setTemporaryToken(temporaryToken);
-// bowSession.setBowToken(bowToken);
-// }
-// }
-
-// static public void initSession(Map<String, Object> session, User user) throws NoSuchAlgorithmException {
-// BowSession bowSession = BowSession.getBowSession(session);
-//// WikittyProxy proxy = bowSession.getProxy();
-//
-// if (user != null) {
-// bowSession.setUser(user);
-//
-// // pas ajouter dans bowSession car, en a t on vraiment besoin ?
-//// session.put("version", config.getVersion());
-//// session.put("bowUrl", config.getBowUrl());
-//// initializeToken(session, user);
-//// checkAdmin(session, user.getEmail());
-// }
-// }
-//
- static public void initHomePage(HttpServletRequest request, BowPreference user) {
- BowSession session = BowSession.getBowSession(request);
- BowPreference pref = session.getPreference();
-
- WikittyProxy proxy = session.getProxy();
- Criteria criteria = BookmarkUtils.getBookmarkListCriteriaByUser(user, null);
-
- if (criteria != null) {
- Criteria sortCriteria = Search.query(criteria).criteria()
- .addSortDescending(BowBookmark.FQ_FIELD_BOWBOOKMARK_CLICK)
- .setEndIndex(MAX_ELEMENT_NUMBER);
- PagedResult<BowBookmark> result = proxy.findAllByCriteria(BowBookmark.class, sortCriteria); //Selects all bookmarks by user
- sortCriteria =Search.query(criteria).criteria()
- .addSortDescending(BowBookmark.FQ_FIELD_BOWBOOKMARK_CREATIONDATE)
- .setEndIndex(MAX_ELEMENT_NUMBER);
- List<BowBookmark> lastBookmarks =
- proxy.findAllByCriteria(BowBookmark.class, sortCriteria).getAll();
- BookmarkActions bookmarkActions =
- BookmarkUtils.createBookmarkActions(request, result, null);
- bookmarkActions.setTagSearch(null);
- List<BowBookmark> bookList = bookmarkActions.getBookmarks();
-
- if (bookList.size() > MAX_ELEMENT_NUMBER) {
- bookList = bookmarkActions.getBookmarks().subList(0, MAX_ELEMENT_NUMBER);
- bookmarkActions.setBookmarks(bookList);
- }
- if (lastBookmarks != null) {
- bookmarkActions.setLastBookmarks(lastBookmarks);
- }
- request.setAttribute("bookmarkActions", bookmarkActions);
- }
- request.setAttribute(ALIAS_SERVLET_URL, BowConfig.getServletAliasUrl());
- }
-}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowMigration04To05.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowMigration04To05.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowMigration04To05.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -140,7 +140,8 @@
result.add(bowBookmark);
// copie du bookmark
- bowBookmark.setBowUser(user.getWikittyId());
+ bowBookmark.setOwner(user.getWikittyId());
+ bowBookmark.addReader(user.getWikittyId());
bowBookmark.setClick(bookmark.getClick());
bowBookmark.setCreationDate(bookmark.getDate());
bowBookmark.setDescription(bookmark.getDescription());
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/BowMigration06To11.java (from rev 302, trunk/bow-ui/src/main/java/org/chorem/bow/BowMigration04To05.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowMigration06To11.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowMigration06To11.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -0,0 +1,125 @@
+/*
+ * #%L
+ * BOW UI
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package org.chorem.bow;
+
+
+import java.util.List;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.wikitty.WikittyProxy;
+import org.nuiton.wikitty.WikittyService;
+import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.Wikitty;
+import org.nuiton.wikitty.entities.WikittyAuthorisationHelper;
+import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.search.PagedResult;
+import org.nuiton.wikitty.search.Search;
+import org.nuiton.wikitty.services.WikittyExtensionMigration;
+import org.nuiton.wikitty.services.WikittyExtensionMigrationRename;
+
+/**
+ * Migre les données depuis la version 0.6 vers la version 1.1.
+ * On suppose que les données sont convenablement indexee.
+ *
+ * <li> ajout du champs BowBookmark.authentificationInfo (rien a faire pour la migration)
+ * <li> suppression de BowBookmark.bowUser
+ * <li> BowBookmark depend de WikittyAuthorisation
+ *
+ * la valeur de BowBookmark.bowUser est maintenant stockee dans
+ * WikittyAuthorisation.owner et WikittyAuthorisation.reader
+ * pour que par defaut seul le owner est les droits de lecture sur l'item
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class BowMigration06To11 extends WikittyExtensionMigrationRename {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(BowMigration06To11.class);
+
+ /** nombre d'objet a charger en 1 fois */
+ final static public int MAX = 1000;
+
+ /**
+ * Point d'entree de la migration
+ *
+ * @param proxy
+ */
+ @Override
+ public Wikitty migrate(WikittyService service, Wikitty wikitty,
+ WikittyExtension oldExt, WikittyExtension newExt) {
+ // on laisse l'implantation par defaut migrer tout ce qu'il faut
+ // nouvelle dependance, ...
+ Wikitty result = super.migrate(service, wikitty, oldExt, newExt);
+
+ // On met juste a jour les données avec le champs supprimer bowUser
+ String bookId = wikitty.getId();
+ String userId = (String)wikitty.getFqField(
+ BowBookmark.EXT_BOWBOOKMARK + WikittyUtil.FQ_FIELD_NAME_SEPARATOR
+ + "bowUser");
+ if (userId == null) {
+ log.error(String.format("BowBookmark without bowUser info: %s", bookId));
+ } else {
+ WikittyAuthorisationHelper.setOwner(result, userId);
+ WikittyAuthorisationHelper.addReader(result, userId);
+ }
+
+ return result;
+ }
+
+ static public void migrate(WikittyProxy proxy) {
+ log.info("Migration 0.5 to 0.6 started");
+ // on enregistre la classe qui fera la migration des données
+ WikittyExtensionMigration.migrationRegistry.put(
+ BowBookmark.EXT_BOWBOOKMARK, new BowMigration06To11());
+
+ // une simple lecture puis ecrire fera automatiquement la migration
+ // grace a la classe enregistree pour.
+ Criteria criteria =
+ Search.query().exteq(BowBookmark.EXT_BOWBOOKMARK).criteria();
+ int i = 0;
+ int count = 0;
+ PagedResult<Wikitty> wikitties;
+ do {
+ criteria.setFirstIndex(i);
+ criteria.setEndIndex(i += MAX);
+ wikitties = proxy.findAllByCriteria(criteria);
+ List<Wikitty> books = wikitties.getAll();
+ proxy.storeWikitty(books);
+ count += books.size();
+ } while (wikitties.size() >= MAX);
+ log.info(String.format("Migration of %s BowBookmark done", count));
+ }
+
+ // only here to simplify test and debug of migration, this permit to migrate
+ // datas in developpement environnement directly without launch bow web app
+ public static void main(String ... args) {
+ BowProxy proxy = BowProxy.getInstance(null);
+ migrate(proxy);
+ }
+}
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/BowSearch.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowSearch.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowSearch.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -1,94 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.PagedResult;
-import org.nuiton.wikitty.WikittyProxy;
-import org.nuiton.wikitty.search.Search;
-
-public class BowSearch {
-
- static public void search(HttpServletRequest request, BowPreference user) {
- String searchLine = request.getParameter("searchLine");
-
- if (searchLine == null) {
- searchLine = "";
- }
- String fulltext = request.getParameter("fullTextLine");
-
- if (fulltext != null && !fulltext.isEmpty() && searchLine.isEmpty()) {
- fullText(request, user);
- } else {
- String tag = request.getParameter("addTag");
-
- if (tag != null && !tag.isEmpty()) {
- if (searchLine.isEmpty()) {
- searchLine = tag;
- } else {
- searchLine += " " + tag;
- }
- }
- BowSession session = BowSession.getBowSession(request);
- WikittyProxy proxy = session.getProxy();
- Criteria criteria = BookmarkUtils.getBookmarkListCriteriaByUser(user, searchLine);
-
- if (criteria != null ) {
- criteria = criteria.addSortDescending(BowBookmark.FQ_FIELD_BOWBOOKMARK_CLICK);
-
- if (criteria != null) {
- PagedResult<BowBookmark> result =
- proxy.findAllByCriteria(BowBookmark.class, criteria); //Selects all bookmarks by user
- BookmarkActions bookmarkActions = BookmarkUtils.createBookmarkActions(request, result, searchLine);
- request.setAttribute("bookmarkActions", bookmarkActions);
- }
- }
- }
- }
-
- static public void fullText(HttpServletRequest request, BowPreference user) {
- String fullText = request.getParameter("fullTextLine");
-
- if (fullText == null || fullText.isEmpty()) {
- search(request, user);
- } else {
- BowSession session = BowSession.getBowSession(request);
- WikittyProxy proxy = session.getProxy();
- Criteria criteria;
-
- if (!fullText.isEmpty()) {
- criteria = Search.query().keyword(fullText).
- eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_BOWUSER, user.getWikittyId()).criteria().
- addFacetField(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
- } else {
- criteria = BookmarkUtils.getBookmarkListCriteriaByUser(user, null);
- }
- PagedResult<BowBookmark> result = proxy.findAllByCriteria(BowBookmark.class, criteria);
- BookmarkActions bookmarkActions = BookmarkUtils.createBookmarkActions(request, result, null);
- request.setAttribute("bookmarkActions", bookmarkActions);
- }
- }
-}
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/BowSearchResult.java (from rev 302, trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkActions.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowSearchResult.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowSearchResult.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -0,0 +1,202 @@
+/*
+ * #%L
+ * bow
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package org.chorem.bow;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import org.apache.commons.collections.CollectionUtils;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.util.StringUtil;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.search.FacetTopic;
+import org.nuiton.wikitty.search.PagedResult;
+
+/**
+ * Cette classe permet de stocker le resutlat d'une recherche
+ * - la liste des tags qui ont servi pour la recherche
+ * - la chaine fulltext de recherche
+ * - la liste des bookmarks
+ * - la liste des tags
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class BowSearchResult {
+
+ private static final Log log = LogFactory.getLog(BowSearchResult.class);
+
+ /** la ligne contenant les tags a rechercher */
+ protected String searchLine;
+ /** la ligne contenant le fulltext a recherche */
+ protected String fullTextLine;
+ /** l'ordre souhaite pour l'affichage */
+ protected String order;
+ /** nombre total de bookmark trouve */
+ protected int bookmarkCount = 0;
+ protected List<BowBookmark> bookmarks;
+ protected List<FacetTopic> tagsCloud;
+ protected int tmax = -1;
+ protected int tmin = -1;
+
+ /**
+ * Construit l'objet en passant en parametre tout ce qu'il faut pour faire
+ * la recherche
+ *
+ * @param session la session de l'utilisateur sur lequel on peut recuperer
+ * le proxy et les preferences
+ * @param searchLine (optionel) le liste des tags a rechercher
+ * @param fullTextLine (optionel) la chaine fulltext a rechercher
+ * @param order (optionnel) l'ordre d'affichage du resultat
+ */
+ public BowSearchResult(BowSession session,
+ String searchLine, String fullTextLine, String order) {
+ this.searchLine = StringUtils.defaultString(searchLine);
+ this.fullTextLine = StringUtils.defaultString(fullTextLine);
+ this.order = StringUtils.defaultString(order);
+
+ BowPreference user = session.getPreference();
+ BowProxy proxy = session.getProxy();
+
+ Criteria criteria = BookmarkUtils.getBookmarkListCriteriaByUser(
+ user, searchLine, fullTextLine, order);
+ PagedResult<BowBookmark> result =
+ proxy.findAllByCriteria(BowBookmark.class, criteria);
+
+ bookmarkCount = result.getNumFound();
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Find %s items, used %s",
+ bookmarkCount, result.size()));
+ }
+
+ setBookmarks(result.getAll());
+
+ List<FacetTopic> topics = result.getTopic(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("There are %s tag in cloud",
+ CollectionUtils.isEmpty(topics)?0:topics.size()));
+ }
+ setTagCloud(topics);
+ }
+
+ public void setTagCloud(List<FacetTopic> cpy) {
+ tagsCloud = new ArrayList<FacetTopic>();
+ if (cpy != null) {
+ tagsCloud.addAll(cpy);
+
+ // on ne met pas dans le cloud les tags qui ont servi pour la recherche
+ List<FacetTopic> save = new ArrayList<FacetTopic>(tagsCloud);
+ // on met dans un Set pour optimiser la recherche
+ Set<String> tagsSearch =
+ new HashSet<String>(BowUtils.getWords(getSearchLine()));
+
+ for(Iterator<FacetTopic> i=tagsCloud.iterator(); i.hasNext();) {
+ FacetTopic topic = i.next();
+ String name = topic.getTopicName();
+ if (tagsSearch.contains(name)) {
+ i.remove();
+ }
+ }
+
+ // on calcul la frequence pour le calcul de la taille dans le cloud
+ tmax = -1; // correspond to the most tag frequency in the tag cloud
+ tmin = -1; // correspond to the less tag frequency in the tag cloud
+ for (FacetTopic tag : tagsCloud) {
+ int value = tag.getCount();
+ if (tmax < value) { // search the most tag frequancy
+ tmax = value;
+ }
+ if (tmin == -1) {
+ tmin = value;
+ } else if (tmin > value) { // search less tag frequency
+ tmin = value;
+ }
+ }
+
+ }
+ }
+
+ public String getSearchLine() {
+ return searchLine;
+ }
+
+ public int getFont(int ti) {
+ int font = 1;
+ if (tmax > tmin) {
+ font = 30 * (ti - tmin) / (tmax - tmin); // get the font size for a tag frequency
+ }
+ if (font < 10) {
+ font = 10;
+ }
+ return font;
+ }
+
+ public List<FacetTopic> getTagsCloud() {
+ return tagsCloud;
+ }
+
+ public List<String> getTagsSearch() {
+ return BowUtils.getWords(getSearchLine());
+ }
+
+ public List<BowBookmark> getBookmarks() {
+ return bookmarks;
+ }
+
+ public void setBookmarks(List<BowBookmark> bookmarks) {
+ this.bookmarks = new ArrayList<BowBookmark>();
+ if (bookmarks != null) {
+ this.bookmarks.addAll(bookmarks);
+ }
+ }
+
+ public int getTmin() {
+ return tmin;
+ }
+
+ public int getTmax() {
+ return tmax;
+ }
+
+ public String getFullTextLine() {
+ return fullTextLine;
+ }
+
+ public int getBookmarkCount() {
+ return bookmarkCount;
+ }
+
+ public String getOrder() {
+ return order;
+ }
+
+}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -23,7 +23,9 @@
*/
package org.chorem.bow;
+import java.util.Arrays;
import java.util.Date;
+import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.nuiton.util.StringUtil;
@@ -32,6 +34,7 @@
import org.nuiton.wikitty.search.Search;
import java.util.UUID;
+import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.time.DateFormatUtils;
public class BowUtils {
@@ -41,6 +44,21 @@
private BowUtils() {
}
+ /**
+ * Donne la liste des mots de la chaine passee en parametre.
+ * Si tags est null ou vide, le tableau retourne sera vide
+ *
+ * @param tags
+ * @return
+ */
+ static public List<String> getWords(String tags) {
+ String [] words = StringUtils.split(tags);
+ words = ArrayUtils.nullToEmpty(words);
+
+ List<String> result = Arrays.asList(words);
+ return result;
+ }
+
static public String formatDate(Date date) {
String result = DateFormatUtils.format(date, BOW_DATE_SHORT_PATTERN);
return result;
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/AddUrlAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/AddUrlAction.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/AddUrlAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -201,7 +201,7 @@
if (privateAlias != null && !privateAlias.isEmpty()) {
privateAliasCriteria = Search.query()
.eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_PRIVATEALIAS, privateAlias)
- .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_BOWUSER, userId)
+ .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, userId)
.criteria().setEndIndex(0);
}
if (publicAlias != null && !publicAlias.isEmpty()) {
@@ -242,13 +242,13 @@
// si on a reussi a creer le bookmark, on regarde s'il ne faut pas
// le fusionner avec un deja existant
if (bookmark != null && !bookmark.getDescription().isEmpty()
- && !bookmark.getBowUser().isEmpty()) {
+ && !bookmark.getOwner().isEmpty()) {
// looking for already bookmark with same url, to fusion them
String link = bookmark.getLink();
Criteria criteria = Search.query()
.eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_LINK, link)
- .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_BOWUSER, userId)
+ .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, userId)
.criteria();
BowBookmark oldBookmark =
proxy.findByCriteria(BowBookmark.class, criteria);
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/AliasAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/AliasAction.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/AliasAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -69,7 +69,7 @@
}
String result = SUCCESS;
try {
- if (!StringUtils.isEmpty(alias)) {
+ if (StringUtils.isNotEmpty(alias)) {
WikittyProxy proxy = getBowProxy();
Criteria criteria = Search.query().eq(
@@ -85,9 +85,8 @@
bookmark.setClick(clicks);
proxy.store(bookmark);
} else {
- log.debug(getText(n_("bow.alias.bookmarkId.unknown"), new String[]{alias}));
- addActionError(getText(n_("bow.alias.bookmarkId.unknown"), new String[]{alias}));
- log.debug("No bookmark with alias or id " + alias);
+ log.error(String.format("No bookmark with alias or id '%s'", alias));
+ addActionError(_("bow.alias.bookmarkId.unknown", alias));
result = ERROR;
}
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/BowBaseAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/BowBaseAction.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/BowBaseAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -23,16 +23,14 @@
*/
package org.chorem.bow.action;
-import com.opensymphony.xwork2.ActionSupport;
-import com.opensymphony.xwork2.util.ValueStack;
-import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import java.util.List;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
+import org.chorem.bow.BowConfig;
import org.chorem.bow.BowProxy;
import org.chorem.bow.BowSession;
+import org.nuiton.web.struts2.BaseAction;
/**
* Base class which must be extended by every action
@@ -40,7 +38,7 @@
* the missing i18n translations
* Allows access to the session and the proxy
*/
-public class BowBaseAction extends ActionSupport implements SessionAware {
+public class BowBaseAction extends BaseAction implements SessionAware {
private static final long serialVersionUID = 1L;
@@ -49,9 +47,19 @@
final static protected String CONTEXT_ACTION_KEY = "action";
public static final String UNTRANSLATED_MARKER = "???";
-
+
+ protected BowConfig config = null;
protected Map<String, Object> session;
+ protected String searchLine;
+ protected String fullTextLine;
+ public BowConfig getConfig() {
+ if (config == null) {
+ config = new BowConfig();
+ }
+ return config;
+ }
+
public BowSession getBowSession() {
BowSession result = BowSession.getBowSession(session);
return result;
@@ -67,72 +75,31 @@
this.session = session;
}
- @Override
- public String getText(String aTextName) {
- String value = super.getText(aTextName);
- return getSafeText(aTextName, value);
+ /**
+ * @return the searchLine
+ */
+ public String getSearchLine() {
+ return searchLine;
}
- @Override
- public String getText(String aTextName, String defaultValue) {
- String value = super.getText(aTextName, defaultValue);
- return getSafeText(aTextName, value);
+ /**
+ * @param searchLine the searchLine to set
+ */
+ public void setSearchLine(String searchLine) {
+ this.searchLine = searchLine;
}
- @Override
- public String getText(String aTextName, String defaultValue, String obj) {
- String value = super.getText(aTextName, defaultValue, obj);
- return getSafeText(aTextName, value);
+ /**
+ * @return the fullTextLine
+ */
+ public String getFullTextLine() {
+ return fullTextLine;
}
- @Override
- public String getText(String aTextName, List<?> args) {
- String value = super.getText(aTextName, args);
- return getSafeText(aTextName, value);
- }
-
- @Override
- public String getText(String key, String[] args) {
- String value = super.getText(key, args);
- return getSafeText(key, value);
- }
-
- @Override
- public String getText(String aTextName, String defaultValue, List<?> args) {
- String value = super.getText(aTextName, defaultValue, args);
- return getSafeText(aTextName, value);
- }
-
- @Override
- public String getText(String key, String defaultValue, String[] args) {
- String value = super.getText(key, defaultValue, args);
- return getSafeText(key, value);
- }
-
- @Override
- public String getText(String key, String defaultValue, List<?> args,
- ValueStack stack) {
- String value = super.getText(key, defaultValue, args, stack);
- return getSafeText(key, value);
- }
-
- @Override
- public String getText(String key, String defaultValue, String[] args,
- ValueStack stack) {
- String value = super.getText(key, defaultValue, args, stack);
- return getSafeText(key, value);
- }
-
/**
- * Surrounds the non translated keys with a marker to make them visible
+ * @param fullTextLine the fullTextLine to set
*/
- protected String getSafeText(String key, String value) {
- if (StringUtils.isEmpty(value)) {
- if (log.isWarnEnabled()) {
- log.warn("Key [" + key + "] is not translated");
- }
- return UNTRANSLATED_MARKER + key + UNTRANSLATED_MARKER;
- }
- return value;
+ public void setFullTextLine(String fullTextLine) {
+ this.fullTextLine = fullTextLine;
}
}
\ No newline at end of file
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteImportAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteImportAction.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteImportAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -66,7 +66,7 @@
WikittyProxy proxy = getBowProxy();
BowUser user = getBowSession().getUser();
Criteria criteria = Search.query()
- .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_BOWUSER, user.getWikittyId())
+ .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, user.getWikittyId())
.eq(BowImport.FQ_FIELD_BOWIMPORT_IMPORTDATE, date).criteria();
List<BowImport> bookmarks = proxy.findAllByCriteria(BowImport.class, criteria).getAll();
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -25,6 +25,7 @@
import java.util.ArrayList;
import java.util.List;
+import org.apache.commons.lang.StringUtils;
import org.chorem.bow.BowBookmark;
import org.chorem.bow.BookmarkUtils;
@@ -45,67 +46,21 @@
public class DeleteSearchResultsAction extends BowBaseAction {
private static final long serialVersionUID = -3903724044644625507L;
- protected String searchLine;
- protected String fullTextLine;
/**
- * @return the searchLine
- */
- public String getSearchLine() {
- return searchLine;
- }
-
- /**
- * @param searchLine the searchLine to set
- */
- public void setSearchLine(String searchLine) {
- this.searchLine = searchLine;
- }
-
- /**
- * @return the fullTextLine
- */
- public String getFullTextLine() {
- return fullTextLine;
- }
-
- /**
- * @param fullTextLine the fullTextLine to set
- */
- public void setFullTextLine(String fullTextLine) {
- this.fullTextLine = fullTextLine;
- }
-
- /**
* Deletes the search results
*/
public String execute() {
try {
- if (searchLine != null && fullTextLine != null) {
- WikittyProxy proxy = getBowProxy();
- Criteria criteria;
+ if (StringUtils.isNotBlank(searchLine)
+ || StringUtils.isNotBlank(fullTextLine)) {
BowPreference user = getBowSession().getPreference();
+ Criteria criteria = BookmarkUtils.getBookmarkListCriteriaByUser(
+ user, searchLine, fullTextLine, null);
- if (fullTextLine.isEmpty()) {
- criteria = BookmarkUtils.getBookmarkListCriteriaByUser(user, searchLine);
- } else {
- criteria = Search.query().keyword(fullTextLine)
- .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_BOWUSER, user.getWikittyId()).criteria()
- .addFacetField(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
- }
- List<BowBookmark> bookmarks = proxy.findAllByCriteria(BowBookmark.class, criteria).getAll();
- List<String> ids = new ArrayList<String>();
+ WikittyProxy proxy = getBowProxy();
+ List<String> ids = proxy.findAllIdByCriteria(criteria).getAll();
- // TODO poussin 20110216 a revoir, incomprehensible :(
- for (BowBookmark bookmark : bookmarks) {
- if (bookmark != null) {
- if (searchLine.isEmpty() && bookmark.getLabels() == null ||
- !searchLine.isEmpty() || fullTextLine.isEmpty() &&
- bookmark.getLabels() == null || !fullTextLine.isEmpty()) {
- ids.add(bookmark.getWikittyId());
- }
- }
- }
proxy.delete(ids);
addActionMessage(getText(n_("bow.search.results.deleted")));
}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -72,7 +72,7 @@
// Get all bookmark for user
Criteria criteria = Search.query()
- .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_BOWUSER, user.getWikittyId()).criteria();
+ .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, user.getWikittyId()).criteria();
List<BowBookmark> bookmarks = proxy.findAllByCriteria(BowBookmark.class, criteria).getAll();
// Export all
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/FullTextSearchAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/FullTextSearchAction.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/FullTextSearchAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -1,94 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.struts2.interceptor.ServletRequestAware;
-import org.chorem.bow.BowPreference;
-import org.chorem.bow.BowSearch;
-import org.chorem.bow.BowSession;
-
-import static org.nuiton.i18n.I18n.n_;
-
-/**
- * Fait la recherche fulltext
- *
- * @author poussin
- */
-public class FullTextSearchAction extends BowBaseAction implements ServletRequestAware {
- private static final long serialVersionUID = -7736099487284993426L;
- protected String searchLine;
- protected String fullTextLine;
- protected HttpServletRequest request;
-
- @Override
- public void setServletRequest(HttpServletRequest request) {
- this.request = request;
- }
-
- /**
- * @return the searchLine
- */
- public String getSearchLine() {
- return searchLine;
- }
-
- /**
- * @param searchLine the searchLine to set
- */
- public void setSearchLine(String searchLine) {
- this.searchLine = searchLine;
- }
-
- /**
- * @return the fullTextLine
- */
- public String getFullTextLine() {
- return fullTextLine;
- }
-
- /**
- * @param fullTextLine the fullTextLine to set
- */
- public void setFullTextLine(String fullTextLine) {
- this.fullTextLine = fullTextLine;
- }
-
- /**
- * Fulltext search
- */
- public String execute() {
- try {
- BowSession session = getBowSession();
- BowPreference user = session.getPreference();
-
- BowSearch.fullText(request, user);
- } catch (Exception e) {
- addActionError(getText(n_("bow.error.internal")));
- log.error(e.getMessage(), e);
- }
- return SUCCESS;
- }
-}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/HomeAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/HomeAction.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/HomeAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -23,11 +23,24 @@
*/
package org.chorem.bow.action;
-import javax.servlet.http.HttpServletRequest;
+import com.opensymphony.xwork2.ActionContext;
+import java.util.Arrays;
+import java.util.List;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.struts2.interceptor.ServletRequestAware;
-import org.chorem.bow.BowInit;
+import org.chorem.bow.BookmarkUtils;
+import org.chorem.bow.BowBookmark;
+import org.chorem.bow.BowConfig;
import org.chorem.bow.BowPreference;
+import org.chorem.bow.BowSearchResult;
+import org.chorem.bow.BowSession;
+import org.nuiton.util.TimeLog;
+import org.nuiton.wikitty.WikittyProxy;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.search.PagedResult;
import static org.nuiton.i18n.I18n.n_;
@@ -36,41 +49,81 @@
*
* @author poussin
*/
-public class HomeAction extends BowBaseAction implements ServletRequestAware {
+public class HomeAction extends BowBaseAction {
+
+ private static final Log log = LogFactory.getLog(HomeAction.class);
+ private static final TimeLog timeLog = new TimeLog(HomeAction.class);
+
private static final long serialVersionUID = -3735250067223062719L;
- protected String token;
- protected HttpServletRequest request;
-
- /**
- * @return the token
- */
- public String getToken() {
- return token;
+
+ private static final String ALIAS_SERVLET_URL = "aliasServletUrl";
+
+ static public HomeAction getAction() {
+ Object action = ActionContext.getContext().get(CONTEXT_ACTION_KEY);
+ return (HomeAction) action;
}
- /**
- * @param token the token to set
- */
- public void setToken(String token) {
- this.token = token;
+
+ protected String order;
+ protected String addTag;
+ final static protected List<String> possibleOrder = Arrays.asList(
+ "ascName", "descName", "ascClick", "descClick", "ascDate", "descDate");
+
+ protected BowSearchResult searchResult;
+
+ public static List<String> getPossibleOrder() {
+ return possibleOrder;
}
+
+ public String getOrder() {
+ return order;
+ }
+
+ public void setOrder(String order) {
+ this.order = order;
+ }
- @Override
- public void setServletRequest(HttpServletRequest request) {
- this.request = request;
+ public String getAddTag() {
+ return addTag;
}
+ public void setAddTag(String addTag) {
+ this.addTag = addTag;
+ }
+
+ public BowSearchResult getSearchResult() {
+ return searchResult;
+ }
+
+ public void setSearchResult(BowSearchResult searchResult) {
+ this.searchResult = searchResult;
+ }
+
/**
* Initializes everything before displaying the home page
*/
+ @Override
public String execute() {
+ long start = TimeLog.getTime();
try {
- BowPreference user = getBowSession().getPreference();
-
- BowInit.initHomePage(request, user);
- } catch (Exception e) {
+ // on ajoute les tags qui doivent faire parti de ne nouvelle recherche
+ // on restocke dans searchLine pour que la bonne info reapparaisse
+ // a l'utilisateur
+ searchLine = StringUtils.join(new String[]{searchLine, addTag}, " ").trim();
+
+ // si l'ordre souhaite n'existe pas, on utilise l'ordre par defaut
+ if (!getPossibleOrder().contains(order)) {
+ // default sort order
+ // TODO poussin 20110815 rendre configurable par l'utilisateur l'ordre par defaut qu'il prefere
+ order = "descClick";
+ }
+
+ BowSession s = getBowSession();
+ searchResult = new BowSearchResult(s, searchLine, fullTextLine, order);
+ } catch (Exception eee) {
addActionError(getText(n_("bow.error.internal")));
- log.error(e.getMessage(), e);
+ log.error(eee.getMessage(), eee);
}
+ timeLog.log(start, "execute");
return SUCCESS;
}
}
\ No newline at end of file
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -30,11 +30,12 @@
import java.util.Date;
import java.util.List;
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.lang.StringUtils;
import org.apache.struts2.interceptor.ServletRequestAware;
-import org.chorem.bow.*;
+import org.chorem.bow.BookmarkUtils;
+import org.chorem.bow.BowBookmark;
+import org.chorem.bow.BowImportHelper;
+import org.chorem.bow.BowPreference;
+import org.chorem.bow.BowUser;
import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.util.NodeList;
@@ -58,10 +59,6 @@
protected File upfile;
protected String upfileContentType;
protected String upfileFileName;
- protected String searchLine;
- protected String fullTextLine;
- protected String redirectTo;
- protected HttpServletRequest request;
/**
* @return the upfile
@@ -108,48 +105,6 @@
this.upfileFileName = upfileFileName;
}
- /**
- * @return the searchLine
- */
- public String getSearchLine() {
- return searchLine;
- }
-
- /**
- * @param searchLine
- * the searchLine to set
- */
- public void setSearchLine(String searchLine) {
- this.searchLine = searchLine;
- }
-
- /**
- * @return the fullTextLine
- */
- public String getFullTextLine() {
- return fullTextLine;
- }
-
- /**
- * @param fullTextLine
- * the fullTextLine to set
- */
- public void setFullTextLine(String fullTextLine) {
- this.fullTextLine = fullTextLine;
- }
-
- /**
- * @return the redirectTo
- */
- public String getRedirectTo() {
- return redirectTo;
- }
-
- @Override
- public void setServletRequest(HttpServletRequest request) {
- this.request = request;
- }
-
protected void parseHtmlToBookmarks(NodeList list, BowUser user, Date date,
List<BowBookmark> bookmarks, List<String> tagList)
throws ParserException {
@@ -219,33 +174,34 @@
new ArrayList<String>());
proxy.store(bookmarks);
- redirectTo = BowUtils.redirectTo(searchLine, fullTextLine);
- if (StringUtils.isEmpty(searchLine)) {
- BowInit.initHomePage(request, user);
- } else {
- BowSearch.search(request, user);
- }
+// redirectTo = BowUtils.redirectTo(searchLine, fullTextLine);
+// if (StringUtils.isEmpty(searchLine)) {
+// BowInit.initHomePage(request, user);
+// } else {
+// BowSearch.search(request, user);
+// }
addActionMessage(getText(n_("bow.bookmark.import.successful")));
- } catch (ParserException e) {
+ } catch (ParserException eee) {
+ log.error(String.format("Can't parse imported file '%s'", getUpfileFileName()), eee);
addActionError(getText(n_("bow.bookmark.badFileFormat")));
- if (searchLine == null || searchLine.isEmpty()) {
- BowInit.initHomePage(request, user);
- } else {
- BowSearch.search(request, user);
- }
- } catch (IOException e2) {
+// if (searchLine == null || searchLine.isEmpty()) {
+// BowInit.initHomePage(request, user);
+// } else {
+// BowSearch.search(request, user);
+// }
+ } catch (IOException eee) {
+ log.error(String.format("Can't read imported file '%s'", getUpfileFileName()), eee);
addActionError(getText(n_("bow.error.internal")));
- log.error(e2.getMessage(), e2);
return ERROR;
}
} else {
addActionError(getText(n_("bow.bookmark.badFileFormat")));
return ERROR;
}
- } catch (Exception e) {
+ } catch (Exception eee) {
addActionError(getText(n_("bow.error.internal")));
- log.error(e.getMessage(), e);
+ log.error(eee.getMessage(), eee);
return ERROR;
}
return SUCCESS;
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/LoginAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/LoginAction.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/LoginAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -29,8 +29,6 @@
import org.apache.struts2.interceptor.ServletRequestAware;
import org.chorem.bow.BowConfig;
import org.chorem.bow.BowUser;
-import org.chorem.bow.BowInit;
-import org.chorem.bow.BowPreference;
import org.chorem.bow.BowUserImpl;
import org.nuiton.util.StringUtil;
import org.nuiton.wikitty.search.Criteria;
@@ -126,8 +124,8 @@
user = checkLogin(email, md5);
if (user != null) {
getBowSession().setUser(user);
- BowPreference pref = getBowSession().getPreference();
- BowInit.initHomePage(servletRequest, pref);
+// BowPreference pref = getBowSession().getPreference();
+// BowInit.initHomePage(servletRequest, pref);
result = SUCCESS;
}
}
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/Migrate04To05Action.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/Migrate04To05Action.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/Migrate04To05Action.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -1,65 +0,0 @@
-/*
- * #%L
- * BOW UI
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.chorem.bow.BowMigration04To05;
-import org.chorem.bow.BowSession;
-import org.nuiton.wikitty.WikittyProxy;
-
-import static org.nuiton.i18n.I18n.n_;
-
-/**
- * Lance la migration des données de la version 0.4 vers 0.5
- *
- * @author poussin
- * @version $Revision$
- *
- * Last update: $Date$
- * by : $Author$
- */
-public class Migrate04To05Action extends BowBaseAction {
-
- /** to use log facility, just put in your code: log.info(\"...\"); */
- static private Log log = LogFactory.getLog(Migrate04To05Action.class);
-
- public String execute() {
- try {
- BowSession session = getBowSession();
- if (session.isAdmin()) { //If is admin
- WikittyProxy proxy = getBowProxy();
-
- BowMigration04To05.migrate(proxy);
- addActionMessage(getText(n_("bow.admin.dataMigration.success")));
- }
- } catch (Exception e) {
- addActionError(getText(n_("bow.error.internal")));
- log.error(e.getMessage(), e);
- }
- return SUCCESS;
- }
-
-}
Copied: trunk/bow-ui/src/main/java/org/chorem/bow/action/MigrateDataAction.java (from rev 302, trunk/bow-ui/src/main/java/org/chorem/bow/action/Migrate04To05Action.java)
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/MigrateDataAction.java (rev 0)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/MigrateDataAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -0,0 +1,95 @@
+/*
+ * #%L
+ * BOW UI
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+package org.chorem.bow.action;
+
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.chorem.bow.BowMigration04To05;
+import org.chorem.bow.BowMigration06To11;
+import org.chorem.bow.BowSession;
+import org.nuiton.util.VersionUtil;
+import org.nuiton.wikitty.WikittyProxy;
+
+import static org.nuiton.i18n.I18n.n_;
+
+/**
+ * Lance la migration des données de la version 0.4 vers 0.5
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class MigrateDataAction extends BowBaseAction {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(MigrateDataAction.class);
+
+ /** Version must be real version, like 0.4, 0.5 or 0.6 */
+ protected String versionFrom;
+ protected String versionTo;
+
+ public void setVersionFrom(String versionFrom) {
+ this.versionFrom = versionFrom;
+ }
+
+ public void setVersionTo(String versionTo) {
+ this.versionTo = versionTo;
+ }
+
+ public String execute() {
+ try {
+ if (StringUtils.isBlank(versionFrom) || StringUtils.isBlank(versionTo)) {
+ log.error("Migration action must have to parameter: versionFrom and versionTo");
+ } else {
+ BowSession session = getBowSession();
+ if (session.isAdmin()) { //If is admin
+ WikittyProxy proxy = getBowProxy();
+
+ if (VersionUtil.equals(versionFrom, "0.4")
+ && VersionUtil.equals(versionTo, "0.5")) {
+ BowMigration04To05.migrate(proxy);
+ addActionMessage(getText(n_("bow.admin.dataMigration.success")));
+ } else if (VersionUtil.equals(versionFrom, "0.6")
+ && VersionUtil.equals(versionTo, "1.1")) {
+ BowMigration06To11.migrate(proxy);
+ addActionMessage(getText(n_("bow.admin.dataMigration.success")));
+ } else {
+ addActionMessage(String.format(
+ "No migration found for %s to %s",
+ versionFrom, versionTo));
+ }
+ }
+ }
+ } catch (Exception e) {
+ addActionError(getText(n_("bow.error.internal")));
+ log.error(e.getMessage(), e);
+ }
+ return SUCCESS;
+ }
+
+}
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -49,27 +49,13 @@
public class OpenSearchResultAction extends BowBaseAction implements ServletRequestAware,
ServletResponseAware {
private static final long serialVersionUID = -1691325797986483856L;
- protected String searchLine;
+
protected String token;
protected String redirectTo;
protected HttpServletRequest request;
protected HttpServletResponse response;
/**
- * @return the searchLine
- */
- public String getSearchLine() {
- return searchLine;
- }
-
- /**
- * @param searchLine the searchLine to set
- */
- public void setSearchLine(String searchLine) {
- this.searchLine = searchLine;
- }
-
- /**
* @return the token
*/
public String getToken() {
@@ -113,10 +99,13 @@
searchLine = searchLine.substring(index + 1); //Suppresses first ":"
WikittyProxy proxy = getBowProxy();
- Criteria criteria = BookmarkUtils.getBookmarkListCriteriaByUser(user, searchLine);
+ Criteria criteria = BookmarkUtils.getBookmarkListCriteriaByUser(
+ user, searchLine, null, null);
criteria = criteria.addSortDescending(BowBookmark.FQ_FIELD_BOWBOOKMARK_CLICK);
- PagedResult<BowBookmark> result = proxy.findAllByCriteria(BowBookmark.class, criteria); //Retrieves bookmarks by search
- BookmarkActions bookmarkActions = BookmarkUtils.createBookmarkActions(request, result, searchLine);
+ PagedResult<BowBookmark> result = proxy.findAllByCriteria(
+ BowBookmark.class, criteria); //Retrieves bookmarks by search
+ BookmarkActions bookmarkActions = BookmarkUtils.createBookmarkActions(
+ request, result, searchLine);
request.setAttribute("bookmarkActions", bookmarkActions);
request.setAttribute("token", token);
redirectTo = BowUtils.redirectTo(searchLine, null);
@@ -125,13 +114,8 @@
String fullText = searchLine.substring(2);
WikittyProxy proxy = getBowProxy();
Criteria criteria;
- if (!fullText.isEmpty()) {
- criteria = Search.query().keyword(fullText).
- eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_BOWUSER, user.getWikittyId()).criteria().
- addFacetField(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
- } else {
- criteria = BookmarkUtils.getBookmarkListCriteriaByUser(user, null);
- }
+ criteria = BookmarkUtils.getBookmarkListCriteriaByUser(user, null, searchLine, null);
+
PagedResult<BowBookmark> result = proxy.findAllByCriteria(BowBookmark.class, criteria);
BookmarkActions bookmarkActions = BookmarkUtils.createBookmarkActions(request, result, null);
request.setAttribute("bookmarkActions", bookmarkActions);
@@ -142,7 +126,7 @@
String privateAlias = searchLine.substring(2);
WikittyProxy proxy = getBowProxy();
Criteria criteria = Search.query()
- .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_BOWUSER, user.getWikittyId())
+ .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, user.getWikittyId())
.eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_PRIVATEALIAS, privateAlias)
.criteria();
String bookmarkId = proxy.findIdByCriteria(criteria);
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -33,6 +33,7 @@
import org.chorem.bow.BowBookmark;
import org.chorem.bow.OpenSearchActions;
import org.chorem.bow.BowUser;
+import org.chorem.bow.BowUtils;
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.search.FacetTopic;
import org.nuiton.wikitty.search.PagedResult;
@@ -47,37 +48,23 @@
*/
public class OpenSearchSuggestionAction extends BowBaseAction implements ServletRequestAware {
private static final long serialVersionUID = 3973618635494129146L;
- protected String searchLine;
+
protected HttpServletRequest request;
- /**
- * @return the searchLine
- */
- public String getSearchLine() {
- return searchLine;
- }
-
- /**
- * @param searchLine the searchLine to set
- */
- public void setSearchLine(String searchLine) {
- this.searchLine = searchLine;
- }
-
@Override
public void setServletRequest(HttpServletRequest request) {
- this.request = request;
+ this.request = request;
}
public String execute() {
- BowUser user = getBowSession().getUser();
+ BowUser user = getBowSession().getUser();
if (searchLine != null) {
OpenSearchActions openSearchActions = new OpenSearchActions();
WikittyProxy proxy = getBowProxy();
- String[] words = searchLine.split("\\s+");
- List<String> searchLineList = new ArrayList<String>(Arrays.asList(words));
+ List<String> searchLineList = BowUtils.getWords(searchLine);
+
if (searchLine.charAt(searchLine.length() - 1) == ' ') {
searchLineList.add(""); //If the user doesn't type anything, we have to propose suggestions
}
@@ -87,13 +74,13 @@
List<String> cpy = new ArrayList<String>(searchLineList);
cpy.remove(cpy.size() - 1);
criteria = Search.query()
- .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_BOWUSER, user.getWikittyId())
+ .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, user.getWikittyId())
// TODO poussin 20110216 eq n'est sans doute pas bon, plutot un contains ?
.eq(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS, cpy).criteria()
.addFacetField(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
} else {
criteria = Search.query()
- .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_BOWUSER, user.getWikittyId()).criteria()
+ .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, user.getWikittyId()).criteria()
.addFacetField(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
}
PagedResult<BowBookmark> result = proxy.findAllByCriteria(BowBookmark.class, criteria);
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/OrderAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/OrderAction.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/OrderAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -45,37 +45,17 @@
*/
public class OrderAction extends BowBaseAction implements ServletRequestAware {
private static final long serialVersionUID = 203690999710176818L;
- protected String type;
- protected String searchLine;
+
+ protected String order;
protected HttpServletRequest request;
-
- /**
- * @return the type
- */
- public String getType() {
- return type;
- }
- /**
- * @param type the type to set
- */
- public void setType(String type) {
- this.type = type;
+ public String getOrder() {
+ return order;
}
- /**
- * @return the searchLine
- */
- public String getSearchLine() {
- return searchLine;
+ public void setOrder(String order) {
+ this.order = order;
}
-
- /**
- * @param searchLine the searchLine to set
- */
- public void setSearchLine(String searchLine) {
- this.searchLine = searchLine;
- }
@Override
public void setServletRequest(HttpServletRequest request) {
@@ -88,38 +68,39 @@
public String execute() {
try {
BowPreference user = getBowSession().getPreference();
- Criteria baseCriteria = BookmarkUtils.getBookmarkListCriteriaByUser(user, searchLine);
+ Criteria baseCriteria = BookmarkUtils.getBookmarkListCriteriaByUser(
+ user, searchLine, fullTextLine, order);
- if (type != null && baseCriteria != null && !type.isEmpty()) {
+ if (order != null && baseCriteria != null && !order.isEmpty()) {
WikittyProxy proxy = getBowProxy();
PagedResult<BowBookmark> result = null;
- if (type.equals("ascName")) {
+ if (order.equals("ascName")) {
Criteria criteria = baseCriteria.addSortAscending(
BowBookmark.FQ_FIELD_BOWBOOKMARK_DESCRIPTION);
result = proxy.findAllByCriteria(BowBookmark.class, criteria);
addActionMessage(getText(n_("bow.search.order.ascName")));
- } else if (type.equals("ascDate")) {
+ } else if (order.equals("ascDate")) {
Criteria criteria = baseCriteria.addSortAscending(
BowBookmark.FQ_FIELD_BOWBOOKMARK_CREATIONDATE);
result = proxy.findAllByCriteria(BowBookmark.class, criteria);
addActionMessage(getText(n_("bow.search.order.ascDate")));
- } else if (type.equals("ascClick")) {
+ } else if (order.equals("ascClick")) {
Criteria criteria = baseCriteria.addSortAscending(
BowBookmark.FQ_FIELD_BOWBOOKMARK_CLICK);
result = proxy.findAllByCriteria(BowBookmark.class, criteria);
addActionMessage(getText(n_("bow.search.order.ascClick")));
- } else if (type.equals("descName")) {
+ } else if (order.equals("descName")) {
Criteria criteria = baseCriteria.addSortDescending(
BowBookmark.FQ_FIELD_BOWBOOKMARK_DESCRIPTION);
result = proxy.findAllByCriteria(BowBookmark.class, criteria);
addActionMessage(getText(n_("bow.search.order.descName")));
- } else if (type.equals("descDate")) {
+ } else if (order.equals("descDate")) {
Criteria criteria = baseCriteria.addSortDescending(
BowBookmark.FQ_FIELD_BOWBOOKMARK_CREATIONDATE);
result = proxy.findAllByCriteria(BowBookmark.class, criteria);
addActionMessage(getText(n_("bow.search.order.descDate")));
- } else if (type.equals("descClick")) {
+ } else if (order.equals("descClick")) {
Criteria criteria = baseCriteria.addSortDescending(
BowBookmark.FQ_FIELD_BOWBOOKMARK_CLICK);
result = proxy.findAllByCriteria(BowBookmark.class, criteria);
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -25,7 +25,6 @@
import org.chorem.bow.BookmarkUtils;
import org.chorem.bow.BowBookmark;
-import org.chorem.bow.BowInit;
import org.chorem.bow.BowPreference;
import org.chorem.bow.BowProxy;
import org.chorem.bow.BowUser;
@@ -296,7 +295,7 @@
}
protected BowUser changeUser(BowUser newUser) {
- if (email != null && !email.isEmpty()) {
+ if (email != null && !email.isEmpty()) {
newUser.setLogin(email);
}
if (newPassword != null && confirmNewPassword != null && currentPassword != null) {
@@ -325,8 +324,9 @@
Criteria c = Search.query()
.exteq(BowBookmark.EXT_WIKITTYLABEL)
- .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_BOWUSER, userId)
+ .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, userId)
.criteria().setEndIndex(0)
+ .setFacetMinCount(0)
.addFacetField(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS);
PagedResult<Wikitty> result = proxy.findAllByCriteria(c);
List<FacetTopic> topics = result.getTopic(
@@ -360,7 +360,7 @@
Criteria c = Search.query()
.in(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS, selectedLabelsList)
- .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_BOWUSER, userId)
+ .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, userId)
.criteria();
PagedResult<WikittyLabel> searchResult =
proxy.findAllByCriteria(WikittyLabel.class, c);
@@ -389,7 +389,7 @@
}
/**
- * Changes the user preferences
+ * Action executer lorsque l'utilisateur demande la page
*/
public String execute() {
String result = SUCCESS;
@@ -400,36 +400,48 @@
BowPreference preference = getBowSession().getPreference();
loadLabels(proxy);
- Map<String,Integer> bookmarksByImportDate = BookmarkUtils.getBookmarksByImportDate(request, preference);
+ Map<String,Integer> bookmarksByImportDate =
+ BookmarkUtils.getBookmarksByImportDate(request, preference);
if (log.isDebugEnabled()) {
log.debug("bookmarksByImportDate found : " + (bookmarksByImportDate == null ? "null" : bookmarksByImportDate.size()));
}
setBookmarksImportDate(bookmarksByImportDate.isEmpty() ? null : bookmarksByImportDate);
- if (update != null) { //If the user submitted the form
- preference = changePreference(preference);
- preference = proxy.store(preference);
- getBowSession().setPreference(preference);
- Criteria criteria = Search.query().eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria();
- BowUser find = proxy.findByCriteria(BowUser.class, criteria);
+ if (update != null) {
- //If this email address isn't already used (or if it hasn't changed)
- if (find == null || find.getLogin().equals(preference.getLogin())) {
- BowUser newUser = changeUser(preference);
- if (newUser == null) {
+ // modification des preferences du site
+ if ("site".equals(update)) { //If the user submitted the form
+ preference = changePreference(preference);
+ preference = proxy.store(preference);
+ getBowSession().setPreference(preference);
+ }
+
+ // modification des preferences user (email, password)
+ if ("user".equals(update)) {
+ Criteria criteria = Search.query().eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria();
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Try to find user with email: '%s'", email));
+ }
+ BowUser find = proxy.findByCriteria(BowUser.class, criteria);
+
+ //If this email address isn't already used (or if it hasn't changed)
+ if (find == null || find.getLogin().equals(preference.getLogin())) {
+ BowUser newUser = changeUser(preference);
+ if (newUser == null) {
+ result = ERROR;
+ } else {
+ newUser = proxy.store(newUser);
+ getBowSession().setUser(newUser);
+ result = "update";
+ addActionMessage(getText(n_("bow.preferences.update.successful")));
+ }
+ } else {
+ // this email address is already used by someone else
+ setEmail(preference.getLogin());
+ addActionError(getText("bow.preferences.emailAldyExists"));
result = ERROR;
- } else {
- newUser = proxy.store(newUser);
- getBowSession().setUser(newUser);
- result = "update";
- addActionMessage(getText(n_("bow.preferences.update.successful")));
}
- } else {
- // this email address is already used by someone else
- setEmail(preference.getLogin());
- addActionError(getText("bow.preferences.emailAldyExists"));
- result = ERROR;
}
} else {
// If the user didn't submit the form, the fields are filled with
@@ -441,9 +453,9 @@
setSearchEngineUrlSuggestions(preference.getSearchEngineUrlSuggestions());
setSearchEngineUrlResults(preference.getSearchEngineUrlResults());
}
- // retrieve last reference
- preference = getBowSession().getPreference();
- BowInit.initHomePage(request, preference);
+// // retrieve last reference
+// preference = getBowSession().getPreference();
+// BowInit.initHomePage(request, preference);
} catch (Exception e) {
addActionError(getText(n_("bow.error.internal")));
log.error(e.getMessage(), e);
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/RedirectToUrlAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/RedirectToUrlAction.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/RedirectToUrlAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -1,94 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import org.chorem.bow.BowBookmark;
-import org.nuiton.wikitty.WikittyProxy;
-
-import static org.nuiton.i18n.I18n.n_;
-
-/**
- * Retrieves the bookmark URL (where the user will be redirected) and increments
- * the click counter for this bookmark
- *
- */
-public class RedirectToUrlAction extends BowBaseAction {
-
- private static final long serialVersionUID = 8579081104294143087L;
-
- protected String bookmarkId;
- protected String link;
-
- /**
- * @return the bookmarkId
- */
- public String getBookmarkId() {
- return bookmarkId;
- }
- /**
- * @param bookmarkId the bookmarkId to set
- */
- public void setBookmarkId(String bookmarkId) {
- this.bookmarkId = bookmarkId;
- }
-
- /**
- * @return the link
- */
- public String getLink() {
- return link;
- }
- /**
- * @param link the link to set
- */
- public void setLink(String link) {
- this.link = link;
- }
-
- /**
- * Increments the click counter and sets the link (retrieved by Struts2)
- * where the user will be redirected
- */
- public String execute() {
- String result = ERROR;
-
- try {
- if (bookmarkId != null && !bookmarkId.isEmpty()) {
- WikittyProxy proxy = getBowProxy();
- BowBookmark bookmark = proxy.restore(BowBookmark.class, bookmarkId);
- if (bookmark != null) {
- bookmark.setClick(bookmark.getClick() + 1);
- proxy.store(bookmark);
- setLink(bookmark.getLink());
- result = SUCCESS;
- }
- }
- } catch (Exception e) {
- addActionError(getText(n_("bow.error.internal")));
- log.error(e.getMessage(), e);
- }
- return result;
- }
-
-}
\ No newline at end of file
Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/RegisterAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/RegisterAction.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/RegisterAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -31,8 +31,6 @@
import org.chorem.bow.BowMail;
import org.chorem.bow.BowUser;
import org.chorem.bow.BowUserImpl;
-import org.chorem.bow.BowInit;
-import org.chorem.bow.BowPreference;
import org.chorem.bow.BowUtils;
import org.nuiton.util.StringUtil;
import org.nuiton.wikitty.search.Criteria;
@@ -155,8 +153,8 @@
addFieldError("email", getText(n_("bow.register.invalidLogin")));
} else {
getBowSession().setUser(login);
- BowPreference pref = getBowSession().getPreference();
- BowInit.initHomePage(request, pref);
+// BowPreference pref = getBowSession().getPreference();
+// BowInit.initHomePage(request, pref);
try {
String mailContent;
Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/SearchAction.java
===================================================================
--- trunk/bow-ui/src/main/java/org/chorem/bow/action/SearchAction.java 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/java/org/chorem/bow/action/SearchAction.java 2011-08-16 18:19:34 UTC (rev 304)
@@ -1,107 +0,0 @@
-/*
- * #%L
- * bow
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * #L%
- */
-package org.chorem.bow.action;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.struts2.interceptor.ServletRequestAware;
-import org.chorem.bow.BowPreference;
-import org.chorem.bow.BowSearch;
-
-import static org.nuiton.i18n.I18n.n_;
-
-/**
- * gere les recherches de bookmark
- *
- * @author poussin
- */
-public class SearchAction extends BowBaseAction implements ServletRequestAware {
- private static final long serialVersionUID = -2161661766242362907L;
- protected String searchLine;
- protected String fullTextLine;
- protected String addTag;
- protected HttpServletRequest request;
-
- /**
- * @return the searchLine
- */
- public String getSearchLine() {
- return searchLine;
- }
-
- /**
- * @param searchLine the searchLine to set
- */
- public void setSearchLine(String searchLine) {
- this.searchLine = searchLine;
- }
-
- /**
- * @return the fullTextLine
- */
- public String getFullTextLine() {
- return fullTextLine;
- }
-
- /**
- * @param fullTextLine the fullTextLine to set
- */
- public void setFullTextLine(String fullTextLine) {
- this.fullTextLine = fullTextLine;
- }
-
- /**
- * @return the addTag
- */
- public String getAddTag() {
- return addTag;
- }
-
- /**
- * @param addTag the addTag to set
- */
- public void setAddTag(String addTag) {
- this.addTag = addTag;
- }
-
- @Override
- public void setServletRequest(HttpServletRequest request) {
- this.request = request;
- }
-
- /**
- * Searches a bookmark
- */
- public String execute() {
- try {
- BowPreference user = getBowSession().getPreference();
- BowSearch.search(request, user);
- } catch (Exception e) {
- addActionError(getText(n_("bow.error.internal")));
- log.error(e.getMessage(), e);
- }
- return SUCCESS;
-
- }
-}
\ No newline at end of file
Modified: trunk/bow-ui/src/main/resources/i18n/bow-ui_en_GB.properties
===================================================================
--- trunk/bow-ui/src/main/resources/i18n/bow-ui_en_GB.properties 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/resources/i18n/bow-ui_en_GB.properties 2011-08-16 18:19:34 UTC (rev 304)
@@ -1,8 +1,9 @@
alias=
bow.action.locale.english=English
bow.action.locale.french=Fran\u00E7ais
-bow.admin.dataMigration=Migrate all data from 0.4 to 0.5
bow.admin.dataMigration.success=Data migration successful
+bow.admin.dataMigration04to05=Migrate all data from 0.4 to 0.5
+bow.admin.dataMigration05to06=Migrate all data from 0.5 to 0.6
bow.admin.dataReindexation=All data reindexation
bow.admin.forbidden=You don't have admin rights \!
bow.admin.home=Return to the home page
@@ -122,6 +123,7 @@
bow.search.descclick=Desc. clicks nb
bow.search.descdate=Desc. date
bow.search.descname=Desc. name
+bow.search.found=Total\:
bow.search.order.ascClick=Your search results have been sorted by ascendant clicks number
bow.search.order.ascDate=Your search results have been sorted by ascendant date
bow.search.order.ascName=Your search results have been sorted by ascendant name
Modified: trunk/bow-ui/src/main/resources/i18n/bow-ui_fr_FR.properties
===================================================================
--- trunk/bow-ui/src/main/resources/i18n/bow-ui_fr_FR.properties 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/resources/i18n/bow-ui_fr_FR.properties 2011-08-16 18:19:34 UTC (rev 304)
@@ -1,8 +1,9 @@
alias=
bow.action.locale.english=English
bow.action.locale.french=Fran\u00E7ais
-bow.admin.dataMigration=Migrer toutes les donn\u00E9es de la version 0.4 \u00E0 0.5
bow.admin.dataMigration.success=Les donn\u00E9es ont \u00E9t\u00E9 migr\u00E9es avec succ\u00E8s
+bow.admin.dataMigration04to05=Migrer toutes les donn\u00E9es de la version 0.4 \u00E0 0.5
+bow.admin.dataMigration05to06=Migrer toutes les donn\u00E9es de la version 0.5 \u00E0 0.6
bow.admin.dataReindexation=R\u00E9indexation des donn\u00E9es
bow.admin.forbidden=Vous n'\u00EAtes pas administrateur \!
bow.admin.home=Retour sur la page d''accueil
@@ -122,6 +123,7 @@
bow.search.descclick=Nb clics desc.
bow.search.descdate=Date desc.
bow.search.descname=Nom desc.
+bow.search.found=Total\:
bow.search.order.ascClick=Les r\u00E9sultats de votre recherche ont \u00E9t\u00E9 tri\u00E9s par nombre de clics ascendants
bow.search.order.ascDate=Les r\u00E9sultats de votre recherche ont \u00E9t\u00E9 tri\u00E9s par date ascendante
bow.search.order.ascName=Les r\u00E9sultats de votre recherche ont \u00E9t\u00E9 tri\u00E9s par nom ascendant
Modified: trunk/bow-ui/src/main/resources/log4j.properties
===================================================================
--- trunk/bow-ui/src/main/resources/log4j.properties 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/resources/log4j.properties 2011-08-16 18:19:34 UTC (rev 304)
@@ -22,14 +22,18 @@
# #L%
###
# Global logging configuration
-log4j.rootLogger=FATAL, stdout
+log4j.rootLogger=INFO, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d %5p [%t] (%F:%L) %M - %m%n
+log4j.appender.stdout.layout.ConversionPattern=%d %5p [%t] (%30.30c) %m%n
# package level
log4j.logger.org.chorem.bow=DEBUG
-#log4j.logger.org.nuiton.util.TimeLog=WARN
+log4j.logger.org.chorem.bow.web.time=DEBUG
+log4j.logger.org.nuiton.wikitty.WikittyProxy.TimeLog=DEBUG
+log4j.logger.org.nuiton.wikitty.services.WikittyServiceSecurity.TimeLog=DEBUG
log4j.logger.org.apache.struts2.dispatcher.mapper=DEBUG
+log4j.logger.org.apache.solr=WARN
+log4j.logger.org.apache.jcs=WARN
Modified: trunk/bow-ui/src/main/resources/struts.xml
===================================================================
--- trunk/bow-ui/src/main/resources/struts.xml 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/resources/struts.xml 2011-08-16 18:19:34 UTC (rev 304)
@@ -27,6 +27,14 @@
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
+
+ <bean class="org.nuiton.web.struts2.I18nTextProvider" name="i18nTextProvider"
+ type="com.opensymphony.xwork2.TextProvider" />
+ <constant name="struts.xworkTextProvider" value="i18nTextProvider" />
+
+ <!-- pour ne pas remettre tous les parametres deja existant sur
+ les url construite avec s:url -->
+ <constant name="struts.url.includeParams" value="none" />
<constant name="struts.devMode" value="true"/>
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
<constant name="struts.enable.SlashesInActionNames" value="true"/>
@@ -38,6 +46,10 @@
<package name="publicArea" extends="struts-default">
<interceptors>
<interceptor-stack name="publicAreaStack">
+ <interceptor-ref name="timer">
+ <param name="logLevel">debug</param>
+ <param name="logCategory">org.chorem.bow.web.time.render</param>
+ </interceptor-ref>
<interceptor-ref name="defaultStack">
<param name="store.operationMode">AUTOMATIC</param>
<param name="fileUpload.allowedExtensions">.html</param>
@@ -74,6 +86,10 @@
<interceptor-stack name="restrictedAreaStack">
<interceptor-ref name="login"/>
<interceptor-ref name="publicAreaStack"/>
+ <interceptor-ref name="timer">
+ <param name="logLevel">debug</param>
+ <param name="logCategory">org.chorem.bow.web.time.action</param>
+ </interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="restrictedAreaStack"/>
@@ -83,7 +99,7 @@
<action name="alias/*" class="org.chorem.bow.action.AliasAction">
<param name="alias">{1}</param>
<result name="success" type="redirect">${redirectTo}</result>
- <result name="error" type="redirectAction">home</result>
+ <result name="error">/jsp/error.jsp</result>
</action>
</package>
@@ -130,12 +146,6 @@
</package>
<package name="search" extends="restrictedArea">
- <action name="search" class="org.chorem.bow.action.SearchAction">
- <result>/jsp/search.jsp</result>
- </action>
- <action name="fullText" class="org.chorem.bow.action.FullTextSearchAction">
- <result>/jsp/search.jsp</result>
- </action>
<action name="order" class="org.chorem.bow.action.OrderAction">
<result>/jsp/search.jsp</result>
</action>
@@ -161,10 +171,6 @@
<action name="regenPermToken" class="org.chorem.bow.action.GenerateTokenAction">
<result type="redirectAction">preferences</result>
</action>
- <action name="redirectToUrl" class="org.chorem.bow.action.RedirectToUrlAction">
- <result name="error" type="redirectAction">home</result>
- <result type="redirect">${link}</result>
- </action>
<action name="*Xml">
<result>/jsp/{1}Xml.jsp</result>
</action>
@@ -185,7 +191,7 @@
<action name="reIndexation" class="org.chorem.bow.action.ReIndexationAction">
<result>/jsp/admin.jsp</result>
</action>
- <action name="migrate04To05" class="org.chorem.bow.action.Migrate04To05Action">
+ <action name="migrateData" class="org.chorem.bow.action.MigrateDataAction">
<result>/jsp/admin.jsp</result>
</action>
<action name="editBookmark" class="org.chorem.bow.action.EditBookmarkAction">
Modified: trunk/bow-ui/src/main/webapp/jsp/admin.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/admin.jsp 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/webapp/jsp/admin.jsp 2011-08-16 18:19:34 UTC (rev 304)
@@ -43,7 +43,8 @@
<s:if test="#session.BowSession.isAdmin()">
<ul id="adminActions">
<li><s:a action="reIndexation"><s:text name="bow.admin.dataReindexation" /></s:a></li>
- <li><s:a action="migrate04To05"><s:text name="bow.admin.dataMigration" /></s:a></li>
+ <li><s:a action="migrateData?versionFrom=0.4&versionTo=0.5"><s:text name="bow.admin.dataMigration04to05" /></s:a></li>
+ <li><s:a action="migrateData?versionFrom=0.6&versionTo=1.1"><s:text name="bow.admin.dataMigration05to06" /></s:a></li>
<li><s:a action="home" id="homePage"><s:text name="bow.admin.home" /></s:a></li>
</ul>
</s:if>
Deleted: trunk/bow-ui/src/main/webapp/jsp/home.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/home.jsp 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/webapp/jsp/home.jsp 2011-08-16 18:19:34 UTC (rev 304)
@@ -1,99 +0,0 @@
-<!--
- #%L
- bow
-
- $Id$
- $HeadURL$
- %%
- Copyright (C) 2010 CodeLutin
- %%
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- #L%
- -->
-<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-<%@taglib prefix="s" uri="/struts-tags" %>
-<%@page import="org.chorem.bow.BookmarkActions" %>
-<%@page import="org.chorem.bow.BowSession" %>
-<%@page import="org.chorem.bow.BowBookmark" %>
-<%@page import="org.chorem.bow.BowPreference" %>
-<%@page import="java.util.List" %>
-<%
-BowSession bowSession = BowSession.getBowSession(session);
-BookmarkActions bookmarkActions = (BookmarkActions) request.getAttribute("bookmarkActions");
-BowPreference preference = bowSession.getPreference();
-
-if (bookmarkActions != null) {
-%>
-<html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
- xmlns:jsp="http://java.sun.com/JSP/Page">
- <head>
- <title><s:text name="bow.home.title" /></title>
- <s:url var="css" value="/css/bookmark.css" />
- <link href="${css}" rel="stylesheet" type="text/css" />
- <s:head />
- </head>
- <body>
- <div class="menu clearfix">
- <h2><s:text name="bow.home.mostUsedBookmarks" /></h2>
- </div>
- <div class="content">
- <%
- int nbBookmarks = preference.getBookmarks();
-
- List<BowBookmark> bookmarkList = bookmarkActions.getBookmarks();
- if (!bookmarkList.isEmpty()) {
- int count = 0;
- for (BowBookmark bookmark : bookmarkList) {
- request.setAttribute("bookmark", bookmark);
- %>
- <s:include value="inc/bookmark.jsp" />
- <%
- ++count;
- if (count >= nbBookmarks) {
- break;
- }
- }
- } else { %>
- <p class="nobookmarks"><s:text name="bow.bookmarks.noBookmarks" /></p>
- <% } %>
- </div>
-
- <div class="menu clearfix">
- <h2><s:text name="bow.home.latestBookmarks" /></h2>
- </div>
- <div class="content">
- <%
- List<BowBookmark> lastBookmarks = bookmarkActions.getLastBookmarks();
-
- if (!lastBookmarks.isEmpty()) {
- int count = 0;
- for (BowBookmark bookmark : lastBookmarks) {
- request.setAttribute("bookmark", bookmark);
- %>
- <s:include value="inc/bookmark.jsp" />
- <%
- ++count;
- if (count >= nbBookmarks) {
- break;
- }
- }
- } else { %>
- <p class="nobookmarks"><s:text name="bow.bookmarks.noBookmarks" /></p>
- <% } %>
- </div>
-
- <s:include value="inc/popupPublicAlias.jsp" />
- </body>
-</html>
-<% } %>
Copied: trunk/bow-ui/src/main/webapp/jsp/home.jsp (from rev 302, trunk/bow-ui/src/main/webapp/jsp/search.jsp)
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/home.jsp (rev 0)
+++ trunk/bow-ui/src/main/webapp/jsp/home.jsp 2011-08-16 18:19:34 UTC (rev 304)
@@ -0,0 +1,84 @@
+<%@page import="org.chorem.bow.BowSearchResult"%>
+<%@page import="org.chorem.bow.action.HomeAction"%>
+<%@page import="org.chorem.bow.BowConfig"%>
+<!--
+ #%L
+ bow
+
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2010 CodeLutin
+ %%
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ #L%
+ -->
+<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@taglib prefix="s" uri="/struts-tags" %>
+<%@page import="org.chorem.bow.BowBookmark" %>
+<%@page import="org.chorem.bow.BookmarkActions" %>
+<%@page import="java.text.SimpleDateFormat" %>
+<%@page import="java.util.List" %>
+
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
+ xmlns:jsp="http://java.sun.com/JSP/Page">
+
+ <head>
+ <title><s:text name="bow.search.title" /></title>
+ <s:url var="css" value="/css/bookmark.css" />
+ <link href="${css}" rel="stylesheet" type="text/css" />
+ <s:head />
+ </head>
+ <body>
+ <div class="menu clearfix">
+ <h2>
+ <s:text name="bow.search.found" />
+ <s:property value="%{searchResult.bookmarkCount}"/>
+ </h2>
+
+ <s:set name="bookmarksToDelete" value="%{searchResult.bookmarkCount}" />
+ <s:if test="%{#bookmarksToDelete > 0}">
+ <s:url var="deleteSearchResults" action="deleteSearchResults" escapeAmp="false">
+ <s:param name="searchLine"><s:property value="searchResult.searchLine" /></s:param>
+ <s:param name="fullTextLine"><s:property value="searchResult.fullTextLine" /></s:param>
+ </s:url>
+ <s:a id="deleteSearchResultsButton" title="delete all" href="" onclick="deleteConfirmation('%{deleteSearchResults}', %{#bookmarksToDelete}); return(false);"></s:a>
+ </s:if>
+ <s:form action="home" method="get">
+ <p>
+ <label for="order"><s:text name="bow.search.orderby" /></label>
+ <s:select id="order" name="order" list="possibleOrder"/>
+ </p>
+ <s:submit key="bow.search.submit" name="submit" />
+ <s:hidden name="searchLine" value="%{searchResult.searchLine}" />
+ <s:hidden name="fullTextLine" value="%{searchResult.fullTextLine}" />
+ </s:form>
+ </div>
+ <div class="content">
+ <s:if test="searchResult.bookmarks.empty">
+ <p class="nobookmarks"><s:text name="bow.bookmarks.noBookmarks" /></p>
+ </s:if>
+ <s:else>
+ <s:iterator value="searchResult.bookmarks" var="bookmark">
+ <s:set name="bookmark" value="bookmark"/>
+ <jsp:include page="inc/bookmark.jsp" flush="true">
+ <jsp:param name="searchLine" value="%{searchResult.searchLine}" />
+ <jsp:param name="fullTextLine" value="%{searchResult.fullTextLine}" />
+ </jsp:include>
+ </s:iterator>
+ </s:else>
+ </div>
+ </body>
+</html>
Modified: trunk/bow-ui/src/main/webapp/jsp/inc/bookmark.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/inc/bookmark.jsp 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/webapp/jsp/inc/bookmark.jsp 2011-08-16 18:19:34 UTC (rev 304)
@@ -31,107 +31,57 @@
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
xmlns:jsp="http://java.sun.com/JSP/Page">
- <s:if test="%{#request.bookmark != null}">
- <%
- BowBookmark bookmark = (BowBookmark)request.getAttribute("bookmark");
- String bookmarkDescription = bookmark.getDescription();
- if (bookmarkDescription == null) {
- bookmarkDescription = "";
- } else {
- bookmarkDescription = bookmarkDescription.replaceAll("\n", "<br/>");
- }
- %>
-
- <s:set var="searchLine" value="%{#request.searchLine}" />
- <s:set var="fullTextLine" value="%{#request.fullTextLine}" />
- <s:set var="wikittyId" value="%{#request.bookmark.getWikittyId()}" />
- <s:set var="bookmarkLink" value="%{#request.bookmark.getLink()}" />
- <s:set var="bookmarkAlias" value="%{#request.bookmark.getPrivateAlias()}" />
- <s:set var="bookmarkDescription" value="%{#request.bookmark.getDescription()}" />
- <s:set var="bookmarkClicks" value="%{#request.bookmark.getClick()}" />
- <s:set var="formBookmarkId" value="%{#request.formBookmarkId}" />
- <s:set var="privateAlias" value="%{#bookmarkAlias}" />
- <s:set var="aliasServlet" value="%{#request.aliasServletUrl}" />
- <s:set var="publicAliasUrl" value="%{#request.bookmark.getPublicAlias()}" />
- <s:set var="aliasUrl" value="%{#request.aliasServletUrl + #bookmarkAlias}" />
-
<div class="bookmarkhead">
- <p class="date"><%=BowUtils.formatDate(bookmark.getCreationDate())%></p>
- <s:a cssClass="alias" href="%{#aliasServlet + #wikittyId}.action" title="%{#bookmarkLink}" onclick="window.open(this.href); return false;">
- a:<s:property value="%{#privateAlias}" />
+ <p class="date"><s:property value="#bookmark.creationDate"/></p>
+ <s:a cssClass="alias" href="%{config.servletAliasUrl + #bookmark.wikittyId}.action"
+ title="%{#bookmark.link}" target="_blank">
+ a:<s:property value="%{#bookmark.privateAlias}" />
</s:a>
-<%--
- // Pour l'instant on affiche pas l'alias automatique, car il est trop long
- // et on peut recuperer son url en allant sur l'alias privé
- <s:a cssClass="alias" href="%{#aliasServlet + #wikittyId}.action" title="%{#bookmarkLink}" onclick="window.open(this.href); return false;">
- <s:property value="%{#wikittyId}" />
- </s:a>
---%>
- <s:url var="editBookmark" action="editBookmark">
- <s:param name="id" value="%{#wikittyId}"/>
- </s:url>
- <s:if test="%{!#publicAliasUrl.empty}">
- <s:a cssClass="alias" href="%{#aliasServlet + #publicAliasUrl}.action" title="%{#bookmarkLink}" onclick="window.open(this.href); return false;">
- <s:property value="%{#publicAliasUrl}" />
+ <s:if test="%{!#bookmark.publicAlias.empty}">
+ <s:a cssClass="alias" href="%{config.servletAliasUrl + #bookmark.publicAlias}.action"
+ title="%{#bookmark.link}" target="_blank">
+ <s:property value="%{#bookmark.publicAlias}" />
</s:a>
</s:if>
- <s:else>
- <s:url var="addAlias" action="createAlias">
- <s:param name="bookmarkId"><s:property value="%{#wikittyId}" /></s:param>
- <s:param name="alias">irock</s:param>
- </s:url>
- <s:a cssClass="addAlias" href="%{editBookmark}" onclick="return openPublicAliasForm('%{#wikittyId}')">
- <img style="border:none;" src="img/add.png" alt="Set alias" title="Set alias" />
- </s:a>
- </s:else>
- <s:url var="editBookmarkModify" action="modifyBookmark" escapeAmp="false">
- <s:param name="bookmarkId"><s:property value="%{#wikittyId}" /></s:param>
- <s:param name="searchLine"><s:property value="%{#searchLine}" /></s:param>
- <s:param name="fullTextLine"><s:property value="%{#fullTextLine}" /></s:param>
- </s:url>
<s:url var="editBookmark" action="modifyBookmark" escapeAmp="true">
- <s:param name="bookmarkId"><s:property value="%{#wikittyId}" /></s:param>
- <s:param name="searchLine"><s:property value="%{#searchLine}" /></s:param>
- <s:param name="fullTextLine"><s:property value="%{#fullTextLine}" /></s:param>
+ <s:param name="bookmarkId"><s:property value="%{#bookmark.wikittyId}" /></s:param>
+ <s:param name="searchLine"><s:property value="%{searchLine}" /></s:param>
+ <s:param name="fullTextLine"><s:property value="%{fullTextLine}" /></s:param>
</s:url>
-<!--
- <s:a cssClass="edit" href="%{editBookmark}" onclick="return modify('%{#bookmarkDescription}', '%{#bookmarkAlias}', '%{@org.chorem.bow.BookmarkUtils@getBookmarkTagsString(#request.bookmark)}', '%{#bookmarkLink}', '%{editBookmarkModify}', '%{#wikittyId}');"></s:a>
--->
<s:a cssClass="edit" href="%{editBookmark}"
- onclick="return openPopupAddUrl('%{#wikittyId}', '%{#bookmarkLink}', '%{@org.apache.commons.lang.StringEscapeUtils@escapeJavaScript(#request.bookmark.description)}', '%{#bookmarkAlias}', '%{#publicAliasUrl}', '%{@org.chorem.bow.BookmarkUtils@getBookmarkTagsString(#request.bookmark)}');">
+ onclick="return openPopupAddUrl('%{#bookmark.wikittyId}', '%{#bookmark.link}', '%{@org.apache.commons.lang.StringEscapeUtils@escapeJavaScript(#bookmark.description)}', '%{#bookmark.privateAlias}', '%{#bookmark.publicAlias}', '%{@org.chorem.bow.BookmarkUtils@getBookmarkTagsString(#bookmark)}');">
</s:a>
<s:url var="removeBookmark" action="removeBookmark" escapeAmp="true">
- <s:param name="bookmarkId"><s:property value="%{#wikittyId}" /></s:param>
- <s:param name="searchLine"><s:property value="%{#searchLine}" /></s:param>
- <s:param name="fullTextLine"><s:property value="%{#fullTextLine}" /></s:param>
+ <s:param name="bookmarkId"><s:property value="%{#bookmark.wikittyId}" /></s:param>
+ <s:param name="searchLine"><s:property value="%{searchLine}" /></s:param>
+ <s:param name="fullTextLine"><s:property value="%{fullTextLine}" /></s:param>
</s:url>
<s:a cssClass="supprim" href="%{removeBookmark}"
- onclick="return deleteConfirmation('%{#removeBookmark}','%{#bookmarkAlias}');"></s:a>
+ onclick="return deleteConfirmation('%{#removeBookmark}','%{#bookmark.privateAlias}');"></s:a>
</div>
+
<div class="bookmarkcontenu">
- <div class="screenshot"></div>
- <div class="click"><s:property value="%{#bookmarkClicks}" /></div>
+ <s:a title="%{#bookmark.link}" href="alias/%{#bookmark.wikittyId}.action" target="_blank">
+ <div class="screenshot"></div>
+ </s:a>
+ <div class="click"><s:property value="%{#bookmark.click}" /></div>
<div class="description">
<h3><s:text name="bow.bookmark.description" /> :</h3>
<p>
- <s:url var="redirectTo" action="redirectToUrl">
- <s:param name="bookmarkId"><s:property value="%{#wikittyId}" /></s:param>
- </s:url>
- <s:a title="%{#bookmarkLink}" href="%{redirectTo}"
- onclick="window.open(this.href); return false;">
- <%=bookmarkDescription%>
- </s:a>
+ <s:property value="%{#bookmark.description}"/>
</p>
<p class="tags">
<strong><s:text name="bow.bookmark.tags" /> :</strong>
- <s:iterator value="#request.bookmark.labels">
- <s:url var="search" action="search">
- <s:param name="searchLine"><s:property /></s:param>
+ <s:iterator value="#bookmark.labels" var="tag">
+ <s:url var="search" action="home">
+ <s:param name="searchLine" value="%{searchLine}"/>
+ <s:param name="addTag" value="%{#tag}"/>
+ <s:param name="fullTextLine" value="%{fullTextLine}"/>
</s:url>
- <s:a href="%{search}" cssClass="tag"><s:property /></s:a>
+ <s:a href="%{search}" cssClass="tag"><s:property value="%{#tag}"/></s:a>
</s:iterator>
</p>
</div>
</div>
- </s:if>
+
</div>
Modified: trunk/bow-ui/src/main/webapp/jsp/inc/header.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/inc/header.jsp 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/webapp/jsp/inc/header.jsp 2011-08-16 18:19:34 UTC (rev 304)
@@ -40,35 +40,17 @@
<div class="recherche right">
<h3>Recherche</h3>
<div class="input">
- <s:form action="search" theme="simple">
+ <s:form action="home" theme="simple">
<s:textfield name="searchLine" labelSeparator="" />
<s:submit key="bow.rightMenu.search.tags" name="submit" />
</s:form>
</div>
<div class="input">
- <s:form action="fullText" theme="simple">
+ <s:form action="home" theme="simple">
<s:textfield name="fullTextLine" labelSeparator="" />
<s:submit key="bow.rightMenu.fullTextSearch" name="submit" />
</s:form>
</div>
- <%--
- <div class="right">
- <s:form action="search">
- <div class="input">
- <s:textfield key="bow.rightMenu.search" name="searchLine" labelSeparator="" />
- <s:submit key="bow.rightMenu.find.submit" name="submit" />
- </div>
- </s:form>
- </div>
- <div class="left">
- <s:form action="fullText">
- <div class="input">
- <s:textfield key="bow.rightMenu.fullTextSearch" name="fullTextLine" labelSeparator="" />
- <s:submit key="bow.rightMenu.find.submit" name="submit" />
- </div>
- </s:form>
- </div>
- --%>
</div>
</s:if>
<div id="msg">
Deleted: trunk/bow-ui/src/main/webapp/jsp/inc/popupPublicAlias.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/inc/popupPublicAlias.jsp 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/webapp/jsp/inc/popupPublicAlias.jsp 2011-08-16 18:19:34 UTC (rev 304)
@@ -1,81 +0,0 @@
-<!--
- #%L
- BOW UI
-
- $Id$
- $HeadURL$
- %%
- Copyright (C) 2010 - 2011 CodeLutin
- %%
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- #L%
- -->
-<%--
- Document : popupPublicAlias
- Created on : 20 avr. 2011, 17:03:37
- Author : poussin
---%>
-
-<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-<%@taglib prefix="s" uri="/struts-tags" %>
-
-<script>
- function openPublicAliasForm(bookmarkId) {
- $("#publicAliasFormBookmarkId")[0].value = bookmarkId;
- $("#setPublicAliasPopup").dialog("open");
- return false;
- }
-
- $(function() {
- $( "#setPublicAliasPopup" ).dialog({
- autoOpen: false,
- width: 300,
- modal: true,
-// buttons: {
-// "Validate": function() {
-// $("#setPublicAliasForm").submit();
-// $( this ).dialog( "close" );
-// },
-// Cancel: function() {
-// $( this ).dialog( "close" );
-// }
-// },
- close: function() {
- //allFields.val( "" ).removeClass( "ui-state-error" );
- }
- });
- });
- function submitPublicAlias() {
- $("#setPublicAliasForm").submit();
- closePopupAddUrl();
- }
-
- function closePopupPublicAlias() {
- $( "#setPublicAliasPopup" ).dialog( "close" )
- }
-</script>
-
-<s:set id="title">
- <s:text name="popup.setPublicAliasPopup.title"/>
-</s:set>
-
-<div xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
- id="setPublicAliasPopup" title="${title}">
- <s:form id="setPublicAliasForm" action="createAlias">
- <s:textfield key="bow.rightMenu.bookmark.alias" name="alias" class="text ui-widget-content ui-corner-all" />
- <s:hidden id="publicAliasFormBookmarkId" name="bookmarkId" />
- </s:form>
- <a class="button" onclick="submitPublicAlias()"><s:text name="popup.commons.submit"/></a>
- <a class="button" onclick="closePopupPublicAlias()"><s:text name="popup.commons.cancel"/></a>
-</div>
Modified: trunk/bow-ui/src/main/webapp/jsp/inc/rightMenu.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/inc/rightMenu.jsp 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/webapp/jsp/inc/rightMenu.jsp 2011-08-16 18:19:34 UTC (rev 304)
@@ -59,14 +59,9 @@
</li>
</ul>
<!--div id="nuage"-->
- <s:if test="%{searchLine != null}">
- <jsp:include page="tagsCloud.jsp" flush="true">
- <jsp:param name="searchLine" value="%{searchLine}" />
- </jsp:include>
- </s:if>
- <s:else>
- <jsp:include page="tagsCloud.jsp" flush="true" />
- </s:else>
+ <jsp:include page="tagsCloud.jsp" flush="true">
+ <jsp:param name="searchLine" value="%{searchLine}" />
+ </jsp:include>
<!--/div-->
<div class="colonnebas">
<img src="img/piedmenu.jpg" width="401" height="77" alt="Pied de menu" />
Modified: trunk/bow-ui/src/main/webapp/jsp/inc/tagsCloud.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/inc/tagsCloud.jsp 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/webapp/jsp/inc/tagsCloud.jsp 2011-08-16 18:19:34 UTC (rev 304)
@@ -28,22 +28,13 @@
<div id="nuage"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
xmlns:jsp="http://java.sun.com/JSP/Page">
- <s:if test="#request.bookmarkActions != null">
- <s:if test="%{#session.BowSession.preference.tags > #request.bookmarkActions.getTagsCloud().size()}">
- <s:set var="maxTags" value="#request.bookmarkActions.getTagsCloud().size()" />
- </s:if>
- <s:else>
- <s:set var="maxTags" value="#session.BowSession.preference.tags" />
- </s:else>
- <s:iterator value="%{#request.bookmarkActions.tagsCloud}" status="tag" begin="0" end="%{#maxTags - 1}">
- <s:url var="search" action="search" escapeAmp="true">
- <s:param name="addTag"><s:property value="topicName" /></s:param>
- <s:if test="%{request.searchLine != null}">
- <s:param name="searchLine">&searchLine=<s:property value="%{request.searchLine}" /></s:param>
- </s:if>
- </s:url>
- <!-- -->
- <s:a href="%{search}" title="%{count} results" cssClass="tag" cssStyle="font-size: %{#request.bookmarkActions.getFont(count)}px"><s:property value="topicName" /></s:a>
+ <s:iterator value="%{searchResult.tagsCloud}" status="tagStatus" var="tag">
+ <s:url var="search" action="home" escapeAmp="true">
+ <s:param name="searchLine" value="%{searchLine}"/>
+ <s:param name="addTag" value="%{#tag.topicName}"/>
+ <s:param name="fullTextLine" value="%{fullTextLine}"/>
+ </s:url>
+ <!-- -->
+ <s:a href="%{search}" title="%{#tag.count} results" cssClass="tag" cssStyle="font-size: %{searchResult.getFont(#tag.count)}px"><s:property value="%{#tag.topicName}" /></s:a>
</s:iterator>
- </s:if>
</div>
\ No newline at end of file
Modified: trunk/bow-ui/src/main/webapp/jsp/preferences.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/preferences.jsp 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/webapp/jsp/preferences.jsp 2011-08-16 18:19:34 UTC (rev 304)
@@ -104,6 +104,7 @@
<s:text name="bow.preferences.confirmNewPassword"/><br/>
<s:password name="confirmNewPassword"
labelposition="top"/><br/>
+ <s:hidden name="update" value="user"/>
<s:submit key="bow.preferences.submit" name="submit"/>
</s:form>
</div>
@@ -126,7 +127,7 @@
size="50"
labelposition="top"/><br/>
- <s:hidden name="update" value="1"/>
+ <s:hidden name="update" value="site"/>
<s:submit key="bow.preferences.submit" name="submit"/>
</s:form>
</div>
Deleted: trunk/bow-ui/src/main/webapp/jsp/search.jsp
===================================================================
--- trunk/bow-ui/src/main/webapp/jsp/search.jsp 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/bow-ui/src/main/webapp/jsp/search.jsp 2011-08-16 18:19:34 UTC (rev 304)
@@ -1,99 +0,0 @@
-<!--
- #%L
- bow
-
- $Id$
- $HeadURL$
- %%
- Copyright (C) 2010 CodeLutin
- %%
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- #L%
- -->
-<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-<%@taglib prefix="s" uri="/struts-tags" %>
-<%@page import="org.chorem.bow.BowBookmark" %>
-<%@page import="org.chorem.bow.BookmarkActions" %>
-<%@page import="java.text.SimpleDateFormat" %>
-<%@page import="java.util.List" %>
-<%
-BookmarkActions bookmarkActions = (BookmarkActions) request.getAttribute("bookmarkActions");
-
-if (bookmarkActions != null) {
-%>
-
-
-<html xmlns="http://www.w3.org/1999/xhtml"
- xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
- xmlns:jsp="http://java.sun.com/JSP/Page">
-
- <s:set var="searchLine" value="%{#request.bookmarkActions.getSearchLine()}" />
- <s:set var="fullText" value="%{#request.bookmarkActions.getFullTextLine()}" />
-
- <head>
- <title><s:text name="bow.search.title" /></title>
- <s:url var="css" value="/css/bookmark.css" />
- <link href="${css}" rel="stylesheet" type="text/css" />
- <s:head />
- </head>
- <body>
- <div class="menu clearfix">
- <h2><s:text name="bow.search.title" /></h2>
- <s:form action="order">
- <p>
- <label for="type"><s:text name="bow.search.orderby" /></label>
- <select id="type" name="type">
- <option value="ascName"><s:text name="bow.search.ascname" /></option>
- <option value="descName"><s:text name="bow.search.descname" /></option>
- <option value="ascClick"><s:text name="bow.search.ascclick" /></option>
- <option value="descClick"><s:text name="bow.search.descclick" /></option>
- <option value="ascDate"><s:text name="bow.search.ascdate" /></option>
- <option value="descDate"><s:text name="bow.search.descdate" /></option>
- </select>
- <s:submit key="bow.search.submit" name="submit" />
- <s:set name="bookmarksToDelete" value="%{#request.bookmarkActions.getBookmarks().size()}" />
- <s:if test="%{#bookmarksToDelete > 0}">
- <s:url var="deleteSearchResults" action="deleteSearchResults" escapeAmp="false">
- <s:param name="searchLine"><s:property value="%{#searchLine}" /></s:param>
- <s:param name="fullTextLine"><s:property value="%{#fullText}" /></s:param>
- </s:url>
- <s:a id="deleteSearchResultsButton" href="" onclick="deleteConfirmation('%{deleteSearchResults}', %{#bookmarksToDelete}); return(false);"></s:a>
- </s:if>
- <s:hidden name="searchLine" value="%{#searchLine}" />
- <s:hidden name="fullTextLine" value="%{#fullText}" />
- </p>
- </s:form>
- </div>
- <div class="content">
- <%
- List<BowBookmark> bookmarkList = bookmarkActions.getBookmarks();
-
- if (!bookmarkList.isEmpty()) {
- for (BowBookmark bookmark : bookmarkList) {
- request.setAttribute("bookmark", bookmark);
- %>
- <jsp:include page="inc/bookmark.jsp" flush="true">
- <jsp:param name="searchLine" value="%{#searchLine}" />
- <jsp:param name="fullTextLine" value="%{#fullText}" />
- </jsp:include>
- <%
- }
- } else { %>
- <p class="nobookmarks"><s:text name="bow.bookmarks.noBookmarks" /></p>
- <%
- } %>
- </div>
- </body>
-</html>
-<% } %>
Modified: trunk/bow-ui/src/main/xmi/bow.zargo
===================================================================
(Binary files differ)
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2011-08-13 01:00:21 UTC (rev 303)
+++ trunk/pom.xml 2011-08-16 18:19:34 UTC (rev 304)
@@ -121,8 +121,9 @@
<eugenePluginVersion>2.3.2</eugenePluginVersion>
<nuitonUtilsVersion>2.1.2</nuitonUtilsVersion>
+ <nuitonWebVersion>1.3</nuitonWebVersion>
<nuitonI18nVersion>2.3.1</nuitonI18nVersion>
- <wikittyVersion>3.1.2</wikittyVersion>
+ <wikittyVersion>3.2-SNAPSHOT</wikittyVersion>
<slf4jVersion>1.6.1</slf4jVersion>
<struts2Version>2.2.3</struts2Version>
<htmlParserVersion>1.6</htmlParserVersion>
@@ -148,6 +149,12 @@
</dependency>
<dependency>
+ <groupId>org.nuiton.web</groupId>
+ <artifactId>nuiton-struts2</artifactId>
+ <version>${nuitonWebVersion}</version>
+ </dependency>
+
+ <dependency>
<groupId>org.nuiton.i18n</groupId>
<artifactId>nuiton-i18n</artifactId>
<version>${nuitonI18nVersion}</version>
Added: trunk/src/site/rst/developper/bow-model.rst
===================================================================
--- trunk/src/site/rst/developper/bow-model.rst (rev 0)
+++ trunk/src/site/rst/developper/bow-model.rst 2011-08-16 18:19:34 UTC (rev 304)
@@ -0,0 +1,38 @@
+================================
+Explication du modèle de données
+================================
+
+BowUser
+=======
+
+BowUser depend de WikittyUser et ajoute le permanentToken de l'utilisateur.
+Le permanentToken sert à authentifier l'utilisateur sans sont login/password.
+Cela est utile pour la bookmarklet qui permet d'ajouter des entrées.
+
+BowPreference
+=============
+BowPreference depend BowUser et sert à conserver toutes les préférences
+utilisateurs
+
+BowBookmark
+===========
+
+BowBookmark est une entrée à conserver, elle contient l'URL, la description,
+la date d'ajout, le nombre de click, et les alias public et privé.
+BowBookmark depend de WikittyLabel pour pouvoir ajouter des labels sur les
+BowBookmark.
+
+BowImport
+=========
+
+BowImport est une extension que l'on ajoute a un BowBookmark pour montrer que
+ce bookmark à été importé, on peut retrouver tous les bookmarks importer en
+meme temps en recherchant ceux qui ont la meme date.
+
+WikittyAuthorisation
+====================
+
+On utilise WikittyAuthorisation pour partager les BowBookmarks. S'il ont veut
+partager avec quelqu'un un BowBookmark, on ajoute a ce bookmark l'extension
+WikittyAuthorisation et on mes l'id du user dans reader ou writer si l'on veut
+que l'utilisateur puisse seulement utiliser le lien ou aussi le modifier.
1
0