/**
* Copyright (C) 2011 JTalks.org Team
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library 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
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.jtalks.jcommune.plugin.questionsandanswers;
import org.jtalks.common.model.permissions.BranchPermission;
import org.jtalks.common.model.permissions.JtalksPermission;
import org.jtalks.jcommune.model.entity.PluginProperty;
import org.jtalks.jcommune.plugin.api.core.SubscribersFilter;
import org.jtalks.jcommune.plugin.api.core.TopicPlugin;
import org.jtalks.jcommune.plugin.api.core.WebControllerPlugin;
import org.jtalks.jcommune.plugin.api.web.dto.CreateTopicBtnDto;
import org.jtalks.jcommune.plugin.api.exceptions.PluginConfigurationException;
import org.jtalks.jcommune.plugin.api.service.ReadOnlySecurityService;
import org.jtalks.jcommune.plugin.api.web.PluginController;
import org.jtalks.jcommune.plugin.questionsandanswers.controller.QuestionsAndAnswersController;
import java.util.*;
/**
* Plugin for question and answer type of topic.
*
* @author Evgeniy Myslovets
*/
public class QuestionsAndAnswersPlugin extends WebControllerPlugin implements TopicPlugin {
public static final String TOPIC_TYPE = "Question";
private static final String ORDER_PROPERTY = "label.order";
private static final String ORDER_HINT = "label.order.hint";
private static final int DEFAULT_ORDER_VALUE = 102;
private static final String DEFAULT_LOCALE_CODE = "en";
public static final String CONTEXT = "/topics/question";
public static final String MESSAGE_PATH = "org.jtalks.jcommune.plugin.questionsandanswers.messages";
/**
* Default value, thus it will show lower in the list of topics than Discussion and Code Review which are 100 & 101.
*/
private int order = DEFAULT_ORDER_VALUE;
/**
* {@inheritDoc}
*/
@Override
public String getName() {
return "Questions and Answers plugin";
}
/**
* {@inheritDoc}
*/
@Override
public List<PluginProperty> getConfiguration() {
PluginProperty orderProperty = new PluginProperty(ORDER_PROPERTY, PluginProperty.Type.INT,
String.valueOf(order));
orderProperty.setHint(ORDER_HINT);
return Arrays.asList(orderProperty);
}
/**
* {@inheritDoc}
*/
@Override
public boolean supportsJCommuneVersion(String version) {
return true;
}
/**
* {@inheritDoc}
*/
@Override
protected Map<PluginProperty, String> applyConfiguration(List<PluginProperty> properties)
throws PluginConfigurationException {
if (properties.size() == 1 && ORDER_PROPERTY.equalsIgnoreCase(properties.get(0).getName())) {
order = properties.get(0).getValue() == null ? DEFAULT_ORDER_VALUE
: Integer.parseInt(properties.get(0).getValue());
properties.get(0).setHint(ORDER_HINT);
return new HashMap<>();
} else {
throw new PluginConfigurationException(
"Can't apply configuration: incorrect parameters count or order not found");
}
}
/**
* {@inheritDoc}
*/
@Override
public List<PluginProperty> getDefaultConfiguration() {
PluginProperty orderProperty = new PluginProperty(ORDER_PROPERTY, PluginProperty.Type.INT,
String.valueOf(DEFAULT_ORDER_VALUE));
orderProperty.setHint(ORDER_HINT);
return Arrays.asList(orderProperty);
}
/**
* {@inheritDoc}
*/
@Override
public String translateLabel(String code, Locale locale) {
ResourceBundle messages = ResourceBundle.getBundle(MESSAGE_PATH, locale);
if (messages.containsKey(code)) {
return messages.getString(code);
} else {
ResourceBundle defaultMessages = ResourceBundle.getBundle(MESSAGE_PATH, new Locale(DEFAULT_LOCALE_CODE));
return defaultMessages.containsKey(code) ? defaultMessages.getString(code) : code;
}
}
/**
* {@inheritDoc}
*/
@SuppressWarnings("unchecked")
@Override
public <T extends JtalksPermission> List<T> getBranchPermissions() {
return (List<T>) QuestionsPluginBranchPermission.getAllAsList();
}
/**
* {@inheritDoc}
*/
@Override
public CreateTopicBtnDto getCreateTopicBtnDto(long branchId) {
Locale locale = ReadOnlySecurityService.getInstance().getCurrentUser().getLanguage().getLocale();
return new CreateTopicBtnDto("new-question-btn", translateLabel("label.addQuestion", locale),
translateLabel("label.addQuestion.tip", locale), CONTEXT + "/new?branchId=" + branchId, order);
}
/**
* {@inheritDoc}
*/
@Override
public JtalksPermission getCreateTopicPermission() {
return QuestionsPluginBranchPermission.CREATE_QUESTIONS;
}
/**
* {@inheritDoc}
*/
@Override
public JtalksPermission getBranchPermissionByMask(int mask) {
return QuestionsPluginBranchPermission.findByMask(mask);
}
/**
* {@inheritDoc}
*/
@Override
public JtalksPermission getBranchPermissionByName(String name) {
try {
return QuestionsPluginBranchPermission.valueOf(name);
} catch (IllegalArgumentException e) {
return null;
}
}
/**
* {@inheritDoc}
*/
@Override
public PluginController getController() {
return new QuestionsAndAnswersController();
}
/**
* {@inheritDoc}
*/
@Override
public String getTopicType() {
return TOPIC_TYPE;
}
/**
* {@inheritDoc}
*/
@Override
public JtalksPermission getCommentPermission() {
return BranchPermission.CREATE_POSTS;
}
/**
* {@inheritDoc}
*/
@Override
public SubscribersFilter getSubscribersFilter() {
return new QuestionSubscribersFilter();
}
}