/* * This library is part of OpenCms - * the Open Source Content Management System * * Copyright (c) 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 org.opencms.workplace.editors; import org.opencms.main.CmsLog; import org.opencms.widgets.I_CmsWidget; import org.opencms.widgets.Messages; import org.opencms.xml.CmsXmlException; import org.opencms.xml.content.I_CmsXmlContentValueVisitor; import org.opencms.xml.types.I_CmsXmlContentValue; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import org.apache.commons.logging.Log; /** * Visitor implementation that collects the different widgets for all visited values and all widgets for the found values.<p> * * This implementation is needed when creating the html output of the xmlcontent editor * {@link org.opencms.workplace.editors.CmsXmlContentEditor}.<p> * * @since 6.0.0 */ public class CmsXmlContentWidgetVisitor implements I_CmsXmlContentValueVisitor { /** Static reference to the log. */ private static final Log LOG = CmsLog.getLog(CmsXmlContentWidgetVisitor.class); /** The locale to get the values from. */ private Locale m_locale; /** The unique widgets found in the XML content. */ private List<I_CmsWidget> m_uniqueWidgets; /** The values corresponding to the found widgets. */ private Map<String, I_CmsXmlContentValue> m_values; /** The widgets found in the XML content. */ private Map<String, I_CmsWidget> m_widgets; /** * Creates a new widget collector node visitor.<p> */ public CmsXmlContentWidgetVisitor() { initialize(null); } /** * Creates a new widget collector node visitor.<p> * * @param locale the Locale to get the widgets from */ public CmsXmlContentWidgetVisitor(Locale locale) { initialize(locale); } /** * Returns the locale to get the widgets from.<p> * * @return the locale to get the widgets from */ public Locale getLocale() { return m_locale; } /** * Returns the unique widgets that were found in the content.<p> * * @return the unique widgets that were found in the content */ public List getUniqueWidgets() { return m_uniqueWidgets; } /** * Returns all simple values that were found in the content.<p> * * The map key is the complete xpath of the value.<p> * * @return all simple values that were found in the content */ public Map<String, I_CmsXmlContentValue> getValues() { return m_values; } /** * Returns all widgets that were found in the content.<p> * * The map key is the complete xpath of the corresponding value.<p> * * @return all widgets that were found in the content */ public Map<String, I_CmsWidget> getWidgets() { return m_widgets; } /** * @see org.opencms.xml.content.I_CmsXmlContentValueVisitor#visit(org.opencms.xml.types.I_CmsXmlContentValue) */ public void visit(I_CmsXmlContentValue value) { if (LOG.isDebugEnabled()) { LOG.debug(org.opencms.workplace.editors.Messages.get().getBundle().key( org.opencms.workplace.editors.Messages.LOG_VISITING_1, value.getPath())); } if (value.isSimpleType()) { // only visit simple values boolean useLocale = m_locale != null; if ((useLocale && (value.getLocale().equals(getLocale()))) || (!useLocale)) { try { // get widget for value I_CmsWidget widget = value.getContentDefinition().getContentHandler().getWidget(value); if (!m_uniqueWidgets.contains(widget)) { m_uniqueWidgets.add(widget); } m_widgets.put(value.getPath(), widget); m_values.put(value.getPath(), value); if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key( Messages.LOG_DEBUG_WIDGETCOLLECTOR_ADD_1, value.getPath())); } } catch (CmsXmlException e) { // should usually not happen if (LOG.isErrorEnabled()) { LOG.error(Messages.get().getBundle().key(Messages.ERR_WIDGETCOLLECTOR_ADD_1, value), e); } } } } } /** * Initializes the necessary members of the collector.<p> * * @param locale the Locale to get the widgets from */ private void initialize(Locale locale) { // start with a new instance of the widgets and unique widgets m_widgets = new HashMap<String, I_CmsWidget>(25); m_uniqueWidgets = new ArrayList<I_CmsWidget>(12); m_values = new HashMap<String, I_CmsXmlContentValue>(25); // store Locale to use when collecting the widgets m_locale = locale; } }