/*
* 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 org.apache.commons.lang.StringUtils;
import org.exoplatform.portal.application.PortalRequestContext;
import org.exoplatform.portal.mop.SiteKey;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.services.jcr.util.Text;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.seo.PageMetadataModel;
import org.exoplatform.services.seo.SEOService;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.wcm.webui.Utils;
import org.exoplatform.wcm.webui.reader.ContentReader;
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.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIForm;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Locale;
/**
* Created by The eXo Platform SAS
* Author : eXoPlatform
* exo@exoplatform.com
* Jul 4, 2011
*/
@ComponentConfig(lifecycle = UIFormLifecycle.class,
template = "classpath:groovy/webui/seo/UISEOPortletToolbar.gtmpl", events = {
@EventConfig(listeners = UISEOToolbarForm.AddSEOActionListener.class)
})
public class UISEOToolbarForm extends UIForm {
/** The Constant SEO_POPUP_WINDOW. */
public static final String SEO_POPUP_WINDOW = "UISEOPopupWindow";
private static ArrayList<String> paramsArray = null;
//private static String pageParent = null;
private static String pageReference = null;
private static PageMetadataModel metaModel = null;
private String fullStatus = "Empty";
private String lang = null;
private static final Log LOG = ExoLogger.getLogger(UISEOToolbarForm.class.getName());
public UISEOToolbarForm() throws Exception
{
}
public static class AddSEOActionListener extends EventListener<UISEOToolbarForm> {
public void execute(Event<UISEOToolbarForm> event) throws Exception {
UISEOToolbarForm uiSEOToolbar = event.getSource();
PortalRequestContext portalRequestContext = Util.getPortalRequestContext();
UISEOForm uiSEOForm = uiSEOToolbar.createUIComponent(UISEOForm.class, null, null);
String params = event.getRequestContext().getRequestParameter(OBJECTID);
SEOService seoService = WCMCoreUtils.getService(SEOService.class);
if(paramsArray != null) {
for(int i = 0;i < paramsArray.size();i++) {
Node contentNode = seoService.getContentNode(paramsArray.get(i).toString());
if(contentNode != null) {
uiSEOForm.setOnContent(true);
uiSEOForm.setContentPath(paramsArray.get(i).toString());
uiSEOForm.setContentURI(contentNode.getUUID());
break;
}
}
metaModel = seoService.getContentMetadata(paramsArray, uiSEOToolbar.lang);
} else {
uiSEOForm.setContentPath(pageReference);
uiSEOForm.setOnContent(false);
metaModel = seoService.getPageMetadata(pageReference, uiSEOToolbar.lang);
}
uiSEOForm.setParamsArray(paramsArray);
if(metaModel == null) {
//If have node seo data for default language, displaying seo data for the first language in the list
List<Locale> seoLocales = new ArrayList<Locale>();
seoLocales = seoService.getSEOLanguages(portalRequestContext.getPortalOwner(), uiSEOForm.getContentPath(),
uiSEOForm.getOnContent());
if(seoLocales.size()> 0) {
Locale locale = seoLocales.get(0);
StringBuffer sb = new StringBuffer();
sb.append(locale.getLanguage());
String country = locale.getCountry();
if(StringUtils.isNotEmpty(country)) sb.append("_").append(country);
String lang = sb.toString();
metaModel = seoService.getMetadata(uiSEOForm.getParamsArray(), pageReference, lang);
uiSEOForm.setSelectedLanguage(lang);
}
}
uiSEOForm.initSEOForm(metaModel);
int top = -1;
int left = -1;
if(params != null && params.length() > 0) {
String[] arrCoordinate = params.split(",");
if(arrCoordinate != null && arrCoordinate.length == 2) {
top = Integer.parseInt(arrCoordinate[0]);
left = Integer.parseInt(arrCoordinate[1]);
}
}
Utils.createPopupWindow(uiSEOToolbar, uiSEOForm, SEO_POPUP_WINDOW, true, 640);
}
}
public void processRender(WebuiRequestContext context) throws Exception {
PortalRequestContext pcontext = Util.getPortalRequestContext();
StringBuffer sb = new StringBuffer();
sb.append(pcontext.getLocale().getLanguage());
if(StringUtils.isNotEmpty(pcontext.getLocale().getCountry()))
sb.append("_").append(pcontext.getLocale().getCountry());
lang = sb.toString();
String portalName = pcontext.getPortalOwner();
metaModel = null;
fullStatus = "Empty";
if (!pcontext.useAjax()) {
paramsArray = null;
String contentParam = null;
Enumeration params = pcontext.getRequest().getParameterNames();
if(params.hasMoreElements()) {
paramsArray = new ArrayList<String>();
while(params.hasMoreElements()) {
contentParam = params.nextElement().toString();
String contentValue = "";
try {
contentValue = Text.unescape(pcontext.getRequestParameter(contentParam));
} catch(Exception ex) {
contentValue = pcontext.getRequestParameter(contentParam);
}
contentValue = ContentReader.getXSSCompatibilityContent(contentValue);
if(paramsArray !=null) {
paramsArray.add(contentValue);
}
}
}
}
SEOService seoService = WCMCoreUtils.getService(SEOService.class);
pageReference = Util.getUIPortal().getSelectedUserNode().getPageRef().format();
if(pageReference != null) {
SiteKey siteKey = Util.getUIPortal().getSelectedUserNode().getNavigation().getKey();
SiteKey portalKey = SiteKey.portal(portalName);
if(siteKey != null && siteKey.equals(portalKey)) {
metaModel = seoService.getPageMetadata(pageReference, lang);
//pageParent = Util.getUIPortal().getSelectedUserNode().getParent().getPageRef();
if(paramsArray != null) {
PageMetadataModel tmpModel = null;
try{
tmpModel = seoService.getContentMetadata(paramsArray,lang);
}catch(PathNotFoundException ex) {
if (LOG.isErrorEnabled()) {
LOG.error("Cannot found the content metadata", ex);
}
}
if(tmpModel != null) {
metaModel = tmpModel;
} else {
try {
for(int i = 0;i < paramsArray.size();i++) {
Node contentNode = seoService.getContentNode(paramsArray.get(i).toString());
if(contentNode != null ) {
metaModel = null;
break;
}
}
}catch(PathNotFoundException ex) {
metaModel = null;
}
}
}
}
else fullStatus = "Disabled";
}
if(metaModel != null)
fullStatus = metaModel.getFullStatus();
super.processRender(context);
}
public String getFullStatus() {
return this.fullStatus;
}
}