/*
*
* Copyright 2013 Entando S.r.l. (http://www.entando.com) All rights reserved.
*
* This file is part of Entando software.
* Entando is a free software;
* You can redistribute it and/or modify it
* under the terms of the GNU General Public License (GPL) as published by the Free Software Foundation; version 2.
*
* See the file License for the specific language governing permissions
* and limitations under the License
*
*
*
* Copyright 2013 Entando S.r.l. (http://www.entando.com) All rights reserved.
*
*/
package com.agiletec.plugins.jpmyportalplus.aps.system.services.pagemodel;
import java.io.StringReader;
import java.util.Iterator;
import java.util.List;
import org.entando.entando.aps.system.services.widgettype.IWidgetTypeManager;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import com.agiletec.aps.system.ApsSystemUtils;
import com.agiletec.aps.system.exception.ApsSystemException;
import com.agiletec.aps.system.services.page.Widget;
import com.agiletec.aps.util.ApsProperties;
/**
* This support class parses the XML representing the configuration of a page model
* @author E.Santoboni
*
*
<frames>
<frame pos="0" locked="false" column="3">
<descr>Search in this site</descr>
<defaultWidget code="searchForm"/>
</frame>
....
....
</frames>
*
*/
public class MyPortalPageModelDOM {
/**
* Class constructor
* @param xmlText The XML string to parse
* @param widgetTypeManager The manager of the showlet type
* @throws ApsSystemException In case of error
*/
public MyPortalPageModelDOM(String xmlText, IWidgetTypeManager widgetTypeManager) throws ApsSystemException {
this.decodeDOM(xmlText);
this.buildFrames(widgetTypeManager);
}
private void decodeDOM(String xmlText) throws ApsSystemException {
SAXBuilder builder = new SAXBuilder();
builder.setValidation(false);
StringReader reader = new StringReader(xmlText);
try {
_doc = builder.build(reader);
} catch (Throwable t) {
ApsSystemUtils.logThrowable(t, this, "decodeDOM");
throw new ApsSystemException("Error detected parsing the XML", t);
}
}
private ApsProperties buildProperties(Element propertiesElement) {
ApsProperties prop = new ApsProperties();
List<Element> propertyElements = propertiesElement.getChildren(TAB_PROPERTY);
Iterator<Element> propertyElementsIter = propertyElements.iterator();
while (propertyElementsIter.hasNext()) {
Element property = (Element) propertyElementsIter.next();
prop.put(property.getAttributeValue(ATTRIBUTE_KEY), property.getText().trim());
}
return prop;
}
private void buildFrames(IWidgetTypeManager widgetTypeManager) throws ApsSystemException {
List<Element> frameElements = _doc.getRootElement().getChildren(TAB_FRAME);
if (null != frameElements && frameElements.size() > 0) {
int framesNumber = frameElements.size();
_frames = new String[framesNumber];
_frameConfigs = new Frame[framesNumber];
_defaultShowlet = new Widget[framesNumber];
_existMainFrame = false;
Iterator<Element> frameElementsIter = frameElements.iterator();
while (frameElementsIter.hasNext()) {
Element frameElement = frameElementsIter.next();
this.buildFrame(widgetTypeManager, framesNumber, frameElement);
}
} else {
_frames = new String[0];
_defaultShowlet = new Widget[0];
}
}
private void buildFrame(IWidgetTypeManager showletTypeManager,
int framesNumber, Element frameElement) throws ApsSystemException {
int pos = Integer.parseInt(frameElement.getAttributeValue(ATTRIBUTE_POS));
if(pos >= framesNumber) {
throw new ApsSystemException("The 'pos' attribute exceeds the available frames in the page model");
}
Frame frame = new Frame();
frame.setPos(pos);
String main = frameElement.getAttributeValue(ATTRIBUTE_MAIN);
if (null != main && main.equals("true")) {
_existMainFrame = true;
_mainFrame = pos;
frame.setMainFrame(true);
}
String fixed = frameElement.getAttributeValue("locked");
if (null == fixed || fixed.equals("true")) {
frame.setLocked(true);
}
String column = frameElement.getAttributeValue("column");
if (null != column) {
try {
frame.setColumn(Integer.parseInt(column));
} catch (Throwable e) {
//nothing to do
}
}
Element frameDescrElement = frameElement.getChild(TAB_DESCR);
if (null != frameDescrElement) {
String descr = frameDescrElement.getText();
_frames[pos] = descr;
frame.setDescr(descr);
}
Element defaultShowletElement = frameElement.getChild(TAB_DEFAULT_WIDGET);
if (null == defaultShowletElement) {
defaultShowletElement = frameElement.getChild("defaultShowlet");
}
if (null != defaultShowletElement) {
Widget defaultShowlet = this.buildDefaultShowlet(defaultShowletElement, pos, showletTypeManager);
frame.setDefaultWidget(defaultShowlet);
this.getDefaultShowlet()[pos] = defaultShowlet;
}
_frameConfigs[pos] = frame;
}
private Widget buildDefaultShowlet(Element defaultShowletElement, int pos, IWidgetTypeManager showletTypeManager) {
Widget showlet = new Widget();
String showletCode = defaultShowletElement.getAttributeValue(ATTRIBUTE_CODE);
showlet.setType(showletTypeManager.getWidgetType(showletCode));
Element propertiesElement = defaultShowletElement.getChild(TAB_PROPERTIES);
if (null != propertiesElement) {
ApsProperties prop = this.buildProperties(propertiesElement);
showlet.setConfig(prop);
} else {
showlet.setConfig(new ApsProperties());
}
_defaultShowlet[pos] = showlet;
return showlet;
}
/**
* Return the sorted descriptions by frames of the page models.
* @return An array with the frames descriptions.
*/
public String[] getFrames() {
return this._frames;
}
public Frame[] getFrameConfigs() {
return this._frameConfigs;
}
/**
* Return the position of the main frame when available, otherwise return -1.
* @return The position of the main frame or -1 when it's not available.
*/
public int getMainFrame() {
if (_existMainFrame) {
return this._mainFrame;
} else {
return -1;
}
}
/**
* Return the configuration of the default showlets
* @return The default showlets
*/
public Widget[] getDefaultShowlet() {
return this._defaultShowlet;
}
private Document _doc;
private final String TAB_FRAME = "frame";
private final String ATTRIBUTE_POS = "pos";
private final String ATTRIBUTE_MAIN = "main";
private final String TAB_DESCR = "descr";
private final String TAB_DEFAULT_WIDGET = "defaultWidget";
private final String ATTRIBUTE_CODE = "code";
private final String TAB_PROPERTIES = "properties";
private final String TAB_PROPERTY = "property";
private final String ATTRIBUTE_KEY = "key";
private boolean _existMainFrame;
private int _mainFrame;
private String[] _frames;
private Widget[] _defaultShowlet;
private Frame[] _frameConfigs;
}