/*
* Copyright (C) 2003-2008 eXo Platform SAS.
*
* 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 General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.faq.service.impl;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.Session;
import org.exoplatform.container.component.ComponentPlugin;
import org.exoplatform.container.configuration.ConfigurationManager;
import org.exoplatform.container.xml.InitParams;
import org.exoplatform.faq.service.Answer;
import org.exoplatform.faq.service.Cate;
import org.exoplatform.faq.service.Category;
import org.exoplatform.faq.service.CategoryInfo;
import org.exoplatform.faq.service.Comment;
import org.exoplatform.faq.service.FAQEventQuery;
import org.exoplatform.faq.service.FAQService;
import org.exoplatform.faq.service.FAQSetting;
import org.exoplatform.faq.service.FileAttachment;
import org.exoplatform.faq.service.InitialDataPlugin;
import org.exoplatform.faq.service.JCRPageList;
import org.exoplatform.faq.service.ObjectSearchResult;
import org.exoplatform.faq.service.Question;
import org.exoplatform.faq.service.QuestionLanguage;
import org.exoplatform.faq.service.QuestionPageList;
import org.exoplatform.faq.service.TemplatePlugin;
import org.exoplatform.faq.service.Utils;
import org.exoplatform.faq.service.Watch;
import org.exoplatform.ks.bbcode.core.BBCodeServiceImpl;
import org.exoplatform.ks.common.NotifyInfo;
import org.exoplatform.ks.common.jcr.KSDataLocation;
import org.exoplatform.management.annotations.ManagedBy;
import org.exoplatform.services.jcr.ext.common.SessionProvider;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.mail.Message;
import org.picocontainer.Startable;
import com.arjuna.ats.internal.jdbc.drivers.modifiers.list;
/**
* Created by The eXo Platform SARL
* Author : Hung Nguyen Quang
* hung.nguyen@exoplatform.com
* Mar 04, 2008
*/
@ManagedBy(FAQServiceManaged.class)
public class FAQServiceImpl implements FAQService, Startable {
public static final int CATEGORY = 1;
public static final int QUESTION = 2;
public static final int SEND_EMAIL = 1;
private JCRDataStorage jcrData_;
private MultiLanguages multiLanguages_;
private BBCodeServiceImpl bbcodeObject_;
private TemplatePlugin template_;
private ConfigurationManager configManager_;
// private EmailNotifyPlugin emailPlugin_ ;
private Collection<InitialDataPlugin> initDataPlugins;
private KSDataLocation locator;
FAQServiceManaged managed; // will be automatically set at @ManagedBy processing
private static Log log = ExoLogger.getLogger(FAQServiceImpl.class);
protected List<AnswerEventListener> listeners_ = new ArrayList<AnswerEventListener>(3);
public FAQServiceImpl(InitParams params, KSDataLocation locator, ConfigurationManager configManager) throws Exception {
configManager_ = configManager;
multiLanguages_ = new MultiLanguages();
initDataPlugins = new ArrayList<InitialDataPlugin>();
this.locator = locator;
jcrData_ = new JCRDataStorage(locator);
bbcodeObject_ = new BBCodeServiceImpl();
}
public void addPlugin(ComponentPlugin plugin) throws Exception {
jcrData_.addPlugin(plugin);
}
public void addRolePlugin(ComponentPlugin plugin) throws Exception {
jcrData_.addRolePlugin(plugin);
}
public void addInitialDataPlugin(InitialDataPlugin plugin) throws Exception {
initDataPlugins.add(plugin);
}
public void addTemplatePlugin(ComponentPlugin plugin) throws Exception {
if (plugin instanceof TemplatePlugin)
template_ = (TemplatePlugin) plugin;
}
public void start() {
log.info("initializing FAQ default data...");
try {
jcrData_.initRootCategory();
} catch (Exception e) {
throw new RuntimeException("Error while initializing the root category", e);
}
for (InitialDataPlugin plugin : initDataPlugins) {
try {
if (plugin.importData(this, configManager_)) {
log.info("imported plugin " + plugin);
}
} catch (Exception e) {
log.error("Error while initializing Data plugin " + plugin.getName(), e);
}
}
try {
log.info("initializing FAQ template...");
initViewerTemplate();
} catch (Exception e) {
log.error("Error while initializing FAQ template", e);
}
// management views
/*try {
log.info("initializing management view...");
// Note: call FAQServiceManaged to register mgmt beans
} catch (Exception e) {
log.error("Error while initializing Management view: " + e.getMessage());
}*/
try {
log.info("initializing Question Node listeners...");
jcrData_.reInitQuestionNodeListeners();
} catch (Exception e) {
log.error("Error while initializing Question Node listeners", e);
}
}
public void stop() {
}
@SuppressWarnings("deprecation")
private void initViewerTemplate() throws Exception {
if (template_ == null) {
log.warn("No default template was configured for FAQ.");
return;
}
SessionProvider provider = SessionProvider.createSystemProvider();
try {
if (!locator.getSessionManager().getSession(provider).getRootNode().hasNode(locator.getFaqTemplatesLocation() + "/" + Utils.UI_FAQ_VIEWER)) {
InputStream in = configManager_.getInputStream(template_.getPath());
byte[] data = new byte[in.available()];
in.read(data);
saveTemplate(new String(data));
}
} finally {
provider.close();
}
configManager_ = null;
template_ = null;
}
/**
* This method get all admin in FAQ
* @return userName list
* @throws Exception the exception
*/
public List<String> getAllFAQAdmin() throws Exception {
return jcrData_.getAllFAQAdmin();
}
/**
* This method get all the category
* @param sProvider is session provider
* @return Category list
* @throws Exception the exception
*/
public List<Category> getAllCategories(SessionProvider sProvider) throws Exception {
sProvider.close();
return getAllCategories();
}
public List<Category> getAllCategories() throws Exception {
return jcrData_.getAllCategories();
}
/**
* This method get all the question
* and convert to list of question object (QuestionPageList)
* @param sProvider
* @return QuestionPageList
* @throws Exception the exception
*/
public QuestionPageList getAllQuestions(SessionProvider sProvider) throws Exception {
sProvider.close();
return getAllQuestions();
}
public QuestionPageList getAllQuestions() throws Exception {
return jcrData_.getAllQuestions();
}
/**
* This method get all question node have not yet answer
* and convert to list of question object (QuestionPageList)
* @param sProvider
* @return QuestionPageList
* @throws Exception the exception
*/
public QuestionPageList getQuestionsNotYetAnswer(SessionProvider sProvider, String categoryId, FAQSetting setting) throws Exception {
sProvider.close();
if (setting.getDisplayMode().equals("Approved"))
return getQuestionsNotYetAnswer(categoryId, true);
return getQuestionsNotYetAnswer(categoryId, false);
}
public QuestionPageList getQuestionsNotYetAnswer(String categoryId, boolean isApproved) throws Exception {
return jcrData_.getQuestionsNotYetAnswer(categoryId, isApproved);
}
/**
*This method get some informations of category:
*to count sub-categories, to count questions, to count question have not yet answer,
*to count question is not approved are contained in this category
*
* @param categoryId
* @param sProvider
* @return number of (sub-categories, questions, questions is not approved,question is have not yet answered)
* @throws Exception the exception
*/
public long[] getCategoryInfo(String categoryId, SessionProvider sProvider, FAQSetting setting) throws Exception {
sProvider.close();
return getCategoryInfo(categoryId, setting);
}
public long[] getCategoryInfo(String categoryId, FAQSetting setting) throws Exception {
return jcrData_.getCategoryInfo(categoryId, setting);
}
/**
* Returns an category that can then be get property of this category.
* <p>
*
* @param categoryId is address id of the category so you want get
* @param sProvider
* @return category is id equal categoryId
* @see current category
* @throws Exception the exception
*/
public Category getCategoryById(String categoryId, SessionProvider sProvider) throws Exception {
sProvider.close();
return getCategoryById(categoryId);
}
public Category getCategoryById(String categoryId) throws Exception {
return jcrData_.getCategoryById(categoryId);
}
/**
* This method should get question node via identify
* @param question identify
* @param sProvider
* @return Question
* @throws Exception the exception
*/
public Question getQuestionById(String questionId, SessionProvider sProvider) throws Exception {
sProvider.close();
return getQuestionById(questionId);
}
public Comment[] getComments(String questionId) throws Exception {
return jcrData_.getComments(questionId);
}
public Question getQuestionById(String questionId) throws Exception {
return jcrData_.getQuestionById(questionId);
}
/**
* This method should view questions, only question node is activated and approved via category identify
* and convert to list of question object
*
* @param Category identify
* @param sProvider
* @return QuestionPageList
* @throws Exception the exception
*/
public QuestionPageList getQuestionsByCatetory(String categoryId, SessionProvider sProvider, FAQSetting faqSetting) throws Exception {
sProvider.close();
return getQuestionsByCatetory(categoryId, faqSetting);
}
public QuestionPageList getQuestionsByCatetory(String categoryId, FAQSetting faqSetting) throws Exception {
return jcrData_.getQuestionsByCatetory(categoryId, faqSetting);
}
/**
* This method get all questions via category identify and convert to list of question list
*
* @param Category identify
* @param sProvider
* @return QuestionPageList
* @throws Exception the exception
*/
public QuestionPageList getAllQuestionsByCatetory(String categoryId, SessionProvider sProvider, FAQSetting faqSetting) throws Exception {
sProvider.close();
return getAllQuestionsByCatetory(categoryId, faqSetting);
}
public QuestionPageList getAllQuestionsByCatetory(String categoryId, FAQSetting faqSetting) throws Exception {
return jcrData_.getAllQuestionsByCatetory(categoryId, faqSetting);
}
/**
* This method every category should get list question, all question convert to list of question object
* @param listCategoryId is list via identify
* @param isNotYetAnswer if isNotYetAnswer equal true then return list question is not yet answer
* isNotYetAnswer if isNotYetAnswer equal false then return list all questions
* @param sProvider
* @return QuestionPageList
* @throws Exception the exception
*/
public QuestionPageList getQuestionsByListCatetory(List<String> listCategoryId, boolean isNotYetAnswer, SessionProvider sProvider) throws Exception {
sProvider.close();
return getQuestionsByListCatetory(listCategoryId, isNotYetAnswer);
}
public QuestionPageList getQuestionsByListCatetory(List<String> listCategoryId, boolean isNotYetAnswer) throws Exception {
return jcrData_.getQuestionsByListCatetory(listCategoryId, isNotYetAnswer);
}
public String getCategoryPathOfQuestion(String questionPath, SessionProvider sProvider) throws Exception {
sProvider.close();
return getCategoryPathOfQuestion(questionPath);
}
public String getCategoryPathOfQuestion(String questionPath) throws Exception {
return jcrData_.getCategoryPathOfQuestion(questionPath);
}
/**
* This method should lookup languageNode of question
* and find all child node of language node
*
* @param Question identify
* @param sProvider
* @return language list
* @throws Exception the exception
*/
public List<QuestionLanguage> getQuestionLanguages(String questionId, SessionProvider sProvider) throws Exception {
sProvider.close();
return getQuestionLanguages(questionId);
}
public List<QuestionLanguage> getQuestionLanguages(String questionId) throws Exception {
return jcrData_.getQuestionLanguages(questionId);
}
/**
* This method should lookup languageNode of question
* so find child node of language node is searched
* and find properties of child node, if contain input of user, get this question
*
* @param Question list
* @param langage want search
* @param term content want search in all field question
* @param sProvider
* @return Question list
* @throws Exception the exception
*/
/*
* public List<Question> searchQuestionByLangageOfText(List<Question> listQuestion, String languageSearch, String text, SessionProvider sProvider) throws Exception { sProvider.close() ; return searchQuestionByLangageOfText(listQuestion, languageSearch, text) ; } public List<Question> searchQuestionByLangageOfText(List<Question> listQuestion, String languageSearch, String text) throws Exception {
* return jcrData_.searchQuestionByLangageOfText(listQuestion, languageSearch, text) ; }
*/
/**
* This method should lookup languageNode of question
* so find child node of language node is searched
* and find properties of child node, if contain input of user, get this question
*
* @param Question list
* @param langage want search
* @param question's content want search
* @param response's content want search
* @param sProvider
* @return Question list
* @throws Exception the exception
*/
/*
* public List<Question> searchQuestionByLangage(List<Question> listQuestion, String languageSearch, String questionSearch, String responseSearch, SessionProvider sProvider) throws Exception { sProvider.close() ; return searchQuestionByLangage(listQuestion, languageSearch, questionSearch, responseSearch) ; } public List<Question> searchQuestionByLangage(List<Question> listQuestion, String
* languageSearch, String questionSearch, String responseSearch) throws Exception { return jcrData_.searchQuestionByLangage(listQuestion, languageSearch, questionSearch, responseSearch) ; }
*/
/**
* Returns an list category that can then be view on the screen.
* <p>
* This method always returns immediately, this view list category in screen.
* if categoryId equal null then list category is list parent category
* else this view list category of one value parent category that you communicate categoryId
*
* @param categoryId is address id of the category
* @param sProvider
* @return List parent category or list sub category
* @see list category
* @throws Exception the exception
*/
public List<Category> getSubCategories(String categoryId, SessionProvider sProvider, FAQSetting faqSetting, boolean isGetAll, List<String> userView) throws Exception {
sProvider.close();
return getSubCategories(categoryId, faqSetting, isGetAll, userView);
}
public List<Category> getSubCategories(String categoryId, FAQSetting faqSetting, boolean isGetAll, List<String> userView) throws Exception {
return jcrData_.getSubCategories(categoryId, faqSetting, isGetAll, userView);
}
/**
* This method should lookup questions via question identify and from category identify
* so lookup destination category and move questions to destination category
*
* @param Question identify list
* @param destination category identify
* @param sProvider
* @throws Exception the exception
*/
public void moveQuestions(List<String> questions, String destCategoryId, SessionProvider sProvider) throws Exception {
sProvider.close();
this.moveQuestions(questions, destCategoryId, "", new FAQSetting());
}
public void moveQuestions(List<String> questions, String destCategoryId, String questionLink, FAQSetting faqSetting) throws Exception {
jcrData_.moveQuestions(questions, destCategoryId, questionLink, faqSetting);
}
/**
* Remove one category in list
* <p>
* This function is used to remove one category in list
*
* @param categoryId is address id of the category need remove
* @param sProvider
* @throws Exception the exception
*/
public void removeCategory(String categoryId, SessionProvider sProvider) throws Exception {
sProvider.close();
removeCategory(categoryId);
}
public void removeCategory(String categoryId) throws Exception {
jcrData_.removeCategory(categoryId);
}
/**
* Remove one question in list
* <p>
* This function is used to remove one question in list
*
* @param question identify
* @param sProvider
* @throws Exception the exception
*/
public void removeQuestion(String questionId, SessionProvider sProvider) throws Exception {
sProvider.close();
removeQuestion(questionId);
}
public void removeQuestion(String questionId) throws Exception {
jcrData_.removeQuestion(questionId);
}
/**
* Add new or edit category in list.
* <p>
* This function is used to add new or edit category in list. User will input information of fields need
* in form add category, so user save then category will persistent in data
*
* @param parentId is address id of the category parent where user want add sub category
* when paretId equal null so this category is parent category else sub category
* @param cat is properties that user input to interface will save on data
* @param isAddNew is true when add new category else update category
* @param sProvider
* @return List parent category or list sub category
* @see list category
* @throws Exception the exception
*/
public void saveCategory(String parentId, Category cat, boolean isAddNew, SessionProvider sProvider) throws Exception {
sProvider.close();
saveCategory(parentId, cat, isAddNew);
}
public void saveCategory(String parentId, Category cat, boolean isAddNew) throws Exception {
jcrData_.saveCategory(parentId, cat, isAddNew);
}
public void changeStatusCategoryView(List<String> listCateIds, SessionProvider sProvider) throws Exception {
sProvider.close();
changeStatusCategoryView(listCateIds);
}
public void changeStatusCategoryView(List<String> listCateIds) throws Exception {
jcrData_.changeStatusCategoryView(listCateIds);
}
/**
* This method should create new question or update exists question
* @param question is information but user input or edit to form interface of question
* @param isAddNew equal true then add new question
* isAddNew equal false then update question
* @param sProvider
*/
public Node saveQuestion(Question question, boolean isAddNew, SessionProvider sProvider, FAQSetting faqSetting) throws Exception {
sProvider.close();
return saveQuestion(question, isAddNew, faqSetting);
}
public Node saveQuestion(Question question, boolean isAddNew, FAQSetting faqSetting) throws Exception {
Node questionNode = jcrData_.saveQuestion(question, isAddNew, faqSetting);
SessionProvider provider = SessionProvider.createSystemProvider();
try {
questionNode = (Node)locator.getSessionManager().getSession(provider).getItem(questionNode.getPath());
for (QuestionLanguage lang : question.getMultiLanguages()) {
if (lang.getState().equals(QuestionLanguage.ADD_NEW) || lang.getState().equals(QuestionLanguage.EDIT)) {
MultiLanguages.addLanguage(questionNode, lang);
} else if (lang.getState().equals(QuestionLanguage.DELETE)) {
MultiLanguages.removeLanguage(questionNode, lang);
}
}
for (AnswerEventListener ae : listeners_) {
ae.saveQuestion(question, isAddNew);
}
} finally {
provider.close();
}
return questionNode;
}
/**
* This function is used to set some properties of FAQ.
* <p>
* This function is used(Users of FAQ Administrator) choose some properties in object FAQSetting
*
* @param newSetting is properties of object FAQSetting that user input to interface will save on data
* @param sProvider
* @return all value depend FAQSetting will configuration follow properties but user choose
* @throws Exception the exception
*/
public void saveFAQSetting(FAQSetting faqSetting, String userName, SessionProvider sProvider) throws Exception {
sProvider.close();
saveFAQSetting(faqSetting, userName);
}
public void saveFAQSetting(FAQSetting faqSetting, String userName) throws Exception {
jcrData_.saveFAQSetting(faqSetting, userName);
}
/**
* Move one category in list to another plate in project.
* <p>
* This function is used to move category in list. User will right click on category need
* move, so user choose in list category one another category want to put
*
* @param categoryId is address id of the category that user want plate
* @param destCategoryId is address id of the category that user want put( destination )
* @param sProvider
* @return category will put new plate
* @see no see category this plate but user see that category at new plate
* @throws Exception the exception
*/
public void moveCategory(String categoryId, String destCategoryId, SessionProvider sProvider) throws Exception {
sProvider.close();
moveCategory(categoryId, destCategoryId);
}
public void moveCategory(String categoryId, String destCategoryId) throws Exception {
jcrData_.moveCategory(categoryId, destCategoryId);
}
/**
* This function is used to allow user can watch a category.
* You have to register your email for whenever there is new question is inserted
* in the category or new category then there will a notification sent to you.
*
* @param id of category with user want add watch on that category
* @param value, this address email (multiple value) with input to interface will save on data
* @param sProvider
* @throws Exception the exception
*
*/
public void addWatch(String id, Watch watch, SessionProvider sProvider) throws Exception {
sProvider.close();
addWatchCategory(id, watch);
}
public void addWatchCategory(String id, Watch watch) throws Exception {
jcrData_.addWatchCategory(id, watch);
}
/**
* This method will get list mail of one category. User see list this mails and
* edit or delete mail if need
*
* @param CategoryId is id of category
* @param sProvider
* @return list email of current category
* @see list email where user manager
* @throws Exception the exception
*/
/*
* public QuestionPageList getListMailInWatch(String categoryId, SessionProvider sProvider) throws Exception { sProvider.close() ; return getListMailInWatch(categoryId); } public QuestionPageList getListMailInWatch(String categoryId) throws Exception { return jcrData_.getListMailInWatch(categoryId); }
*/
/**
* This function will delete watch in one category
*
* @param categoryId is id of current category
* @param sProvider
* @param emails is location current of one watch with user want delete
* @throws Exception the exception
*/
public void deleteMailInWatch(String categoryId, SessionProvider sProvider, String user) throws Exception {
sProvider.close();
deleteCategoryWatch(categoryId, user);
}
public void deleteCategoryWatch(String categoryId, String user) throws Exception {
jcrData_.deleteCategoryWatch(categoryId, user);
}
/**
* This function will un watch in one category
*
* @param categoryId is id of current category
* @param sProvider
* @param emails is location current of one watch with user want delete
* @throws Exception the exception
*/
public void UnWatch(String categoryId, SessionProvider sProvider, String userCurrent) throws Exception {
sProvider.close();
unWatchCategory(categoryId, userCurrent);
}
public void unWatchCategory(String categoryId, String userCurrent) throws Exception {
jcrData_.unWatchCategory(categoryId, userCurrent);
}
/**
* This function will un watch in one category
*
* @param categoryId is id of current category
* @param sProvider
* @param emails is location current of one watch with user want delete
* @throws Exception the exception
*/
public void UnWatchQuestion(String questionID, SessionProvider sProvider, String userCurrent) throws Exception {
sProvider.close();
unWatchQuestion(questionID, userCurrent);
}
public void unWatchQuestion(String questionID, String userCurrent) throws Exception {
jcrData_.unWatchQuestion(questionID, userCurrent);
}
/**
* This method should lookup all the categories node
* so find category have user in moderators
* and convert to category object and return list of category object
*
* @param user is name when user login
* @param sProvider
* @return Category list
* @throws Exception the exception
*/
public List<String> getListCateIdByModerator(String user, SessionProvider sProvider) throws Exception {
sProvider.close();
return getListCateIdByModerator(user);
}
public List<String> getListCateIdByModerator(String user) throws Exception {
return jcrData_.getListCateIdByModerator(user);
}
/**
* This method will return list question when user input value search
* <p>
* With many questions , it's difficult to find a question which user want to see.
* So to support to users can find their questions more quickly and accurate,
* user can use 'Search Question' function
*
* @param sProvider
* @param eventQuery is object save value in form advanced search
* @throws Exception the exception
*/
/*
* public List<Question> getAdvancedSearchQuestion(SessionProvider sProvider, FAQEventQuery eventQuery) throws Exception { public List<ObjectSearchResult> getSearchResults(SessionProvider sProvider, FAQEventQuery eventQuery) throws Exception { sProvider.close() ; return getSearchResults(eventQuery) ; } public List<ObjectSearchResult> getSearchResults(FAQEventQuery eventQuery) throws Exception {
* return jcrData_.getSearchResults(eventQuery) ; }
*/
public List<ObjectSearchResult> getSearchResults(FAQEventQuery eventQuery) throws Exception {
return jcrData_.getSearchResults(eventQuery);
}
/**
* This method will return list question when user input value search
* <p>
* With many questions , it's difficult to find a question which user want to see.
* So to support to users can find their questions more quickly and accurate,
* user can use 'Search Question' function
*
* @param sProvider
* @param eventQuery is object save value in form advanced search
* @throws Exception the exception
*/
/*
* public List<Question> searchQuestionWithNameAttach(SessionProvider sProvider, FAQEventQuery eventQuery) throws Exception { sProvider.close() ; return searchQuestionWithNameAttach(eventQuery) ; } public List<Question> searchQuestionWithNameAttach(FAQEventQuery eventQuery) throws Exception { return jcrData_.searchQuestionWithNameAttach(eventQuery) ; }
*/
/**
* This method return path of category identify
* @param category identify
* @param sProvider
* @return list category name is sort(path of this category)
* @throws Exception the exception
*/
public List<String> getCategoryPath(SessionProvider sProvider, String categoryId) throws Exception {
sProvider.close();
return getCategoryPath(categoryId);
}
public List<String> getCategoryPath(String categoryId) throws Exception {
return jcrData_.getCategoryPath(categoryId);
}
/**
* This function will send message to address but you want send
*
* @param message is object save content with user want send to one or many address email
* @throws Exception the exception
*/
public void sendMessage(Message message) throws Exception {
jcrData_.sendMessage(message);
}
/**
* This function will send all the pending notification message
*
* @param
* @throws Exception the exception
*/
public Iterator<NotifyInfo> getPendingMessages() throws Exception {
return jcrData_.getPendingMessages();
}
/**
* Adds the language node, when question have multiple language,
* each language is a child node of question node.
*
* @param questionNode the question node which have multiple language
* @param language the language which is added in to questionNode
* @throws Exception throw an exception when save a new language node
*/
public void addLanguage(Node questionNode, QuestionLanguage language) throws Exception {
multiLanguages_.addLanguage(questionNode, language);
}
public void getUserSetting(SessionProvider sProvider, String userName, FAQSetting faqSetting) throws Exception {
sProvider.close();
getUserSetting(userName, faqSetting);
}
public void getUserSetting(String userName, FAQSetting faqSetting) throws Exception {
jcrData_.getUserSetting(userName, faqSetting);
}
public NotifyInfo getMessageInfo(String name) throws Exception {
return jcrData_.getMessageInfo(name);
}
public boolean isAdminRole(String userName, SessionProvider sProvider) throws Exception {
sProvider.close();
return isAdminRole(userName);
}
public boolean isAdminRole(String userName) throws Exception {
return jcrData_.isAdminRole(userName);
}
public Node getCategoryNodeById(String categoryId, SessionProvider sProvider) throws Exception {
sProvider.close();
return getCategoryNodeById(categoryId);
}
public Node getCategoryNodeById(String categoryId) throws Exception {
return jcrData_.getCategoryNodeById(categoryId);
}
public void addWatchQuestion(String questionId, Watch watch, boolean isNew, SessionProvider sProvider) throws Exception {
sProvider.close();
addWatchQuestion(questionId, watch, isNew);
}
public void addWatchQuestion(String questionId, Watch watch, boolean isNew) throws Exception {
jcrData_.addWatchQuestion(questionId, watch, isNew);
}
/*
* public QuestionPageList getListMailInWatchQuestion(String questionId, SessionProvider sProvider) throws Exception { sProvider.close() ; return getListMailInWatchQuestion(questionId); } public QuestionPageList getListMailInWatchQuestion(String questionId) throws Exception { return jcrData_.getListMailInWatchQuestion(questionId); }
*/
public QuestionPageList getListQuestionsWatch(FAQSetting faqSetting, String currentUser, SessionProvider sProvider) throws Exception {
sProvider.close();
return getListQuestionsWatch(faqSetting, currentUser);
}
public QuestionPageList getListQuestionsWatch(FAQSetting faqSetting, String currentUser) throws Exception {
return jcrData_.getListQuestionsWatch(faqSetting, currentUser);
}
/*
* public List<String> getListPathQuestionByCategory(String categoryId, SessionProvider sProvider) throws Exception{ sProvider.close() ; return getListPathQuestionByCategory(categoryId); } public List<String> getListPathQuestionByCategory(String categoryId) throws Exception{ return jcrData_.getListPathQuestionByCategory(categoryId); }
*/
public void importData(String categoryId, Session session, InputStream inputStream, boolean isZip, SessionProvider sProvider) throws Exception {
sProvider.close();
importData(categoryId, inputStream, isZip);
}
public boolean importData(String categoryId, InputStream inputStream, boolean isZip) throws Exception {
return jcrData_.importData(categoryId, inputStream, isZip);
}
public InputStream exportData(String categoryId, boolean createZipFile) throws Exception {
return jcrData_.exportData(categoryId, createZipFile);
}
/*
* public boolean categoryAlreadyExist(String categoryId, SessionProvider sProvider) throws Exception { sProvider.close() ; return categoryAlreadyExist(categoryId); } public boolean categoryAlreadyExist(String categoryId) throws Exception { return jcrData_.categoryAlreadyExist(categoryId); }
*/
public void swapCategories(String parentCateId, String cateId1, String cateId2, SessionProvider sProvider) throws Exception {
sProvider.close();
swapCategories(cateId1, cateId2);
}
public void swapCategories(String cateId1, String cateId2) throws Exception {
jcrData_.swapCategories(cateId1, cateId2);
}
/*
* public Node getQuestionNodeById(String questionId, SessionProvider sProvider) throws Exception{ sProvider.close() ; return getQuestionNodeById(questionId); } public Node getQuestionNodeById(String questionId) throws Exception{ return jcrData_.getQuestionNodeById(questionId); }
*/
public void saveTopicIdDiscussQuestion(String questionId, String pathDiscuss, SessionProvider sProvider) throws Exception {
sProvider.close();
saveTopicIdDiscussQuestion(questionId, pathDiscuss);
}
public void saveTopicIdDiscussQuestion(String questionId, String pathDiscuss) throws Exception {
jcrData_.saveTopicIdDiscussQuestion(questionId, pathDiscuss);
}
public long getMaxindexCategory(String parentId, SessionProvider sProvider) throws Exception {
sProvider.close();
return getMaxindexCategory(parentId);
}
public long getMaxindexCategory(String parentId) throws Exception {
return jcrData_.getMaxindexCategory(parentId);
}
public void deleteAnswer(String questionId, String answerId, SessionProvider sProvider) throws Exception {
sProvider.close();
deleteAnswer(questionId, answerId);
}
public void deleteAnswer(String questionId, String answerId) throws Exception {
jcrData_.deleteAnswer(questionId, answerId);
}
public void deleteComment(String questionId, String commentId, SessionProvider sProvider) throws Exception {
sProvider.close();
deleteComment(questionId, commentId);
}
public void deleteComment(String questionId, String commentId) throws Exception {
jcrData_.deleteComment(questionId, commentId);
}
public void saveAnswer(String questionId, Answer answer, boolean isNew, SessionProvider sProvider) throws Exception {
sProvider.close();
saveAnswer(questionId, answer, isNew);
}
public void saveAnswer(String questionId, Answer answer, boolean isNew) throws Exception {
jcrData_.saveAnswer(questionId, answer, isNew);
for (AnswerEventListener ae : listeners_) {
ae.saveAnswer(questionId, answer, isNew);
}
}
public void saveComment(String questionId, Comment comment, boolean isNew, SessionProvider sProvider) throws Exception {
sProvider.close();
saveComment(questionId, comment, isNew);
}
public void saveComment(String questionId, Comment comment, boolean isNew) throws Exception {
jcrData_.saveComment(questionId, comment, isNew);
for (AnswerEventListener ae : listeners_) {
ae.saveComment(questionId, comment, isNew);
}
}
public Comment getCommentById(SessionProvider sProvider, String questionId, String commentId) throws Exception {
sProvider.close();
return getCommentById(questionId, commentId);
}
public Comment getCommentById(String questionId, String commentId) throws Exception {
return jcrData_.getCommentById(questionId, commentId);
}
public Answer getAnswerById(String questionId, String answerid, SessionProvider sProvider) throws Exception {
sProvider.close();
return getAnswerById(questionId, answerid);
}
public Answer getAnswerById(String questionId, String answerid) throws Exception {
return jcrData_.getAnswerById(questionId, answerid);
}
/**
* @deprecated use {@link #saveAnswer(String questionId, Answer[] answers)}
*/
public void saveAnswer(String questionId, Answer[] answers, SessionProvider sProvider) throws Exception {
sProvider.close();
saveAnswer(questionId, answers);
}
public void saveAnswer(String questionId, Answer[] answers) throws Exception {
jcrData_.saveAnswer(questionId, answers);
for (AnswerEventListener ae : listeners_) {
ae.saveAnswer(questionId, answers, true);
}
}
public JCRPageList getPageListAnswer(SessionProvider sProvider, String questionId, boolean isSortByVote) throws Exception {
sProvider.close();
return getPageListAnswer(questionId, isSortByVote);
}
public JCRPageList getPageListAnswer(String questionId, boolean isSortByVote) throws Exception {
return jcrData_.getPageListAnswer(questionId, isSortByVote);
}
public JCRPageList getPageListComment(SessionProvider sProvider, String questionId) throws Exception {
sProvider.close();
return getPageListComment(questionId);
}
public JCRPageList getPageListComment(String questionId) throws Exception {
return jcrData_.getPageListComment(questionId);
}
public QuestionPageList getListCategoriesWatch(String userId, SessionProvider sProvider) throws Exception {
sProvider.close();
return getWatchedCategoryByUser(userId);
}
public QuestionPageList getWatchedCategoryByUser(String userId) throws Exception {
return jcrData_.getWatchedCategoryByUser(userId);
}
public FileAttachment getUserAvatar(String userName, SessionProvider sProvider) throws Exception {
sProvider.close();
return getUserAvatar(userName);
}
public FileAttachment getUserAvatar(String userName) throws Exception {
return jcrData_.getUserAvatar(userName);
}
public void saveUserAvatar(String userId, FileAttachment fileAttachment, SessionProvider sProvider) throws Exception {
sProvider.close();
saveUserAvatar(userId, fileAttachment);
}
public void saveUserAvatar(String userId, FileAttachment fileAttachment) throws Exception {
jcrData_.saveUserAvatar(userId, fileAttachment);
}
public void setDefaultAvatar(String userName, SessionProvider sProvider) throws Exception {
sProvider.close();
setDefaultAvatar(userName);
}
public void setDefaultAvatar(String userName) throws Exception {
jcrData_.setDefaultAvatar(userName);
}
public boolean getWatchByUser(String userId, String cateId, SessionProvider sProvider) throws Exception {
sProvider.close();
return isUserWatched(userId, cateId);
}
public boolean isUserWatched(String userId, String cateId) {
return jcrData_.isUserWatched(userId, cateId);
}
public QuestionPageList getPendingQuestionsByCategory(String categoryId, SessionProvider sProvider, FAQSetting faqSetting) throws Exception {
sProvider.close();
return getPendingQuestionsByCategory(categoryId, faqSetting);
}
public QuestionPageList getPendingQuestionsByCategory(String categoryId, FAQSetting faqSetting) throws Exception {
return jcrData_.getPendingQuestionsByCategory(categoryId, faqSetting);
}
public boolean isExisting(String path) throws Exception {
return jcrData_.isExisting(path);
}
public String getCategoryPathOf(String id) throws Exception {
return jcrData_.getCategoryPathOf(id);
}
public List<String> getQuestionContents(List<String> paths) throws Exception {
return jcrData_.getQuestionContents(paths);
}
public Node getQuestionNodeById(String path) throws Exception {
return jcrData_.getQuestionNodeById(path);
}
public boolean isModerateAnswer(String id) throws Exception {
return jcrData_.isModerateAnswer(id);
}
public boolean isModerateQuestion(String id) throws Exception {
return jcrData_.isModerateQuestion(id);
}
public String getParentCategoriesName(String path) throws Exception {
return jcrData_.getParentCategoriesName(path);
}
public QuestionPageList getListMailInWatch(String categoryId) throws Exception {
return jcrData_.getListMailInWatch(categoryId);
}
public boolean isCategoryModerator(String categoryId, String user) throws Exception {
return jcrData_.isCategoryModerator(categoryId, user);
}
public void addLanguage(String questionPath, QuestionLanguage language) throws Exception {
SessionProvider sProvider = SessionProvider.createSystemProvider();
try {
Node questionNode = jcrData_.getFAQServiceHome(sProvider).getNode(questionPath);
MultiLanguages.addLanguage(questionNode, language);
} catch (Exception e) {
log.error("Fail to add language: ", e);
} finally {
sProvider.close();
}
}
public void deleteAnswerQuestionLang(String questionPath, String answerId, String language) throws Exception {
SessionProvider sProvider = SessionProvider.createSystemProvider();
try {
Node questionNode = jcrData_.getFAQServiceHome(sProvider).getNode(questionPath);
MultiLanguages.deleteAnswerQuestionLang(questionNode, answerId, language);
} catch (Exception e) {
log.error("Fail to delete " + answerId + " :", e);
} finally {
sProvider.close();
}
}
public void deleteCommentQuestionLang(String questionPath, String commentId, String language) throws Exception {
SessionProvider sProvider = SessionProvider.createSystemProvider();
try {
Node questionNode = jcrData_.getFAQServiceHome(sProvider).getNode(questionPath);
MultiLanguages.deleteCommentQuestionLang(questionNode, commentId, language);
} catch (Exception e) {
log.error("Fail to delete " + commentId + " comment question", e);
} finally {
sProvider.close();
}
}
public QuestionLanguage getQuestionLanguageByLanguage(String questionPath, String language) throws Exception {
SessionProvider sProvider = SessionProvider.createSystemProvider();
try {
Node questionNode = jcrData_.getFAQServiceHome(sProvider).getNode(questionPath);
return MultiLanguages.getQuestionLanguageByLanguage(questionNode, language);
} catch (Exception e) {
throw e;
} finally {
sProvider.close();
}
}
public Comment getCommentById(String questionPath, String commentId, String language) throws Exception {
SessionProvider sProvider = SessionProvider.createSystemProvider();
try {
Node questionNode = jcrData_.getFAQServiceHome(sProvider).getNode(questionPath);
return MultiLanguages.getCommentById(questionNode, commentId, language);
} catch (Exception e) {
log.error("Fail to get comment", e);
} finally {
sProvider.close();
}
return null;
}
public Answer getAnswerById(String questionPath, String answerid, String language) throws Exception {
SessionProvider sProvider = SessionProvider.createSystemProvider();
try {
Node questionNode = jcrData_.getFAQServiceHome(sProvider).getNode(questionPath);
return MultiLanguages.getAnswerById(questionNode, answerid, language);
} catch (Exception e) {
log.error("Fail to get answer: " + e.getMessage());
} finally {
sProvider.close();
}
return null;
}
public void saveAnswer(String questionPath, Answer answer, String language) throws Exception {
SessionProvider sProvider = SessionProvider.createSystemProvider();
try {
Node questionNode = jcrData_.getFAQServiceHome(sProvider).getNode(questionPath);
MultiLanguages.saveAnswer(questionNode, answer, language);
} catch (Exception e) {
log.error("Fail to save answer:", e);
} finally {
sProvider.close();
}
}
public void saveAnswer(String questionPath, QuestionLanguage questionLanguage) throws Exception {
SessionProvider sProvider = SessionProvider.createSystemProvider();
try {
Node questionNode = jcrData_.getFAQServiceHome(sProvider).getNode(questionPath);
MultiLanguages.saveAnswer(questionNode, questionLanguage);
} catch (Exception e) {
log.error("Fail to save answer: ", e);
} finally {
sProvider.close();
}
}
public void saveComment(String questionPath, Comment comment, String languge) throws Exception {
SessionProvider sProvider = SessionProvider.createSystemProvider();
try {
Node questionNode = jcrData_.getFAQServiceHome(sProvider).getNode(questionPath);
MultiLanguages.saveComment(questionNode, comment, languge);
for (AnswerEventListener ae : listeners_) {
ae.saveComment(questionNode.getName(), comment, true);
}
} catch (Exception e) {
log.error("\nFail to save comment\n ", e);
} finally {
sProvider.close();
}
}
public void removeLanguage(String questionPath, List<String> listLanguage) {
SessionProvider sProvider = SessionProvider.createSystemProvider();
try {
Node questionNode = jcrData_.getFAQServiceHome(sProvider).getNode(questionPath);
MultiLanguages.removeLanguage(questionNode, listLanguage);
} catch (Exception e) {
log.error("\nFail to remove language\n", e);
} finally {
sProvider.close();
}
}
public void voteAnswer(String answerPath, String userName, boolean isUp) throws Exception {
SessionProvider sProvider = SessionProvider.createSystemProvider();
try {
Node answerNode = jcrData_.getFAQServiceHome(sProvider).getNode(answerPath);
MultiLanguages.voteAnswer(answerNode, userName, isUp);
} catch (Exception e) {
log.error("\nFail to vote answer\n", e);
} finally {
sProvider.close();
}
}
public void voteQuestion(String questionPath, String userName, int number) throws Exception {
SessionProvider sProvider = SessionProvider.createSystemProvider();
try {
Node questionNode = jcrData_.getFAQServiceHome(sProvider).getNode(questionPath);
MultiLanguages.voteQuestion(questionNode, userName, number);
} catch (Exception e) {
log.error("\nFail to vote question\n", e);
} finally {
sProvider.close();
}
}
public void unVoteQuestion(String questionPath, String userName) throws Exception {
SessionProvider sProvider = SessionProvider.createSystemProvider();
try {
Node questionNode = jcrData_.getFAQServiceHome(sProvider).getNode(questionPath);
MultiLanguages.unVoteQuestion(questionNode, userName);
} catch (Exception e) {
log.error("\nFail to unvote question\n", e);
} finally {
sProvider.close();
}
}
public String[] getModeratorsOf(String path) throws Exception {
return jcrData_.getModeratorsOf(path);
}
public boolean isViewAuthorInfo(String id) throws Exception {
return jcrData_.isViewAuthorInfo(id);
}
public long existingCategories() throws Exception {
return jcrData_.existingCategories();
}
public String getCategoryNameOf(String categoryPath) throws Exception {
return jcrData_.getCategoryNameOf(categoryPath);
}
public List<Question> getQuickQuestionsByListCatetory(List<String> listCategoryId, boolean isNotYetAnswer) throws Exception {
return jcrData_.getQuickQuestionsByListCatetory(listCategoryId, isNotYetAnswer);
}
public List<Cate> listingCategoryTree() throws Exception {
return jcrData_.listingCategoryTree();
}
public List<Watch> getWatchByCategory(String categoryId) throws Exception {
return jcrData_.getWatchByCategory(categoryId);
}
public boolean hasWatch(String categoryPath) {
return jcrData_.hasWatch(categoryPath);
}
public CategoryInfo getCategoryInfo(String categoryPath, List<String> categoryIdScoped) throws Exception {
return jcrData_.getCategoryInfo(categoryPath, categoryIdScoped);
}
public byte[] getTemplate() throws Exception {
return jcrData_.getTemplate();
}
public void saveTemplate(String str) throws Exception {
jcrData_.saveTemplate(str);
}
public boolean isCategoryExist(String name, String path) {
return jcrData_.isCategoryExist(name, path);
}
public void updateQuestionRelatives(String questionPath, String[] relatives) throws Exception {
jcrData_.updateQuestionRelatives(questionPath, relatives);
}
public InputStream createAnswerRSS(String cateId) throws Exception {
return jcrData_.createAnswerRSS(cateId);
}
public void reCalculateLastActivityOfQuestion(String absPathOfProp) throws Exception {
jcrData_.reCalculateInfoOfQuestion(absPathOfProp);
}
public void addListenerPlugin(AnswerEventListener listener) throws Exception {
listeners_.add(listener);
}
public void calculateDeletedUser(String userName) throws Exception {
jcrData_.calculateDeletedUser(userName);
}
}