/* * * Copyright 2005 AgileTec s.r.l. (http://www.agiletec.it) All rights reserved. * * This file is part of jAPS software. * jAPS 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 2005 AgileTec s.r.l. (http://www.agiletec.it) All rights reserved. * */ package com.agiletec.aps.system.services.pagemodel; import java.io.StringReader; import java.util.Iterator; import java.util.List; 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.Showlet; import com.agiletec.aps.system.services.showlettype.IShowletTypeManager; import com.agiletec.aps.system.services.showlettype.ShowletType; import com.agiletec.aps.util.ApsProperties; /** * Classe di di supporto all'interpretazione dell'XML * che rappresenta la configurazione di un modello di pagina. * @author E.Santoboni */ public class PageModelDOM { /** * Costruttore della classe. * @param xmlText La stringa xml da interpretare. * @param showletTypeManager Il manager gestore dei tipi di showlet. * @throws ApsSystemException */ public PageModelDOM(String xmlText, IShowletTypeManager showletTypeManager) throws ApsSystemException { this.decodeDOM(xmlText); this.buildFrames(showletTypeManager); } 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 parsing the page model 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(IShowletTypeManager showletTypeManager) throws ApsSystemException { List<Element> frameElements = this._doc.getRootElement().getChildren(TAB_FRAME); if (null != frameElements && frameElements.size() > 0) { int framesNumber = frameElements.size(); _frames = new String[framesNumber]; _defaultShowlet = new Showlet[framesNumber]; _existMainFrame = false; Iterator<Element> frameElementsIter = frameElements.iterator(); while (frameElementsIter.hasNext()) { Element frameElement = frameElementsIter.next(); int pos = Integer.parseInt(frameElement.getAttributeValue(ATTRIBUTE_POS)); if(pos >= framesNumber) { throw new ApsSystemException("The position 'pos' exceeds the number of frames defined in the page model"); } String main = frameElement.getAttributeValue(ATTRIBUTE_MAIN); if (null != main && main.equals("true")) { _existMainFrame = true; _mainFrame = pos; } Element frameDescrElement = frameElement.getChild(TAB_DESCR); if (null != frameDescrElement) { _frames[pos] = frameDescrElement.getText(); } Element defaultShowletElement = frameElement.getChild(TAB_DEFAULT_SHOWLET); if (null != defaultShowletElement) { this.buildDefaultShowlet(defaultShowletElement, pos, showletTypeManager); } } } else { _frames = new String[0]; _defaultShowlet = new Showlet[0]; } } private void buildDefaultShowlet(Element defaultShowletElement, int pos, IShowletTypeManager showletTypeManager) { Showlet showlet = new Showlet(); String showletCode = defaultShowletElement.getAttributeValue(ATTRIBUTE_CODE); ShowletType type = showletTypeManager.getShowletType(showletCode); if (null == type) { throw new RuntimeException("The code of the default showlet '" + showletCode + "' unknown"); } showlet.setType(type); 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; } /** * Restituisce l'insieme ordinato delle descrizioni dei "frames" * del modello. * @return L'insieme delle descrizioni dei "frames" */ public String[] getFrames() { return this._frames; } /** * La posizione del frame principale, se esiste; * vale -1 se non esiste; * @return La posizione del frame principale. */ public int getMainFrame() { if (_existMainFrame) { return this._mainFrame; } else { return -1; } } /** * Restituisce la configurazione delle showlet di default. * @return Le showlet di default. */ public Showlet[] 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_SHOWLET = "defaultShowlet"; 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 Showlet[] _defaultShowlet; }