/**
* Copyright 2011-2012 Alexandre Dutra
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package fr.dutra.confluence2wordpress.action;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import com.atlassian.confluence.core.ConfluenceActionSupport;
import com.atlassian.confluence.renderer.MacroManager;
import com.atlassian.confluence.spaces.Space;
import com.atlassian.confluence.spaces.SpaceManager;
import com.atlassian.renderer.v2.macro.Macro;
import com.atlassian.user.EntityException;
import com.atlassian.user.Group;
import com.atlassian.user.GroupManager;
import com.atlassian.user.search.page.Pager;
import com.opensymphony.xwork.util.XWorkList;
import fr.dutra.confluence2wordpress.core.converter.SyntaxHighlighterPlugin;
import fr.dutra.confluence2wordpress.core.messages.ActionMessagesManager;
import fr.dutra.confluence2wordpress.core.permissions.PluginPermissionsManager;
import fr.dutra.confluence2wordpress.core.settings.PluginSettingsManager;
import fr.dutra.confluence2wordpress.wp.WordpressClient;
import fr.dutra.confluence2wordpress.wp.WordpressXmlRpcException;
/**
* @author Alexandre Dutra
*/
public class SettingsAction extends ConfluenceActionSupport {
private static final long serialVersionUID = 5175072542211533080L;
private static final String ERRORS_REQUIRED_KEY = "settings.errors.required.field";
private static final String ERRORS_INTEGER_KEY = "settings.errors.integer.field";
private static final String ERRORS_URL_KEY = "settings.errors.url";
private static final String ERRORS_PING = "settings.errors.ping";
private static final String ERRORS_TAG_NAME_EMPTY_KEY = "settings.errors.tagName.empty";
private static final String ERRORS_TAG_NAME_INVALID_KEY = "settings.errors.tagName.invalid";
private static final String ERRORS_TAG_ATTRIBUTE_EMPTY_KEY = "settings.errors.tagAttribute.empty";
private static final String MSG_PING = "settings.msg.ping";
private static final String MSG_UPDATE = "settings.msg.update";
private static final Pattern TAG_NAME_PATTERN = Pattern.compile("[a-zA-Z0-9]+");
private String pageUrl;
private String wordpressXmlRpcRelativePath;
private String wordpressUserName;
private String wordpressPassword;
private String wordpressBlogId;
private String ignoredConfluenceMacros;
@SuppressWarnings("unchecked")
private List<String> tagNames = new XWorkList(String.class);
@SuppressWarnings("unchecked")
private List<String> tagAttributes = new XWorkList(String.class);
private String wordpressRootUrl;
private String editPostRelativePath;
private String syntaxHighlighterPlugin;
private String proxyHost;
private String proxyPort;
private String maxConnections;
private String allowedConfluenceGroups;
private String allowedConfluenceSpaceKeys;
private PluginPermissionsManager pluginPermissionsManager;
private PluginSettingsManager pluginSettingsManager;
private MacroManager macroManager;
private GroupManager groupManager;
private SpaceManager spaceManager;
private ActionMessagesManager actionMessagesManager = new ActionMessagesManager();
public void setPluginSettingsManager(PluginSettingsManager pluginSettingsManager) {
this.pluginSettingsManager = pluginSettingsManager;
}
public void setPluginPermissionManager(PluginPermissionsManager pluginPermissionsManager) {
this.pluginPermissionsManager = pluginPermissionsManager;
}
public void setMacroManager(MacroManager macroManager) {
this.macroManager = macroManager;
}
public void setGroupManager(GroupManager groupManager) {
this.groupManager = groupManager;
}
public void setSpaceManager(SpaceManager spaceManager) {
this.spaceManager = spaceManager;
}
public Set<String> getAvailableMacros(){
Map<String, Macro> macros = macroManager.getMacros();
return new TreeSet<String>(macros.keySet());
}
public Set<String> getAvailableGroups(){
Set<String> groupNames = new TreeSet<String>();
try {
Pager<Group> groups = groupManager.getGroups();
for (Group group : groups) {
groupNames.add(group.getName());
}
} catch (EntityException e) {
}
return groupNames;
}
public Set<String> getAvailableSpaceKeys(){
Set<String> spaceKeys = new TreeSet<String>();
List<Space> spaces = spaceManager.getAllSpaces();
for (Space space: spaces) {
spaceKeys.add(space.getKey());
}
return spaceKeys;
}
@Override
public boolean isPermitted() {
return super.isPermitted() && pluginPermissionsManager.checkConfigurationPermission(getRemoteUser());
}
@Override
public void validate() {
if (StringUtils.isBlank(getWordpressRootUrl())) {
addActionError(getText(ERRORS_REQUIRED_KEY), new Object[]{getText("settings.form.wordpressRootUrl.label")});
}
if (StringUtils.isBlank(getWordpressXmlRpcRelativePath())) {
addActionError(getText(ERRORS_REQUIRED_KEY, new Object[]{getText("settings.form.wordpressXmlRpcRelativePath.label")}));
}
if (StringUtils.isBlank(getEditPostRelativePath())) {
addActionError(getText(ERRORS_REQUIRED_KEY, new Object[]{getText("settings.form.editPostRelativePath.label")}));
}
if (StringUtils.isBlank(getWordpressUserName())) {
addActionError(getText(ERRORS_REQUIRED_KEY, new Object[]{getText("settings.form.wordpressUserName.label")}));
}
if (StringUtils.isBlank(getWordpressPassword())) {
addActionError(getText(ERRORS_REQUIRED_KEY, new Object[]{getText("settings.form.wordpressPassword.label")}));
}
if (StringUtils.isBlank(getWordpressBlogId())) {
addActionError(getText(ERRORS_REQUIRED_KEY, new Object[]{getText("settings.form.wordpressBlogId.label")}));
}
if (StringUtils.isBlank(getSyntaxHighlighterPlugin())) {
addActionError(getText(ERRORS_REQUIRED_KEY, new Object[]{getText("settings.form.syntaxHighlighterPlugin.label")}));
}
if (StringUtils.isBlank(getWordpressMaxConnections())) {
addActionError(getText(ERRORS_REQUIRED_KEY, new Object[]{getText("settings.form.wordpressMaxConnections.label")}));
}
if (StringUtils.isNotBlank(getProxyPort())) {
try {
Integer.decode(getProxyPort());
} catch (NumberFormatException e) {
addActionError(getText(ERRORS_INTEGER_KEY, new Object[]{getText("settings.form.proxyPort.label")}));
}
}
if (StringUtils.isNotBlank(getWordpressMaxConnections())) {
try {
Integer.decode(getWordpressMaxConnections());
} catch (NumberFormatException e) {
addActionError(getText(ERRORS_INTEGER_KEY, new Object[]{getText("settings.form.wordpressMaxConnections.label")}));
}
}
String url = getWordpressRootUrl() + getWordpressXmlRpcRelativePath();
try {
new URL(url);
} catch (MalformedURLException e) {
addActionError(getText(ERRORS_URL_KEY, new Object[]{url}));
}
for (int i = 0; i < tagNames.size(); i++) {
String tagName = tagNames.get(i);
if(StringUtils.isBlank(tagName)){
addActionError(getText(ERRORS_TAG_NAME_EMPTY_KEY, new Object[]{i+1}));
} else if( ! TAG_NAME_PATTERN.matcher(tagName).matches()){
addActionError(getText(ERRORS_TAG_NAME_INVALID_KEY, new Object[]{tagName, i+1}));
}
}
for (int i = 0; i < tagAttributes.size(); i++) {
String tagAttribute = tagAttributes.get(i);
if(StringUtils.isBlank(tagAttribute)){
addActionError(getText(ERRORS_TAG_ATTRIBUTE_EMPTY_KEY, new Object[]{i+1}));
}
}
}
public String input() throws Exception {
actionMessagesManager.restoreActionErrorsAndMessagesFromSession(this);
wordpressRootUrl = pluginSettingsManager.getWordpressRootUrl();
ignoredConfluenceMacros = pluginSettingsManager.getDefaultIgnoredConfluenceMacros();
wordpressXmlRpcRelativePath = pluginSettingsManager.getWordpressXmlRpcRelativePath();
wordpressUserName = pluginSettingsManager.getWordpressUserName();
wordpressPassword = pluginSettingsManager.getWordpressPassword();
wordpressBlogId = pluginSettingsManager.getWordpressBlogId();
editPostRelativePath = pluginSettingsManager.getWordpressEditPostRelativePath();
proxyHost = pluginSettingsManager.getProxyHost();
proxyPort = pluginSettingsManager.getProxyPort();
maxConnections = pluginSettingsManager.getWordpressMaxConnections();
syntaxHighlighterPlugin = pluginSettingsManager.getWordpressSyntaxHighlighterPlugin();
allowedConfluenceGroups = pluginSettingsManager.getAllowedConfluenceGroups();
allowedConfluenceSpaceKeys = pluginSettingsManager.getAllowedConfluenceSpaceKeys();
Map<String, String> tagAttributesMap = pluginSettingsManager.getDefaultTagAttributes();
for (Entry<String, String> entry : tagAttributesMap.entrySet()) {
tagNames.add(entry.getKey());
tagAttributes.add(entry.getValue());
}
return SUCCESS;
}
@Override
public String execute() throws Exception {
saveSettings();
this.addActionMessage(getText(MSG_UPDATE));
actionMessagesManager.storeActionErrorsAndMessagesInSession(this);
return SUCCESS;
}
public String testConnection() throws Exception{
saveSettings();
WordpressClient client = pluginSettingsManager.getWordpressClient();
try {
String expected = Long.toString(System.currentTimeMillis());
String actual = client.ping(expected);
if(expected.equals(actual)){
addActionMessage(getText(MSG_PING));
} else {
addActionError(getText(ERRORS_PING), "Expected: " + expected + ", actual: " + actual);
}
} catch (WordpressXmlRpcException e) {
addActionError(getText(ERRORS_PING), e.getCause() == null ? e.getMessage() : e.getCause().getMessage());
}
actionMessagesManager.storeActionErrorsAndMessagesInSession(this);
return SUCCESS;
}
private void saveSettings() {
normalizeUrls();
pluginSettingsManager.setWordpressRootUrl(wordpressRootUrl);
pluginSettingsManager.setDefaultIgnoredConfluenceMacros(ignoredConfluenceMacros);
pluginSettingsManager.setWordpressXmlRpcRelativePath(wordpressXmlRpcRelativePath);
pluginSettingsManager.setWordpressUserName(wordpressUserName);
pluginSettingsManager.setWordpressPassword(wordpressPassword);
pluginSettingsManager.setWordpressBlogId(wordpressBlogId);
pluginSettingsManager.setWordpressEditPostRelativePath(editPostRelativePath);
pluginSettingsManager.setProxyHost(proxyHost);
pluginSettingsManager.setProxyPort(proxyPort);
pluginSettingsManager.setWordpressSyntaxHighlighterPlugin(syntaxHighlighterPlugin);
pluginSettingsManager.setAllowedConfluenceGroups(allowedConfluenceGroups);
pluginSettingsManager.setAllowedConfluenceSpaceKeys(allowedConfluenceSpaceKeys);
pluginSettingsManager.setWordpressMaxConnections(maxConnections);
Map<String, String> tagAttributesMap = new LinkedHashMap<String, String>();
for (int i = 0; i < tagNames.size(); i++) {
tagAttributesMap.put(tagNames.get(i), tagAttributes.get(i));
}
pluginSettingsManager.setTagAttributes(tagAttributesMap);
}
private void normalizeUrls() {
if( ! wordpressRootUrl.endsWith("/")){
wordpressRootUrl += "/";
}
if(wordpressXmlRpcRelativePath.startsWith("/")){
wordpressXmlRpcRelativePath = wordpressXmlRpcRelativePath.substring(1);
}
if(editPostRelativePath.startsWith("/")){
editPostRelativePath = editPostRelativePath.substring(1);
}
}
public String getPageUrl() {
return pageUrl;
}
public void setPageUrl(String pageUrl) {
this.pageUrl = pageUrl;
}
public String getWordpressRootUrl() {
return wordpressRootUrl;
}
public void setWordpressRootUrl(String wordpressRootUrl) {
this.wordpressRootUrl = wordpressRootUrl;
}
public String getEditPostRelativePath() {
return editPostRelativePath;
}
public void setEditPostRelativePath(String editPostRelativePath) {
this.editPostRelativePath = editPostRelativePath;
}
public String getWordpressXmlRpcRelativePath() {
return wordpressXmlRpcRelativePath;
}
public void setWordpressXmlRpcRelativePath(String wordpressXmlRpcRelativePath) {
this.wordpressXmlRpcRelativePath = wordpressXmlRpcRelativePath;
}
public String getWordpressUserName() {
return wordpressUserName;
}
public void setWordpressUserName(String wordpressUserName) {
this.wordpressUserName = wordpressUserName;
}
public String getWordpressPassword() {
return wordpressPassword;
}
public void setWordpressPassword(String wordpressPassword) {
this.wordpressPassword = wordpressPassword;
}
public String getWordpressBlogId() {
return wordpressBlogId;
}
public void setWordpressBlogId(String wordpressBlogId) {
this.wordpressBlogId = wordpressBlogId;
}
public String getIgnoredConfluenceMacros() {
return ignoredConfluenceMacros;
}
public void setIgnoredConfluenceMacros(String ignoredConfluenceMacros) {
this.ignoredConfluenceMacros = ignoredConfluenceMacros;
}
public List<String> getTagNames() {
return tagNames;
}
public void setTagNames(List<String> tagNames) {
this.tagNames = tagNames;
}
public List<String> getTagAttributes() {
return tagAttributes;
}
public void setTagAttributes(List<String> tagAttributes) {
this.tagAttributes = tagAttributes;
}
public String getSyntaxHighlighterPlugin() {
return syntaxHighlighterPlugin;
}
public void setSyntaxHighlighterPlugin(String syntaxHighlighterPlugin) {
this.syntaxHighlighterPlugin = syntaxHighlighterPlugin;
}
public String getProxyHost() {
return proxyHost;
}
public void setProxyHost(String proxyHost) {
this.proxyHost = proxyHost;
}
public String getProxyPort() {
return proxyPort;
}
public void setProxyPort(String proxyPort) {
this.proxyPort = proxyPort;
}
public String getWordpressMaxConnections() {
return maxConnections;
}
public void setWordpressMaxConnections(String maxConnections) {
this.maxConnections = maxConnections;
}
public SyntaxHighlighterPlugin[] getSyntaxHighlighterPlugins() {
return SyntaxHighlighterPlugin.values();
}
public String getAllowedConfluenceGroups() {
return allowedConfluenceGroups;
}
public void setAllowedConfluenceGroups(String allowedConfluenceGroups) {
this.allowedConfluenceGroups = allowedConfluenceGroups;
}
public String getAllowedConfluenceSpaceKeys() {
return allowedConfluenceSpaceKeys;
}
public void setAllowedConfluenceSpaceKeys(String allowedConfluenceSpaceKeys) {
this.allowedConfluenceSpaceKeys = allowedConfluenceSpaceKeys;
}
}