InlineEditor.java

package sk.iway.iwcm.editor;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.BeanUtils;
import org.json.JSONArray;
import org.json.JSONObject;

import sk.iway.iwcm.Constants;
import sk.iway.iwcm.Identity;
import sk.iway.iwcm.InitServlet;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.doc.DocDetails;
import sk.iway.iwcm.doc.TemplateDetails;
import sk.iway.iwcm.doc.TemplatesGroupBean;
import sk.iway.iwcm.users.UsersDB;


/**
 *  InlineEditor.java - ukladanie JSON objektu z inline editacie
 *
 *@Title        webjet8
 *@Company      Interway s.r.o. (www.interway.sk)
 *@Copyright    Interway s.r.o. (c) 2001-2016
 *@author       $Author: jeeff jeeff $
 *@version      $Revision: 1.3 $
 *@created      Date: 4.10.2016 16:00:14
 *@modified     $Date: 2004/08/16 06:26:11 $
 */
public class InlineEditor
{
	private static final String NUMBER_ATTRIBUTE = "editor.inline.idSequenceNumber";

	private static final String[] EDITABLE_FIELDS = { "title", "htmlHead", "htmlData", "perexImage", "virtualPath", "externalLink", "priceWithVat" };

	private String json;
	private HttpServletRequest request;

	private StringBuilder errorMessage = new StringBuilder();

	public InlineEditor(String json, HttpServletRequest request)
	{
		this.json = json;
		this.request = request;
	}

	public void save()
	{
		Identity user = UsersDB.getCurrentUser(request);

		int formDocId = Tools.getIntValue(request.getParameter("docId"), -1);
		int groupId = Tools.getIntValue(request.getParameter("groupId"), -1);

		try
		{
			JSONObject obj = new JSONObject(getJson());
			JSONArray editable  = obj.getJSONArray("editable");
			for (int i = 0; i < editable.length(); i++)
			{
				JSONObject item = editable.getJSONObject(i);
				String data = item.getString("data");
				String wjApp = item.getString("wjApp");
				int wjAppKey = item.getInt("wjAppKey");
				String field = item.getString("wjAppField");

				if (EditorDB.isPageEditable(user, wjAppKey)==false) continue;

				if ("newsInline".equals(wjApp) || "pageBuilder".equals(wjApp))
				{
					EditorForm ef = EditorDB.getEditorForm(request, wjAppKey, -1, groupId);

					if ("perexPre".equals(field)) ef.setHtmlData(data);
					else if ("title".equals(field)) ef.setTitle(data);
					else
					{
						ef.setData(data);

						if (wjAppKey == formDocId)
						{
							saveOtherData(ef);
						}
					}

					ef.setPublish("1");
					ef.setAuthorId(user.getUserId());
					int historyId = EditorDB.saveEditorForm(ef, request);
					if(historyId > 0)
					{
						Logger.debug(InlineEditor.class, "ok");
					}
					else
					{
						errorMessage.append("Error saving doc ").append(wjAppKey).append("\n");
					}
					EditorDB.cleanSessionData(request);
				}
			}
		}
		catch (Exception e)
		{
			sk.iway.iwcm.Logger.error(e);
			errorMessage.append("Error parsing JSON object").append("\n");
		}

	}

	/**
	 * Ulozime parametre hlavneho formu
	 * @param ef
	 */
	private void saveOtherData(EditorForm ef)
	{
		for (String name : EDITABLE_FIELDS)
		{
			saveField(name, ef);
		}
		String[] fields = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T"};
		for (String pismeno : fields)
		{
			saveField("field"+pismeno, ef);
		}

		if ("cloud".equals(Constants.getInstallName()) && InitServlet.isTypeCloud())
		{
			Logger.debug(InlineEditor.class, "som cloud, nastavuje pass protected, value="+request.getParameter("passwordProtected")+";");
			if ("1".equals(request.getParameter("passwordProtected")))
			{
				ef.setPasswordProtectedString("1");
			}
			else
			{
				ef.setPasswordProtectedString("");
			}
		}
	}

	private void saveField(String name, EditorForm ef)
	{
		String paramValue = request.getParameter(name);
		if (paramValue != null)
		{
			try
			{
				Logger.debug(InlineEditor.class, "saveOtherData, name="+name+" value="+paramValue);
				BeanUtils.setProperty(ef, name, paramValue);
			}
			catch (Exception e)
			{
				sk.iway.iwcm.Logger.error(e);
			}
		}
	}

	public static String getEditAttrs(HttpServletRequest request, DocDetails doc)
	{
		return getEditAttributes(request, doc, getEditingMode(request).name(), null, false);
	}

