/* * File : $Source: /alkacon/cvs/alkacon/com.alkacon.opencms.mapwidget/src/com/alkacon/opencms/mapwidget/CmsGoogleMapWidgetConfig.java,v $ * Date : $Date: 2009/12/17 19:38:28 $ * Version: $Revision: 1.1 $ * * This library is part of OpenCms - * the Open Source Content Management System * * Copyright (c) 2002 - 2008 Alkacon Software GmbH (http://www.alkacon.com) * * 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. * * For further information about Alkacon Software GmbH, please see the * company website: http://www.alkacon.com * * For further information about OpenCms, please see the * project website: http://www.opencms.org * * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.alkacon.opencms.mapwidget; import org.opencms.json.JSONArray; import org.opencms.json.JSONException; import org.opencms.json.JSONObject; import org.opencms.main.CmsIllegalArgumentException; import org.opencms.main.CmsLog; import org.opencms.util.A_CmsModeStringEnumeration; import org.opencms.util.CmsStringUtil; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.apache.commons.logging.Log; /** * Configuration of the google map widget.<p> * * Options can be defined for each element of the type <code>String</code> using the widget <code>GoogleMapWidget</code>. * They have to be placed in the annotation section of a XSD describing an XML content. The <code>configuration</code> attribute * in the <code>layout</code> node for the element must contain the activated options as a JSON string without the curly braces:<p> * * <code><layout element="Text" widget="HtmlWidget" configuration="inline: ['coords'], popup: ['coords','address','zoom','size','type','mode','map'], edit: ['coords','address','zoom','size','type','mode','map']" /></code><p> * * Available options are: * <ul> * <li><code>inline</code>: the properties to be displayed inline * <li><code>popup</code>: the properties to be displayed in a popup</li> * <li><code>edit</code>: the editable properties</li> * </ul> * * All of them accept an array of map property names and valid map properties are: * <ul> * <li><code>coords</code></li> * <li><code>address</code></li> * <li><code>zoom</code></li> * <li><code>size</code></li> * <li><code>type</code></li> * <li><code>mode</code></li> * <li><code>map</code></li> * </ul> * * @author Michael Moossen * * @version $Revision: 1.1 $ * * @since 7.0.5 */ public class CmsGoogleMapWidgetConfig { /** * Enumeration class for defining the map properties.<p> */ public static final class CmsGoogleMapOption extends A_CmsModeStringEnumeration { /** Constant for the type property. */ protected static final CmsGoogleMapOption PROPERTY_ADDRESS = new CmsGoogleMapOption("address"); /** Constant for the coords property. */ protected static final CmsGoogleMapOption PROPERTY_COORDS = new CmsGoogleMapOption("coords"); /** Constant for the map property. */ protected static final CmsGoogleMapOption PROPERTY_MAP = new CmsGoogleMapOption("map"); /** Constant for the mode property. */ protected static final CmsGoogleMapOption PROPERTY_MODE = new CmsGoogleMapOption("mode"); /** Constant for the size property. */ protected static final CmsGoogleMapOption PROPERTY_SIZE = new CmsGoogleMapOption("size"); /** Constant for the type property. */ protected static final CmsGoogleMapOption PROPERTY_TYPE = new CmsGoogleMapOption("type"); /** Constant for the zoom property. */ protected static final CmsGoogleMapOption PROPERTY_ZOOM = new CmsGoogleMapOption("zoom"); /** The serial version id. */ private static final long serialVersionUID = 4947546561403836577L; /** * Returns the parsed property object if the string representation matches, or <code>null</code> if not.<p> * * @param property the string representation to parse * * @return the parsed property object */ public static CmsGoogleMapOption valueOf(final String property) { if (property == null) { return null; } if (property.equalsIgnoreCase(CmsGoogleMapOption.PROPERTY_ZOOM.getMode())) { return CmsGoogleMapOption.PROPERTY_ZOOM; } if (property.equalsIgnoreCase(CmsGoogleMapOption.PROPERTY_MODE.getMode())) { return CmsGoogleMapOption.PROPERTY_MODE; } if (property.equalsIgnoreCase(CmsGoogleMapOption.PROPERTY_TYPE.getMode())) { return CmsGoogleMapOption.PROPERTY_TYPE; } if (property.equalsIgnoreCase(CmsGoogleMapOption.PROPERTY_SIZE.getMode())) { return CmsGoogleMapOption.PROPERTY_SIZE; } if (property.equalsIgnoreCase(CmsGoogleMapOption.PROPERTY_ADDRESS.getMode())) { return CmsGoogleMapOption.PROPERTY_ADDRESS; } if (property.equalsIgnoreCase(CmsGoogleMapOption.PROPERTY_MAP.getMode())) { return CmsGoogleMapOption.PROPERTY_MAP; } if (property.equalsIgnoreCase(CmsGoogleMapOption.PROPERTY_COORDS.getMode())) { return CmsGoogleMapOption.PROPERTY_COORDS; } throw new CmsIllegalArgumentException(Messages.get().container( Messages.ERR_UNKNOWN_MAP_PROPERTY_1, property)); } /** * Default constructor.<p> * * @param mode string representation */ private CmsGoogleMapOption(final String mode) { super(mode); } /** * Checks if <code>this</code> is {@link #PROPERTY_ADDRESS}.<p> * * @return <code>true</code>, if <code>this</code> is {@link #PROPERTY_ADDRESS} */ public boolean isAddress() { return this == CmsGoogleMapOption.PROPERTY_ADDRESS; } /** * Checks if <code>this</code> is {@link #PROPERTY_COORDS}.<p> * * @return <code>true</code>, if <code>this</code> is {@link #PROPERTY_COORDS} */ public boolean isCoords() { return this == CmsGoogleMapOption.PROPERTY_COORDS; } /** * Checks if <code>this</code> is {@link #PROPERTY_MAP}.<p> * * @return <code>true</code>, if <code>this</code> is {@link #PROPERTY_MAP} */ public boolean isMap() { return this == CmsGoogleMapOption.PROPERTY_MAP; } /** * Checks if <code>this</code> is {@link #PROPERTY_MODE}.<p> * * @return <code>true</code>, if <code>this</code> is {@link #PROPERTY_MODE} */ public boolean isMode() { return this == CmsGoogleMapOption.PROPERTY_MODE; } /** * Checks if <code>this</code> is {@link #PROPERTY_SIZE}.<p> * * @return <code>true</code>, if <code>this</code> is {@link #PROPERTY_SIZE} */ public boolean isSize() { return this == CmsGoogleMapOption.PROPERTY_SIZE; } /** * Checks if <code>this</code> is {@link #PROPERTY_TYPE}.<p> * * @return <code>true</code>, if <code>this</code> is {@link #PROPERTY_TYPE} */ public boolean isType() { return this == CmsGoogleMapOption.PROPERTY_TYPE; } /** * Checks if <code>this</code> is {@link #PROPERTY_ZOOM}.<p> * * @return <code>true</code>, if <code>this</code> is {@link #PROPERTY_ZOOM} */ public boolean isZoom() { return this == CmsGoogleMapOption.PROPERTY_ZOOM; } } /** Default edit. */ public static final List<CmsGoogleMapOption> DEFAULT_EDIT; /** Default show. */ public static final List<CmsGoogleMapOption> DEFAULT_INLINE; /** Default popup. */ public static final List<CmsGoogleMapOption> DEFAULT_POPUP; /** Option edit. */ public static final String OPTION_EDIT = "edit"; /** Option show. */ public static final String OPTION_INLINE = "inline"; /** Option popup. */ public static final String OPTION_POPUP = "popup"; /** Constant for the property address. */ public static final CmsGoogleMapOption PROPERTY_ADDRESS = CmsGoogleMapOption.PROPERTY_ADDRESS; /** Constant for the property coords. */ public static final CmsGoogleMapOption PROPERTY_COORDS = CmsGoogleMapOption.PROPERTY_COORDS; /** Constant for the property map. */ public static final CmsGoogleMapOption PROPERTY_MAP = CmsGoogleMapOption.PROPERTY_MAP; /** Constant for the property mode. */ public static final CmsGoogleMapOption PROPERTY_MODE = CmsGoogleMapOption.PROPERTY_MODE; /** Constant for the property size. */ public static final CmsGoogleMapOption PROPERTY_SIZE = CmsGoogleMapOption.PROPERTY_SIZE; /** Constant for the property type. */ public static final CmsGoogleMapOption PROPERTY_TYPE = CmsGoogleMapOption.PROPERTY_TYPE; /** Constant for the property zoom. */ public static final CmsGoogleMapOption PROPERTY_ZOOM = CmsGoogleMapOption.PROPERTY_ZOOM; /** The log object for this class. */ private static final Log LOG = CmsLog.getLog(CmsGoogleMapWidgetConfig.class); /** Static initialization. */ static { final List<CmsGoogleMapOption> edit = new ArrayList<CmsGoogleMapOption>(); edit.add(CmsGoogleMapWidgetConfig.PROPERTY_COORDS); edit.add(CmsGoogleMapWidgetConfig.PROPERTY_ADDRESS); edit.add(CmsGoogleMapWidgetConfig.PROPERTY_ZOOM); edit.add(CmsGoogleMapWidgetConfig.PROPERTY_SIZE); edit.add(CmsGoogleMapWidgetConfig.PROPERTY_TYPE); edit.add(CmsGoogleMapWidgetConfig.PROPERTY_MODE); edit.add(CmsGoogleMapWidgetConfig.PROPERTY_MAP); DEFAULT_EDIT = Collections.unmodifiableList(edit); final List<CmsGoogleMapOption> popup = new ArrayList<CmsGoogleMapOption>(); popup.add(CmsGoogleMapWidgetConfig.PROPERTY_COORDS); popup.add(CmsGoogleMapWidgetConfig.PROPERTY_ADDRESS); popup.add(CmsGoogleMapWidgetConfig.PROPERTY_ZOOM); popup.add(CmsGoogleMapWidgetConfig.PROPERTY_SIZE); popup.add(CmsGoogleMapWidgetConfig.PROPERTY_TYPE); popup.add(CmsGoogleMapWidgetConfig.PROPERTY_MODE); popup.add(CmsGoogleMapWidgetConfig.PROPERTY_MAP); DEFAULT_POPUP = Collections.unmodifiableList(popup); final List<CmsGoogleMapOption> inline = new ArrayList<CmsGoogleMapOption>(); inline.add(CmsGoogleMapWidgetConfig.PROPERTY_COORDS); DEFAULT_INLINE = Collections.unmodifiableList(inline); } /** Editable properties value. */ private final List<CmsGoogleMapOption> m_edit; /** Inline displayed properties value. */ private final List<CmsGoogleMapOption> m_inline; /** Popup displayed properties value. */ private final List<CmsGoogleMapOption> m_popup; /** * Creates a new empty widget option object.<p> */ public CmsGoogleMapWidgetConfig() { // initialize the members m_edit = new ArrayList<CmsGoogleMapOption>(CmsGoogleMapWidgetConfig.DEFAULT_EDIT); m_inline = new ArrayList<CmsGoogleMapOption>(CmsGoogleMapWidgetConfig.DEFAULT_INLINE); m_popup = new ArrayList<CmsGoogleMapOption>(CmsGoogleMapWidgetConfig.DEFAULT_POPUP); } /** * Creates a new widget option object, configured by the given configuration String.<p> * * @param configuration configuration String to parse */ public CmsGoogleMapWidgetConfig(final String configuration) { this(); parseOptions(configuration); } /** * Adds a editable property.<p> * * @param property the property to add */ public void addEdit(final CmsGoogleMapOption property) { if (!m_edit.contains(property)) { m_edit.add(property); } } /** * Adds an inline displayed property.<p> * * @param property the property to add */ public void addInline(final CmsGoogleMapOption property) { if (!m_inline.contains(property)) { m_inline.add(property); } } /** * Adds a popup displayed property.<p> * * @param property the property to add */ public void addPopup(final CmsGoogleMapOption property) { if (!m_popup.contains(property)) { m_popup.add(property); } } /** * Returns the editable properties.<p> * * @return the editable properties */ public List<CmsGoogleMapOption> getEdit() { return Collections.unmodifiableList(m_edit); } /** * Returns only the editable properties configuration string.<p> * * @return JSON string */ public String getEditString() { final JSONObject json = new JSONObject(); final Iterator<CmsGoogleMapOption> itEdit = getEdit().iterator(); while (itEdit.hasNext()) { final CmsGoogleMapOption property = itEdit.next(); try { json.accumulate(CmsGoogleMapWidgetConfig.OPTION_EDIT, property.toString()); } catch (final JSONException e) { if (CmsGoogleMapWidgetConfig.LOG.isErrorEnabled()) { CmsGoogleMapWidgetConfig.LOG.error(e.getLocalizedMessage(), e); } } } // get the string final String res = json.toString(); // remove the curly braces return res.substring(1, res.length() - 1); } /** * Returns the properties to be displayed inline.<p> * * @return the properties to be displayed inline */ public List<CmsGoogleMapOption> getInline() { return Collections.unmodifiableList(m_inline); } /** * Returns the properties to be displayed in a popup.<p> * * @return the properties to be displayed in a popup */ public List<CmsGoogleMapOption> getPopup() { return Collections.unmodifiableList(m_popup); } /** * Checks if the given property is editable.<p> * * @param property the property to check * * @return true if the specified property is editable, otherwise false */ public boolean isEdit(final CmsGoogleMapOption property) { return m_edit.contains(property); } /** * Checks if the given property is displayed inline.<p> * * @param property the property to check * * @return true if the specified property is displayed inline, otherwise false */ public boolean isInline(final CmsGoogleMapOption property) { return m_inline.contains(property); } /** * Checks if the given property is displayed in a popup.<p> * * @param property the property to check * * @return true if the specified property is displayed in a popup, otherwise false */ public boolean isPopup(final CmsGoogleMapOption property) { return m_popup.contains(property); } /** * Removes a editable property.<p> * * @param property the property to remove */ public void removeEdit(final CmsGoogleMapOption property) { m_edit.remove(property); } /** * Removes an inline displayed property.<p> * * @param property the property to remove */ public void removeInline(final CmsGoogleMapOption property) { m_inline.remove(property); } /** * Removes a in a popup displayed property.<p> * * @param property the property to remove */ public void removePopup(final CmsGoogleMapOption property) { m_popup.remove(property); } /** * Returns a widget configuration string created from this widget option.<p> * * @return a widget configuration string created from this widget option */ @Override public String toString() { final JSONObject json = new JSONObject(); final Iterator<CmsGoogleMapOption> itInline = getInline().iterator(); while (itInline.hasNext()) { final CmsGoogleMapOption property = itInline.next(); try { json.accumulate(CmsGoogleMapWidgetConfig.OPTION_INLINE, property.toString()); } catch (final JSONException e) { if (CmsGoogleMapWidgetConfig.LOG.isErrorEnabled()) { CmsGoogleMapWidgetConfig.LOG.error(e.getLocalizedMessage(), e); } } } final Iterator<CmsGoogleMapOption> itPopup = getPopup().iterator(); while (itPopup.hasNext()) { final CmsGoogleMapOption property = itPopup.next(); try { json.accumulate(CmsGoogleMapWidgetConfig.OPTION_POPUP, property.toString()); } catch (final JSONException e) { if (CmsGoogleMapWidgetConfig.LOG.isErrorEnabled()) { CmsGoogleMapWidgetConfig.LOG.error(e.getLocalizedMessage(), e); } } } final Iterator<CmsGoogleMapOption> itEdit = getEdit().iterator(); while (itEdit.hasNext()) { final CmsGoogleMapOption property = itEdit.next(); try { json.accumulate(CmsGoogleMapWidgetConfig.OPTION_EDIT, property.toString()); } catch (final JSONException e) { if (CmsGoogleMapWidgetConfig.LOG.isErrorEnabled()) { CmsGoogleMapWidgetConfig.LOG.error(e.getLocalizedMessage(), e); } } } // get the string final String res = json.toString(); // remove the curly braces return res.substring(1, res.length() - 1); } /** * Parses the given configuration String.<p> * * @param configuration the configuration String to parse */ protected void parseOptions(final String configuration) { if (CmsStringUtil.isEmptyOrWhitespaceOnly(configuration)) { return; } try { final JSONObject json = new JSONObject("{" + configuration + "}"); if (json.has(CmsGoogleMapWidgetConfig.OPTION_INLINE)) { m_inline.clear(); final JSONArray inline = json.getJSONArray(CmsGoogleMapWidgetConfig.OPTION_INLINE); for (int i = 0; i < inline.length(); i++) { final String value = inline.getString(i); addInline(CmsGoogleMapOption.valueOf(value)); } } if (json.has(CmsGoogleMapWidgetConfig.OPTION_POPUP)) { m_popup.clear(); final JSONArray popup = json.getJSONArray(CmsGoogleMapWidgetConfig.OPTION_POPUP); for (int i = 0; i < popup.length(); i++) { final String value = popup.getString(i); addPopup(CmsGoogleMapOption.valueOf(value)); } } if (json.has(CmsGoogleMapWidgetConfig.OPTION_EDIT)) { m_edit.clear(); final JSONArray edit = json.getJSONArray(CmsGoogleMapWidgetConfig.OPTION_EDIT); for (int i = 0; i < edit.length(); i++) { final String value = edit.getString(i); addEdit(CmsGoogleMapOption.valueOf(value)); } } } catch (final JSONException e) { // something went wrong if (CmsGoogleMapWidgetConfig.LOG.isErrorEnabled()) { CmsGoogleMapWidgetConfig.LOG.error(e.getLocalizedMessage(), e); } return; } } }