/*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* This 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 software 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 software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package com.celements.rteConfig;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xwiki.context.Execution;
import org.xwiki.model.reference.DocumentReference;
import org.xwiki.query.Query;
import org.xwiki.query.QueryException;
import org.xwiki.query.QueryManager;
import com.celements.pagetype.cmd.PageTypeCommand;
import com.celements.web.service.IWebUtilsService;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.XWikiException;
import com.xpn.xwiki.doc.XWikiDocument;
import com.xpn.xwiki.objects.BaseObject;
import com.xpn.xwiki.web.Utils;
public class RTEConfig {
private static Log LOGGER = LogFactory.getFactory().getInstance(RTEConfig.class);
/**
* @Deprecated instead use RTEConfigClass.RTE_CONFIG_TYPE_PRPOP_CLASS_DOC
**/
@Deprecated
private static final String RTE_CONFIG_TYPE_PROP_CLASS_NAME = "RTEConfigTypePropertiesClass";
/**
* @Deprecated instead use RTEConfigClass.RTE_CONFIG_TYPE_PRPOP_CLASS_SPACE
**/
@Deprecated
public static final String RTE_CONFIG_TYPE_PROP_CLASS_SPACE = "Classes";
public static final String RTE_CONFIG_TYPE_CLASS_SPACE = "Classes";
public static final String RTE_CONFIG_TYPE_CLASS_NAME = "RTEConfigTypeClass";
public static final String CONFIG_CLASS_NAME = RTE_CONFIG_TYPE_CLASS_SPACE + "."
+ RTE_CONFIG_TYPE_CLASS_NAME;
public static final String CONFIG_PROP_NAME = "rteconfig";
/**
* @Deprecated instead use RTEConfigClass.RTE_CONFIG_TYPE_PRPOP_CLASS
**/
@Deprecated
public static final String PROP_CLASS_NAME = RTE_CONFIG_TYPE_PROP_CLASS_SPACE + "."
+ RTE_CONFIG_TYPE_PROP_CLASS_NAME;
private final static Map<String, String> rteConfigFieldDefaults = new HashMap<String, String>();
static {
rteConfigFieldDefaults.put("blockformats", "rte_heading1=h1,rte_text=p");
};
private PageTypeCommand injectedPageTypeInstance;
private XWikiContext getContext() {
return (XWikiContext) getExecution().getContext().getProperty("xwikicontext");
}
private Execution getExecution() {
return Utils.getComponent(Execution.class);
}
/**
* @deprecated use instead IRTEConfigClassConfig.getRTEConfigTypePropertiesClassRef
*/
@Deprecated
public DocumentReference getRTEConfigTypePropClassRef(String wikiName) {
return new DocumentReference(wikiName, RTE_CONFIG_TYPE_PROP_CLASS_SPACE,
RTE_CONFIG_TYPE_PROP_CLASS_NAME);
}
public String getRTEConfigField(String name) throws XWikiException {
XWikiDocument doc = getContext().getDoc();
String resultConfig = "";
// Doc
resultConfig = getPreferenceFromConfigObject(name, doc);
if ("".equals(resultConfig.trim())) {
resultConfig = getPreferenceFromPreferenceObject(name, PROP_CLASS_NAME, doc);
}
// PageType
if ("".equals(resultConfig.trim())) {
resultConfig = getRTEConfigFieldFromPageType(name);
}
// WebPreferences
if ("".equals(resultConfig.trim())) {
String space = getContext().getDoc().getSpace();
resultConfig = getRTEConfigFieldFromPreferenceDoc(name, space + ".WebPreferences");
}
// XWikiPreferences
if ("".equals(resultConfig.trim())) {
resultConfig = getRTEConfigFieldFromPreferenceDoc(name, "XWiki.XWikiPreferences");
}
// xwiki.cfg
if ("".equals(resultConfig.trim())) {
resultConfig = getContext().getWiki().Param("celements.rteconfig." + name,
rteConfigFieldDefaults.get(name));
}
return resultConfig;
}
private String getRTEConfigFieldFromPageType(String name) throws XWikiException {
String resultConfig = "";
String pageTypeDocFN = getPageType().getPageTypeDocFN(getContext().getDoc(), getContext());
if ((pageTypeDocFN != null) && getContext().getWiki().exists(pageTypeDocFN, getContext())) {
XWikiDocument pageTypeDoc = getContext().getWiki().getDocument(pageTypeDocFN, getContext());
resultConfig = getPreferenceFromConfigObject(name, pageTypeDoc);
if ("".equals(resultConfig.trim())) {
resultConfig = getPreferenceFromPreferenceObject(name, PROP_CLASS_NAME, pageTypeDoc);
}
}
return resultConfig;
}
private String getRTEConfigFieldFromPreferenceDoc(String name, String docName)
throws XWikiException {
XWikiDocument prefDoc = getContext().getWiki().getDocument(docName, getContext());
String resultConfig = "";
resultConfig = getPreferenceFromConfigObject(name, prefDoc);
if ("".equals(resultConfig.trim())) {
resultConfig = getPreferenceFromPreferenceObject(name, PROP_CLASS_NAME, prefDoc);
if ("".equals(resultConfig.trim())) {
resultConfig = getPreferenceFromPreferenceObject("rte_" + name, "XWiki.XWikiPreferences",
prefDoc);
}
}
return resultConfig;
}
String getPreferenceFromConfigObject(String name, XWikiDocument doc) throws XWikiException {
String configDocName = getPreferenceFromPreferenceObject(CONFIG_PROP_NAME, CONFIG_CLASS_NAME,
doc);
if (!"".equals(configDocName.trim())) {
XWikiDocument configDoc = getContext().getWiki().getDocument(configDocName, getContext());
return getPreferenceFromPreferenceObject(name, PROP_CLASS_NAME, configDoc);
}
return "";
}
String getPreferenceFromPreferenceObject(String name, String className, XWikiDocument doc) {
BaseObject prefObj = doc.getObject(className);
if (prefObj != null) {
return prefObj.getStringValue(name);
}
return "";
}
/**
* FOR TESTS ONLY!!!
*
* @param test_Instance
*/
public void injectPageTypeInstance(PageTypeCommand test_Instance) {
injectedPageTypeInstance = test_Instance;
}
PageTypeCommand getPageType() throws XWikiException {
if (injectedPageTypeInstance == null) {
injectedPageTypeInstance = PageTypeCommand.getInstance();
}
return injectedPageTypeInstance;
}
public List<DocumentReference> getRTEConfigsList() {
List<DocumentReference> rteConfigsList = new ArrayList<DocumentReference>();
try {
List<String> resultList = getQueryManager().createQuery(getRteConfigsXWQL(),
Query.XWQL).execute();
for (String result : resultList) {
rteConfigsList.add(getWebUtilsService().resolveDocumentReference(result));
}
} catch (QueryException exp) {
LOGGER.error("Failed to get RTE-Configs list.", exp);
}
return rteConfigsList;
}
private String getRteConfigsXWQL() {
return "from doc.object(" + PROP_CLASS_NAME + ") as rteConfig" + " where doc.translation = 0";
}
private QueryManager getQueryManager() {
return Utils.getComponent(QueryManager.class);
}
private IWebUtilsService getWebUtilsService() {
return Utils.getComponent(IWebUtilsService.class);
}
}