	public static String getEditAttrs(HttpServletRequest request, DocDetails doc, String field, boolean generateId)
	{
		return getEditAttributes(request, doc, getEditingMode(request).name(), field, generateId);
	}

	private static String getEditAttributes(HttpServletRequest request, DocDetails doc, String appName, String field, boolean generateId)
	{
		StringBuilder atrs = new StringBuilder();

		Identity user = UsersDB.getCurrentUser(request);
		if (user != null && InlineEditor.isInlineEditingEnabled(request))
		{
			atrs.append(" data-wjapp='").append(appName).append("' data-wjappkey='").append(doc.getDocId()).append("'");
			if (Tools.isNotEmpty(field))
			{
				atrs.append(" data-wjappfield='").append(field).append("'");
			}
			if (generateId)
			{
				atrs.append(" id='wjInline").append(getUniqueIdAttribute(request)).append("'");
			}
		}

		return atrs.toString();
	}

	private static int getUniqueIdAttribute(HttpServletRequest request)
	{
		Object numberAttribute = request.getAttribute(NUMBER_ATTRIBUTE);
		int number = ((null == numberAttribute) ? 0 : ((Integer) numberAttribute).intValue()) + 1;
		request.setAttribute(NUMBER_ATTRIBUTE, Integer.valueOf(number));

		return number;
	}

	public String getJson()
	{
		return json;
	}

	public void setJson(String json)
	{
		this.json = json;
	}

	public String getErrorMessage()
	{
		return errorMessage.toString();
	}

	public static boolean isInlineEditingEnabled(HttpServletRequest request)
	{
		//ak su zapnute heatmapy nezobrazime InlineEditor
		boolean isHeatmapEnabled = request.getSession().getAttribute("heatMapEnabled") != null && (boolean) request.getSession().getAttribute("heatMapEnabled") == true;
		//ak sa jedan o preview - preview.do (PreviewAction) - nezobrazime InlineEditor
		boolean isPreview = request.getAttribute("isPreview") != null && (boolean) request.getAttribute("isPreview") == true;

		boolean inlineEditingEnabled = false; //57629 - not enabled anymore Constants.getBoolean("inlineEditingEnabled");

		if ("false".equals(request.getAttribute("isInlineEditing"))) return false;

		//DEPRECATED - allow temporary force editing
		if ("true".equals(request.getAttribute("isInlineEditing"))) inlineEditingEnabled = true;

		//ak sa jedna o priamu editaciu v editore stranok
		if ("true".equals(request.getParameter("inlineEditorAdmin"))) {
			Identity user = UsersDB.getCurrentUser(request);
			if (user != null && user.isAdmin()) {
				inlineEditingEnabled = true;
				isHeatmapEnabled = false;
			}
		}

		return (inlineEditingEnabled
					&& request.getHeader("dmail")==null
					&& request.getParameter("NO_WJTOOLBAR")==null
					&& request.getParameter("isDmail")==null
					&& !isHeatmapEnabled
					&& request.getAttribute("disableInlineEditing")==null
					&& !isPreview);
	}

	public enum EditingMode { newsInline, pageBuilder, gridEditor }; //NOSONAR
	private static final String EDITING_MODE_KEY = "sk.iway.iwcm.editor.editingMode";

    /**
     * Nastavi rezim inline editacie
     * @param mode
     * @param request
     */
	public static void setEditingMode(EditingMode mode, HttpServletRequest request)
    {
        request.setAttribute(EDITING_MODE_KEY, mode);
    }

    public static EditingMode getEditingMode(HttpServletRequest request)
    {
        EditingMode mode = (EditingMode)request.getAttribute(EDITING_MODE_KEY);
        if (mode == null)
        {
            mode = EditingMode.newsInline;

            TemplatesGroupBean tempGroup = (TemplatesGroupBean)request.getAttribute("templatesGroupDetails");
            if (tempGroup!=null)
            {
                if ("pageBuilder".equals(tempGroup.getInlineEditingMode())) mode = EditingMode.pageBuilder;
                else if ("gridEditor".equals(tempGroup.getInlineEditingMode())) mode = EditingMode.gridEditor;
            }

            TemplateDetails temp = (TemplateDetails)request.getAttribute("templateDetails");
            if (temp != null)
            {
                if (temp.getTempName().contains("PageBuilder") || temp.getAfterBodyData().contains("PageBuilder"))
                {
                    mode = EditingMode.pageBuilder;
                }
            }
        }
        return mode;
    }
}