/* * Copyright (C) 2003-2011 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.wcm.webui.seo; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; import javax.jcr.Node; import javax.jcr.RepositoryException; import org.apache.commons.lang.StringUtils; import org.exoplatform.container.ExoContainer; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.portal.application.PortalRequestContext; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.portal.webui.workspace.UIPortalApplication; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.resources.LocaleConfig; import org.exoplatform.services.resources.LocaleConfigService; import org.exoplatform.services.seo.PageMetadataModel; import org.exoplatform.services.seo.SEOService; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.exoplatform.wcm.webui.validator.FloatNumberValidator; import org.exoplatform.web.application.ApplicationMessage; import org.exoplatform.web.url.navigation.NavigationResource; import org.exoplatform.web.url.navigation.NodeURL; import org.exoplatform.webui.application.WebuiRequestContext; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIApplication; import org.exoplatform.webui.core.UIPopupContainer; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; import org.exoplatform.webui.core.model.SelectItemOption; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.Event.Phase; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.form.UIForm; import org.exoplatform.webui.form.UIFormSelectBox; import org.exoplatform.webui.form.UIFormStringInput; import org.exoplatform.webui.form.UIFormTextAreaInput; import org.exoplatform.webui.form.input.UICheckBoxInput; /** * Created by The eXo Platform SAS * Author : eXoPlatform * exo@exoplatform.com * Jun 17, 2011 */ @ComponentConfig(lifecycle = UIFormLifecycle.class, template = "classpath:groovy/webui/seo/UISEOForm.gtmpl", events = { @EventConfig(listeners = UISEOForm.SaveActionListener.class), @EventConfig(phase=Phase.DECODE, listeners = UISEOForm.RefreshActionListener.class), @EventConfig(phase=Phase.DECODE, listeners = UISEOForm.UpdateActionListener.class), @EventConfig(listeners = UISEOForm.RemoveActionListener.class, confirm = "UISEOForm.msg.confirm-delete"), @EventConfig(phase=Phase.DECODE, listeners = UISEOForm.CancelActionListener.class) }) public class UISEOForm extends UIForm{ public static final String TITLE = "title"; public static final String DESCRIPTION = "description"; public static final String KEYWORDS = "keywords"; final static public String LANGUAGE_TYPE = "language" ; public static final String ROBOTS = "robots"; public static final String SITEMAP = "sitemap"; public static final String ISINHERITED = "isInherited"; public static final String SITEMAP_VISIBLE = "sitemapvisible"; public static final String PRIORITY = "priority"; public static final String FREQUENCY = "frequency"; public static final String ROBOTS_INDEX = "INDEX"; public static final String ROBOTS_FOLLOW = "FOLLOW"; public static final String FREQUENCY_DEFAULT_VALUE = "Always"; String title = ""; String description = ""; String keywords = ""; String priority = ""; String frequency = ""; String index = ""; String follow = ""; boolean sitemap = true; boolean inherited = false; private static String contentPath = null; private static String contentURI = null; private boolean onContent = false; private boolean isInherited = false; private ArrayList<String> paramsArray = null; public static List<Locale> seoLocales = null; public static List<String> seoLanguages = new ArrayList<String>(); private String selectedLanguage = null; private String defaultLanguage = null; private boolean isAddNew = true; private static final Log LOG = ExoLogger.getLogger(UISEOForm.class.getName()); public String getContentPath() { return this.contentPath; } public void setContentPath(String contentPath) { this.contentPath = contentPath; } public String getContentURI() { return this.contentURI; } public void setContentURI(String contentURI) { this.contentURI = contentURI; } public boolean getOnContent() { return this.onContent; } public void setOnContent(boolean onContent) { this.onContent = onContent; } public boolean getIsInherited() { return this.isInherited; } public void setIsInherited(boolean isInherited) { this.isInherited = isInherited; } public ArrayList<String> getParamsArray() { return this.paramsArray; } public void setSEOLanguages(ArrayList<Locale> seoLocales) { this.seoLocales = seoLocales; } public List<Locale> getSEOLanguages() { return this.seoLocales; } public void setParamsArray(ArrayList<String> params) { this.paramsArray = params; } public String getSelectedLanguage() { return selectedLanguage; } public void setSelectedLanguage(String selectedLanguage) { this.selectedLanguage = selectedLanguage; } public void setIsAddNew(boolean isAddNew) { this.isAddNew = isAddNew; } public boolean getIsAddNew() { return this.isAddNew; } /*public String getPageParent() { if(pageParent != null && pageParent.length() > 0) return pageParent.trim(); return pageParent; } public void setPageParent(String pageParent) { this.pageParent = pageParent; }*/ public UISEOForm() throws Exception { PortalRequestContext portalRequestContext = Util.getPortalRequestContext(); ExoContainer container = ExoContainerContext.getCurrentContainer() ; SEOService seoService = (SEOService)container.getComponentInstanceOfType(SEOService.class); UIFormTextAreaInput uiTitle = new UIFormTextAreaInput(TITLE, TITLE, null); uiTitle.setValue(title); addUIFormInput(uiTitle); UIFormTextAreaInput uiDescription = new UIFormTextAreaInput(DESCRIPTION, DESCRIPTION, null); uiDescription.setValue(description); addUIFormInput(uiDescription); UIFormTextAreaInput uiKeywords = new UIFormTextAreaInput(KEYWORDS, KEYWORDS, null); uiKeywords.setValue(keywords); addUIFormInput(uiKeywords); seoLocales = seoService.getSEOLanguages(portalRequestContext.getPortalOwner(), contentPath, onContent); seoLanguages = new ArrayList<String>(); if(seoLocales != null && seoLocales.size() > 0) { for (Locale locale : seoLocales) { StringBuffer sb = new StringBuffer(); sb.append(locale.getLanguage()); String country = locale.getCountry(); if(StringUtils.isNotEmpty(country)) sb.append("_").append(country); seoLanguages.add(sb.toString()); } } if(seoLanguages != null) Collections.sort(seoLanguages); UIFormSelectBox uiSelectForm = new UIFormSelectBox(LANGUAGE_TYPE, LANGUAGE_TYPE, getLanguages()) ; uiSelectForm.setOnChange("Refresh"); defaultLanguage = portalRequestContext.getLocale().getLanguage(); if(StringUtils.isNotEmpty(portalRequestContext.getLocale().getCountry())) defaultLanguage += "_" + portalRequestContext.getLocale().getCountry(); selectedLanguage = defaultLanguage; if(seoLanguages == null || !seoLanguages.contains(defaultLanguage)) uiSelectForm.setValue(defaultLanguage); addUIFormInput(uiSelectForm) ; if(!onContent) { List<SelectItemOption<String>> robotIndexItemOptions = new ArrayList<SelectItemOption<String>>(); List<String> robotsindexOptions = seoService.getRobotsIndexOptions(); List<String> robotsfollowOptions = seoService.getRobotsFollowOptions(); List<String> frequencyOptions = seoService.getFrequencyOptions(); if(robotsindexOptions != null && robotsindexOptions.size() > 0) { for(int i = 0; i < robotsindexOptions.size(); i++) { robotIndexItemOptions.add(new SelectItemOption<String>((robotsindexOptions.get(i).toString()))); } } UIFormSelectBox robots_index = new UIFormSelectBox(ROBOTS_INDEX, null, robotIndexItemOptions); if(index != null && index.length() > 0) robots_index.setValue(index); else robots_index.setValue(ROBOTS_INDEX); addUIFormInput(robots_index); List<SelectItemOption<String>> robotFollowItemOptions = new ArrayList<SelectItemOption<String>>(); if(robotsfollowOptions != null && robotsfollowOptions.size() > 0) { for(int i = 0; i < robotsfollowOptions.size(); i++) { robotFollowItemOptions.add(new SelectItemOption<String>((robotsfollowOptions.get(i).toString()))); } } UIFormSelectBox robots_follow = new UIFormSelectBox(ROBOTS_FOLLOW, null, robotFollowItemOptions); if(follow != null && follow.length() > 0) robots_follow.setValue(follow); else robots_follow.setValue(ROBOTS_FOLLOW); addUIFormInput(robots_follow); UICheckBoxInput visibleSitemapCheckbox = new UICheckBoxInput(SITEMAP, SITEMAP, sitemap); addUIFormInput(visibleSitemapCheckbox); UIFormStringInput uiPrority = new UIFormStringInput(PRIORITY, null); if(!StringUtils.isEmpty(priority)) uiPrority.setValue(priority); addUIFormInput(uiPrority.addValidator(FloatNumberValidator.class)); List<SelectItemOption<String>> frequencyItemOptions = new ArrayList<SelectItemOption<String>>(); if (frequencyOptions != null && frequencyOptions.size() > 0) { for (int i = 0; i < frequencyOptions.size(); i++) { frequencyItemOptions.add(new SelectItemOption<String>(frequencyOptions.get(i).toString(), (frequencyOptions.get(i).toString()))); } } UIFormSelectBox frequencySelectbox = new UIFormSelectBox(FREQUENCY, null, frequencyItemOptions); if(frequency != null && frequency.length() > 0) frequencySelectbox.setValue(frequency); else frequencySelectbox.setValue(FREQUENCY_DEFAULT_VALUE); addUIFormInput(frequencySelectbox); } setActions(new String[]{"Save", "Cancel"}); } public void initSEOForm(PageMetadataModel pageModel) throws Exception{ PortalRequestContext portalRequestContext = Util.getPortalRequestContext(); if(pageModel != null) { title = pageModel.getTitle(); description = pageModel.getDescription(); keywords = pageModel.getKeywords(); frequency = pageModel.getFrequency(); if(pageModel.getPriority() >= 0) priority = String.valueOf(pageModel.getPriority()); else priority = null; if(pageModel.getRobotsContent() != null && pageModel.getRobotsContent().length() > 0) { index = pageModel.getRobotsContent().split(",")[0].trim(); follow = pageModel.getRobotsContent().split(",")[1].trim(); } sitemap = pageModel.getSitemap(); } else { if(!onContent) title = portalRequestContext.getTitle(); else title = ""; description = ""; keywords = ""; priority = ""; frequency = ""; index = ""; follow = ""; sitemap = true; } ExoContainer container = ExoContainerContext.getCurrentContainer() ; SEOService seoService = (SEOService)container.getComponentInstanceOfType(SEOService.class); UIFormTextAreaInput uiTitle = this.getUIFormTextAreaInput(TITLE); if(uiTitle != null) uiTitle.setValue(title); UIFormTextAreaInput uiDescription = this.getUIFormTextAreaInput(DESCRIPTION); if(uiDescription != null) uiDescription.setValue(description); UIFormTextAreaInput uiKeywords = this.getUIFormTextAreaInput(KEYWORDS); if(uiKeywords != null) uiKeywords.setValue(keywords); UIFormSelectBox uiSelectForm = this.getUIFormSelectBox(LANGUAGE_TYPE); uiSelectForm.setSelectedValues(new String[] {"language"}); if(uiSelectForm != null) { seoLocales = seoService.getSEOLanguages(portalRequestContext.getPortalOwner(), contentPath, onContent); seoLanguages = new ArrayList<String>(); if(seoLocales != null && seoLocales.size() > 0) { for (Locale locale : seoLocales) { StringBuffer sb = new StringBuffer(); sb.append(locale.getLanguage()); String country = locale.getCountry(); if(StringUtils.isNotEmpty(country)) sb.append("_").append(country); seoLanguages.add(sb.toString()); } } if(seoLanguages.size() <= 0) setSelectedLanguage(null); List<SelectItemOption<String>> languages = getLanguages(); if(languages.size() == 1) this.setIsAddNew(false); else this.setIsAddNew(true); uiSelectForm.setOptions(languages); uiSelectForm.setValue(selectedLanguage); } if(!onContent) { List<SelectItemOption<String>> robotIndexItemOptions = new ArrayList<SelectItemOption<String>>(); List<String> robotsindexOptions = seoService.getRobotsIndexOptions(); List<String> robotsfollowOptions = seoService.getRobotsFollowOptions(); List<String> frequencyOptions = seoService.getFrequencyOptions(); if(robotsindexOptions != null && robotsindexOptions.size() > 0) { for(int i = 0; i < robotsindexOptions.size(); i++) { robotIndexItemOptions.add(new SelectItemOption<String>((robotsindexOptions.get(i).toString()))); } } UIFormSelectBox robots_index = this.getUIFormSelectBox(ROBOTS_INDEX); if(robots_index != null) { if(index != null && index.length() > 0) robots_index.setValue(index); else robots_index.setValue(ROBOTS_INDEX); } List<SelectItemOption<String>> robotFollowItemOptions = new ArrayList<SelectItemOption<String>>(); if(robotsfollowOptions != null && robotsfollowOptions.size() > 0) { for(int i = 0; i < robotsfollowOptions.size(); i++) { robotFollowItemOptions.add(new SelectItemOption<String>((robotsfollowOptions.get(i).toString()))); } } UIFormSelectBox robots_follow = this.getUIFormSelectBox(ROBOTS_FOLLOW); if(robots_follow != null) { if(follow != null && follow.length() > 0) robots_follow.setValue(follow); else robots_follow.setValue(ROBOTS_FOLLOW); } UICheckBoxInput visibleSitemapCheckbox = this.getUICheckBoxInput(SITEMAP); if(visibleSitemapCheckbox != null) visibleSitemapCheckbox.setChecked(sitemap); UIFormStringInput uiPrority = this.getUIStringInput(PRIORITY); if(uiPrority != null) { if(!StringUtils.isEmpty(priority)) uiPrority.setValue(priority); else uiPrority.setValue(""); } List<SelectItemOption<String>> frequencyItemOptions = new ArrayList<SelectItemOption<String>>(); if (frequencyOptions != null && frequencyOptions.size() > 0) { for (int i = 0; i < frequencyOptions.size(); i++) { frequencyItemOptions.add(new SelectItemOption<String>(frequencyOptions.get(i).toString(), (frequencyOptions.get(i).toString()))); } } UIFormSelectBox frequencySelectbox = this.getUIFormSelectBox(FREQUENCY); if(frequencySelectbox != null) { if(frequency != null && frequency.length() > 0) frequencySelectbox.setValue(frequency); else frequencySelectbox.setValue(FREQUENCY_DEFAULT_VALUE); } } } public static class SaveActionListener extends EventListener<UISEOForm> { public void execute(Event<UISEOForm> event) throws Exception { UISEOForm uiForm = event.getSource(); UIApplication uiApp = uiForm.getAncestorOfType(UIApplication.class) ; String description = uiForm.getUIFormTextAreaInput(DESCRIPTION).getValue(); String keywords = uiForm.getUIFormTextAreaInput(KEYWORDS).getValue() ; PortalRequestContext portalRequestContext = Util.getPortalRequestContext(); String lang = null; if(uiForm.getSelectedLanguage() != null) lang = uiForm.getSelectedLanguage(); else { lang = uiForm.getUIFormSelectBox(LANGUAGE_TYPE).getValue() ; StringBuffer sb = new StringBuffer(); if(lang == null || lang.equals(LANGUAGE_TYPE)) { lang = portalRequestContext.getLocale().getLanguage(); sb.append(portalRequestContext.getLocale().getLanguage()); if(StringUtils.isNotEmpty(portalRequestContext.getLocale().getCountry())) sb.append("_").append(portalRequestContext.getLocale().getCountry()); lang = sb.toString(); } } uiForm.setSelectedLanguage(lang); String portalName = portalRequestContext.getPortalOwner(); String uri = portalRequestContext.createURL(NodeURL.TYPE, new NavigationResource(Util.getUIPortal().getSelectedUserNode())).toString(); String fullStatus = null; String pageReference = Util.getUIPortal().getSelectedUserNode().getPageRef().format(); if(!uiForm.onContent) { String title = uiForm.getUIFormTextAreaInput(TITLE).getValue(); String robots_index = uiForm.getUIFormSelectBox(ROBOTS_INDEX).getValue() ; String robots_follow = uiForm.getUIFormSelectBox(ROBOTS_FOLLOW).getValue() ; String rebots_content = robots_index + ", " + robots_follow; boolean isVisibleSitemap = uiForm.getUICheckBoxInput(SITEMAP).isChecked(); float priority = -1; if(uiForm.getUIStringInput(PRIORITY).getValue() != null && uiForm.getUIStringInput(PRIORITY).getValue().length() > 0) { priority = Float.parseFloat(uiForm.getUIStringInput(PRIORITY).getValue()) ; if(priority < 0.0 || priority > 1.0) { uiApp.addMessage(new ApplicationMessage("FloatNumberValidator.msg.Invalid-number", null, ApplicationMessage.WARNING)); return; } } String frequency = uiForm.getUIFormSelectBox(FREQUENCY).getValue() ; try { PageMetadataModel metaModel = new PageMetadataModel(); metaModel.setTitle(title); metaModel.setDescription(description); metaModel.setFrequency(frequency); metaModel.setKeywords(keywords); metaModel.setPriority(priority); metaModel.setRobotsContent(rebots_content); metaModel.setSiteMap(isVisibleSitemap); metaModel.setUri(uri); metaModel.setPageReference(pageReference); if(description!= null && keywords != null && priority != -1) fullStatus = "Full"; else fullStatus = "Partial"; metaModel.setFullStatus(fullStatus); SEOService seoService = uiForm.getApplicationComponent(SEOService.class); seoService.storeMetadata(metaModel, portalName, uiForm.onContent, uiForm.getSelectedLanguage()); uiForm.initSEOForm(metaModel); if(uiForm.getAncestorOfType(UISEOToolbarPortlet.class) != null) event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getAncestorOfType(UISEOToolbarPortlet.class)) ; else { event.getRequestContext().addUIComponentToUpdateByAjax(uiForm); event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getAncestorOfType(UIPopupContainer.class).getParent()); } } catch (Exception ex) { if (LOG.isErrorEnabled()) { LOG.error("Unexpected error ", ex); } uiApp.addMessage(new ApplicationMessage("UISEOForm.msg.repository-exception", null, ApplicationMessage.ERROR)); return; } } else { try { PageMetadataModel metaModel = new PageMetadataModel(); metaModel.setDescription(description); metaModel.setKeywords(keywords); metaModel.setUri(uri); metaModel.setPageReference(pageReference); if(description != null && keywords != null) fullStatus = "Full"; else fullStatus = "Partial"; metaModel.setFullStatus(fullStatus); SEOService seoService = uiForm.getApplicationComponent(SEOService.class); Node contentNode = null; for(int i=0;i<uiForm.paramsArray.size(); i++) { String contentPath = uiForm.paramsArray.get(i).toString(); contentNode = seoService.getContentNode(contentPath); if(contentNode != null) break; } metaModel.setUri(contentNode.getUUID()); seoService.storeMetadata(metaModel, portalName, uiForm.onContent, uiForm.getSelectedLanguage()); uiForm.initSEOForm(metaModel); if(uiForm.getAncestorOfType(UISEOToolbarPortlet.class) != null) event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getAncestorOfType(UISEOToolbarPortlet.class)) ; else { event.getRequestContext().addUIComponentToUpdateByAjax(uiForm); event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getAncestorOfType(UIPopupContainer.class).getParent()); } } catch (RepositoryException ex) { if (LOG.isErrorEnabled()) { LOG.error("Unexpected error ", ex); } uiApp.addMessage(new ApplicationMessage("UISEOForm.msg.repository-exception", null, ApplicationMessage.ERROR)); return; } } } } public static class CancelActionListener extends EventListener<UISEOForm> { public void execute(Event<UISEOForm> event) throws Exception { UISEOForm uiSEO = event.getSource(); UIPopupContainer uiSEOToolbar = uiSEO.getAncestorOfType(UIPopupContainer.class); if(uiSEOToolbar != null) uiSEOToolbar.removeChildById(UISEOToolbarForm.SEO_POPUP_WINDOW); } } public static class RefreshActionListener extends EventListener<UISEOForm> { public void execute(Event<UISEOForm> event) throws Exception { PortalRequestContext portalRequestContext = Util.getPortalRequestContext(); UISEOForm uiForm = event.getSource(); String portalName = portalRequestContext.getPortalOwner(); String lang = uiForm.getUIFormSelectBox(LANGUAGE_TYPE).getValue(); if(lang.equals("language")) return; uiForm.setSelectedLanguage(lang); String pageReference = Util.getUIPortal().getSelectedUserNode().getPageRef().format(); SEOService seoService = uiForm.getApplicationComponent(SEOService.class); PageMetadataModel seoData = new PageMetadataModel(); PageMetadataModel metaModel = seoService.getMetadata(uiForm.paramsArray, pageReference, uiForm.defaultLanguage); if(metaModel == null) metaModel = new PageMetadataModel(); if(uiForm.onContent) { seoData.setUri(uiForm.getContentURI()); metaModel.setUri(uiForm.getContentURI()); } else { seoData.setPageReference(pageReference); seoData.setTitle(portalRequestContext.getTitle()); metaModel.setTitle(portalRequestContext.getTitle()); } seoData.setFullStatus("Empty"); seoService.storeMetadata(seoData, portalName, uiForm.onContent, lang); uiForm.initSEOForm(metaModel); event.getRequestContext().addUIComponentToUpdateByAjax(uiForm) ; } } public static class UpdateActionListener extends EventListener<UISEOForm> { public void execute(Event<UISEOForm> event) throws Exception { UISEOForm uiForm = event.getSource(); String lang = event.getRequestContext().getRequestParameter(OBJECTID) ; uiForm.setSelectedLanguage(lang); SEOService seoService = uiForm.getApplicationComponent(SEOService.class); PageMetadataModel metaModel = new PageMetadataModel(); String pageReference = Util.getUIPortal().getSelectedUserNode().getPageRef().format(); metaModel = seoService.getMetadata(uiForm.paramsArray, pageReference, lang); if(metaModel == null || (metaModel != null && metaModel.getFullStatus().equals("Empty"))) { metaModel = seoService.getMetadata(uiForm.paramsArray, pageReference, uiForm.defaultLanguage); } uiForm.initSEOForm(metaModel); event.getRequestContext().addUIComponentToUpdateByAjax(uiForm) ; } } public static class RemoveActionListener extends EventListener<UISEOForm> { public void execute(Event<UISEOForm> event) throws Exception { UISEOForm uiForm = event.getSource(); PortalRequestContext portalRequestContext = Util.getPortalRequestContext(); String lang = event.getRequestContext().getRequestParameter(OBJECTID) ; SEOService seoService = uiForm.getApplicationComponent(SEOService.class); PageMetadataModel metaModel = new PageMetadataModel(); String pageReference = Util.getUIPortal().getSelectedUserNode().getPageRef().format(); metaModel.setPageReference(pageReference); if(uiForm.onContent) { Node contentNode = null; for(int i=0;i<uiForm.paramsArray.size(); i++) { String contentPath = uiForm.paramsArray.get(i).toString(); contentNode = seoService.getContentNode(contentPath); if(contentNode != null) break; } if(contentNode != null) metaModel.setUri(contentNode.getUUID()); } String portalName = portalRequestContext.getPortalOwner(); seoService.removePageMetadata(metaModel, portalName, uiForm.onContent, lang); seoLocales = seoService.getSEOLanguages(portalRequestContext.getPortalOwner(), contentPath, uiForm.onContent); seoLanguages = new ArrayList<String>(); for (Locale locale : seoLocales) { StringBuffer sb = new StringBuffer(); sb.append(locale.getLanguage()); String country = locale.getCountry(); if(StringUtils.isNotEmpty(country)) sb.append("_").append(country); seoLanguages.add(sb.toString()); } String laguageFocus = uiForm.defaultLanguage; if(seoLanguages.size()> 0 && !seoLanguages.contains(uiForm.defaultLanguage)) laguageFocus = seoLanguages.get(0); metaModel = seoService.getMetadata(uiForm.paramsArray, pageReference, laguageFocus); if(metaModel != null) uiForm.setSelectedLanguage(laguageFocus); else uiForm.getUIFormSelectBox(LANGUAGE_TYPE).setValue(uiForm.defaultLanguage); uiForm.initSEOForm(metaModel); if(uiForm.getAncestorOfType(UISEOToolbarPortlet.class) != null) event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getAncestorOfType(UISEOToolbarPortlet.class)) ; else { event.getRequestContext().addUIComponentToUpdateByAjax(uiForm); event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getAncestorOfType(UIPopupContainer.class).getParent()); } } } public List<SelectItemOption<String>> getLanguages() throws Exception { WebuiRequestContext rc = WebuiRequestContext.getCurrentInstance(); Locale inLocale = WebuiRequestContext.getCurrentInstance().getLocale(); // Get default locale Locale defaultLocale = Locale.getDefault(); // set default locale to current user selected language Locale.setDefault(Util.getUIPortal().getAncestorOfType(UIPortalApplication.class).getLocale()); LocaleConfigService localService = WCMCoreUtils.getService(LocaleConfigService.class) ; List<SelectItemOption<String>> languages = new ArrayList<SelectItemOption<String>>() ; Iterator<LocaleConfig> iter = localService.getLocalConfigs().iterator() ; ResourceBundle resourceBundle = rc.getApplicationResourceBundle(); while (iter.hasNext()) { LocaleConfig localConfig = iter.next() ; Locale locale = localConfig.getLocale(); StringBuffer sb = new StringBuffer(); sb.append(locale.getLanguage()); String country = locale.getCountry(); if(StringUtils.isNotEmpty(country)) sb.append("_").append(country); String lang = sb.toString(); if(seoLanguages == null || !seoLanguages.contains(lang)) { try { languages.add(new SelectItemOption<String>(CapitalFirstLetters(locale.getDisplayName(inLocale)), lang)) ; } catch(MissingResourceException mre) { languages.add(new SelectItemOption<String>(lang, lang)) ; } } } // Set back to the default locale Locale.setDefault(defaultLocale); Collections.sort(languages, new ItemOptionComparator()); languages.add(0,new SelectItemOption<String>(getLabel(resourceBundle, "select-language"), "language")) ; return languages ; } public String CapitalFirstLetters(String str) { str = Character.toString(str.charAt(0)).toUpperCase()+str.substring(1); return str; } class ItemOptionComparator implements Comparator<SelectItemOption<String>> { @Override public int compare(SelectItemOption<String> o1, SelectItemOption<String> o2) { return o1.getLabel().compareTo(o2.getLabel()); } } class SEOItemComparator implements Comparator<Locale> { @Override public int compare(Locale locale1, Locale locale2) { return locale1.getDisplayLanguage().compareTo(locale2.getDisplayLanguage()); } } }