/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use
* this file except in compliance with the License. You may obtain a copy of the License at the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apereo.portal.rest.layout;
import com.fasterxml.jackson.annotation.JsonRawValue;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang.StringUtils;
import org.apereo.portal.portlet.om.IPortletDefinition;
import org.apereo.portal.portlet.om.IPortletDefinitionParameter;
import org.apereo.portal.portlet.om.IPortletPreference;
public class LayoutPortlet {
private static final String CONTENT_PORTLET_PREFERENCE = "content";
private static final String PITHY_CONTENT_PORTLET_PREFERENCE = "pithyContent";
private static final String WIDGET_URL_PORLTET_PREFERENCE = "widgetURL";
private static final String WIDGET_TYPE_PORTLET_PREFERENCE = "widgetType";
private static final String WIDGET_CONFIG_PORTLET_PREFERENCE = "widgetConfig";
private static final String WIDGET_TEMPLATE_PORTLET_PREFERENCE = "widgetTemplate";
private static final String RENDER_ON_WEB_PORTLET_PREFERENCE = "renderOnWeb";
private static final String STATIC_CONTENT_PORTLET_WEBAPP_NAME = "/SimpleContentPortlet";
private String nodeId;
private String title;
private String description;
private String url;
private String iconUrl;
private String faIcon;
private String fname;
private String target;
private String widgetURL;
private String widgetType;
private String widgetTemplate;
@JsonRawValue private Object widgetConfig;
private boolean isAltMaxUrl = false;
private boolean isRenderOnWeb;
/** Fuller static content that you might display in a lightbox or so. */
private String staticContent;
/** Pithy static content that you might display on a dashboard mosaic view or so. */
private String pithyStaticContent;
public LayoutPortlet() {}
public LayoutPortlet(IPortletDefinition portletDef) {
if (portletDef != null) {
nodeId = "-1";
title = portletDef.getTitle();
description = portletDef.getDescription();
fname = portletDef.getFName();
url = portletDef.getAlternativeMaximizedLink(); //todo get normal URL if alt is missing
target = portletDef.getTarget();
isAltMaxUrl = StringUtils.isNotBlank(url);
IPortletDefinitionParameter iconParam = portletDef.getParameter("iconUrl");
if (iconParam != null) {
this.setIconUrl(iconParam.getValue());
}
IPortletDefinitionParameter faIconParam = portletDef.getParameter("faIcon");
if (faIconParam != null) {
this.setFaIcon(faIconParam.getValue());
}
boolean[] efficencyFlag = {false, false, false, false, false, false, false};
efficencyFlag[0] =
!(portletDef.getPortletDescriptorKey() != null
&& STATIC_CONTENT_PORTLET_WEBAPP_NAME.equals(
portletDef.getPortletDescriptorKey().getWebAppName()));
for (IPortletPreference pref : portletDef.getPortletPreferences()) {
if (!efficencyFlag[0]
&& CONTENT_PORTLET_PREFERENCE.equals(pref.getName())
&& pref.getValues().length == 1) {
this.setStaticContent(pref.getValues()[0]);
efficencyFlag[0] = true;
} else if (!efficencyFlag[1]
&& PITHY_CONTENT_PORTLET_PREFERENCE.equals(pref.getName())
&& 1 == pref.getValues().length) {
this.setPithyStaticContent(pref.getValues()[0]);
efficencyFlag[1] = true;
} else if (!efficencyFlag[2]
&& WIDGET_URL_PORLTET_PREFERENCE.equals(pref.getName())) {
this.setWidgetURL(pref.getValues()[0]);
efficencyFlag[2] = true;
} else if (!efficencyFlag[3]
&& WIDGET_TYPE_PORTLET_PREFERENCE.equals(pref.getName())) {
this.setWidgetType(pref.getValues()[0]);
efficencyFlag[3] = true;
} else if (!efficencyFlag[4]
&& WIDGET_CONFIG_PORTLET_PREFERENCE.equals(pref.getName())) {
if (isValidJSON(pref.getValues()[0])) {
this.setWidgetConfig(pref.getValues()[0]);
} else {
this.setWidgetConfig(
"{\"error\" : \"config JSON not valid, syntax error? Double quotes not escaped?\"}");
}
efficencyFlag[4] = true;
} else if (!efficencyFlag[5]
&& WIDGET_TEMPLATE_PORTLET_PREFERENCE.equals(pref.getName())) {
this.setWidgetTemplate(pref.getValues()[0]);
efficencyFlag[5] = true;
} else if (!efficencyFlag[6]
&& RENDER_ON_WEB_PORTLET_PREFERENCE.equals(pref.getName())) {
efficencyFlag[6] = true;
this.setRenderOnWeb(Boolean.valueOf(pref.getValues()[0]));
}
if (allTrue(efficencyFlag)) {
break;
}
}
}
}
private boolean allTrue(boolean[] arr) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == false) {
return false;
}
}
return true;
}
private boolean isValidJSON(final String json) {
boolean valid = false;
try {
final JsonParser parser = new ObjectMapper().getFactory().createParser(json);
while (parser.nextToken() != null) {}
valid = true;
} catch (Exception jpe) {
//eat error
valid = false;
}
return valid;
}
public String getNodeId() {
return nodeId;
}
public void setNodeId(String nodeId) {
this.nodeId = nodeId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getIconUrl() {
return iconUrl;
}
public void setIconUrl(String iconUrl) {
this.iconUrl = iconUrl;
}
public String getFaIcon() {
return faIcon;
}
public void setFaIcon(String faIcon) {
this.faIcon = faIcon;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public String getTarget() {
return target;
}
public void setTarget(String target) {
this.target = target;
}
public String getStaticContent() {
return staticContent;
}
public void setStaticContent(String staticContent) {
this.staticContent = staticContent;
}
public String getPithyStaticContent() {
return this.pithyStaticContent;
}
public void setPithyStaticContent(final String pithyStaticContent) {
this.pithyStaticContent = pithyStaticContent;
}
public boolean isAltMaxUrl() {
return isAltMaxUrl;
}
public void setAltMaxUrl(boolean isAltMaxUrl) {
this.isAltMaxUrl = isAltMaxUrl;
}
public String getWidgetURL() {
return widgetURL;
}
public void setWidgetURL(String widgetURL) {
this.widgetURL = widgetURL;
}
public String getWidgetType() {
return widgetType;
}
public void setWidgetType(String widgetType) {
this.widgetType = widgetType;
}
public String getWidgetConfig() {
return (String) widgetConfig;
}
public void setWidgetConfig(String widgetConfig) {
this.widgetConfig = widgetConfig;
}
public String getWidgetTemplate() {
return widgetTemplate;
}
public void setWidgetTemplate(String widgetTemplate) {
this.widgetTemplate = widgetTemplate;
}
public boolean isRenderOnWeb() {
return isRenderOnWeb;
}
public void setRenderOnWeb(boolean setter) {
this.isRenderOnWeb = setter;
}
}