/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.apache.directory.studio.templateeditor.model.parser;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.eclipse.osgi.util.NLS;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.directory.studio.templateeditor.model.AbstractTemplate;
import org.apache.directory.studio.templateeditor.model.ExtensionPointTemplate;
import org.apache.directory.studio.templateeditor.model.FileTemplate;
import org.apache.directory.studio.templateeditor.model.Template;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateCheckbox;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateComposite;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateDate;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateFileChooser;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateForm;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateImage;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateLabel;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateLink;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateListbox;
import org.apache.directory.studio.templateeditor.model.widgets.TemplatePassword;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateRadioButtons;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateSection;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateSpinner;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateTable;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateTextField;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateWidget;
import org.apache.directory.studio.templateeditor.model.widgets.ValueItem;
import org.apache.directory.studio.templateeditor.model.widgets.WidgetAlignment;
import org.apache.directory.studio.templateeditor.view.preferences.PreferencesFileTemplate;
/**
* This class is used to read/write the 'connections.xml' file.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class TemplateIO
{
/** The logger */
private static final Logger LOG = LoggerFactory.getLogger( TemplateIO.class );
private static final String THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE = Messages
.getString( "TemplateIO.FileIsNotAValidTemplateFile" ); //$NON-NLS-1$
// XML Elements
private static final String ATTRIBUTE_ATTRIBUTETYPE = "attributeType"; //$NON-NLS-1$
private static final String ATTRIBUTE_CHARACTERSLIMIT = "charactersLimit"; //$NON-NLS-1$
private static final String ATTRIBUTE_DESCRIPTION = "description"; //$NON-NLS-1$
private static final String ATTRIBUTE_DIGITS = "digits"; //$NON-NLS-1$
private static final String ATTRIBUTE_DOLLAR_SIGN_IS_NEW_LINE = "dollarSignIsNewLine"; //$NON-NLS-1$
private static final String ATTRIBUTE_EXTENSIONS = "extensions"; //$NON-NLS-1$
private static final String ATTRIBUTE_EQUALCOLUMNS = "equalColumns"; //$NON-NLS-1$
private static final String ATTRIBUTE_ENABLED = "enabled"; //$NON-NLS-1$
private static final String ATTRIBUTE_EXPANDABLE = "expandable"; //$NON-NLS-1$
private static final String ATTRIBUTE_EXPANDED = "expanded"; //$NON-NLS-1$
private static final String ATTRIBUTE_FORMAT = "format"; //$NON-NLS-1$
private static final String ATTRIBUTE_GRAB_EXCESS_HORIZONTAL_SPACE = "grabExcessHorizontalSpace"; //$NON-NLS-1$
private static final String ATTRIBUTE_GRAB_EXCESS_VERTICAL_SPACE = "grabExcessVerticalSpace"; //$NON-NLS-1$
private static final String ATTRIBUTE_HIDDEN = "hidden"; //$NON-NLS-1$
private static final String ATTRIBUTE_HEIGHT = "height"; //$NON-NLS-1$
private static final String ATTRIBUTE_HORIZONTAL_ALIGNMENT = "horizontalAlignment"; //$NON-NLS-1$
private static final String ATTRIBUTE_HORIZONTAL_SPAN = "horizontalSpan"; //$NON-NLS-1$
private static final String ATTRIBUTE_ID = "id"; //$NON-NLS-1$
private static final String ATTRIBUTE_IMAGE_HEIGHT = "imageHeight"; //$NON-NLS-1$
private static final String ATTRIBUTE_IMAGE_WIDTH = "imageWidth"; //$NON-NLS-1$
private static final String ATTRIBUTE_INCREMENT = "increment"; //$NON-NLS-1$
private static final String ATTRIBUTE_LABEL = "label"; //$NON-NLS-1$
private static final String ATTRIBUTE_MAXIMUM = "maximum"; //$NON-NLS-1$
private static final String ATTRIBUTE_MINIMUM = "minimum"; //$NON-NLS-1$
private static final String ATTRIBUTE_MULTIPLESELECTION = "multipleSelection"; //$NON-NLS-1$
private static final String ATTRIBUTE_NUMBEROFCOLUMNS = "numberOfColumns"; //$NON-NLS-1$
private static final String ATTRIBUTE_NUMBEROFROWS = "numberOfRows"; //$NON-NLS-1$
private static final String ATTRIBUTE_PAGEINCREMENT = "pageIncrement"; //$NON-NLS-1$
private static final String ATTRIBUTE_SHOWADDBUTTON = "showAddButton"; //$NON-NLS-1$
private static final String ATTRIBUTE_SHOWBROWSEBUTTON = "showBrowseButton"; //$NON-NLS-1$
private static final String ATTRIBUTE_SHOWCLEARBUTTON = "showClearButton"; //$NON-NLS-1$
private static final String ATTRIBUTE_SHOWDELETEBUTTON = "showDeleteButton"; //$NON-NLS-1$
private static final String ATTRIBUTE_SHOWEDITBUTTON = "showEditButton"; //$NON-NLS-1$
private static final String ATTRIBUTE_SHOWICON = "showIcon"; //$NON-NLS-1$
private static final String ATTRIBUTE_SHOWSAVEASBUTTON = "showSaveAsButton"; //$NON-NLS-1$
private static final String ATTRIBUTE_SHOWSHOWPASSWORDCHECKBOX = "showShowPasswordCheckbox"; //$NON-NLS-1$
private static final String ATTRIBUTE_TITLE = "title"; //$NON-NLS-1$
private static final String ATTRIBUTE_VALUE = "value"; //$NON-NLS-1$
private static final String ATTRIBUTE_VERTICAL_ALIGNMENT = "verticalAlignment"; //$NON-NLS-1$
private static final String ATTRIBUTE_VERTICAL_SPAN = "verticalSpan"; //$NON-NLS-1$
private static final String ATTRIBUTE_WIDTH = "width"; //$NON-NLS-1$
private static final String ELEMENT_AUXILIARIES = "auxiliaries"; //$NON-NLS-1$
private static final String ELEMENT_AUXILIARY = "auxiliary"; //$NON-NLS-1$
private static final String ELEMENT_BUTTON = "button"; //$NON-NLS-1$
private static final String ELEMENT_BUTTONS = "buttons"; //$NON-NLS-1$
private static final String ELEMENT_CHECKBOX = "checkbox"; //$NON-NLS-1$
private static final String ELEMENT_CHECKEDVALUE = "checkedValue"; //$NON-NLS-1$
private static final String ELEMENT_COMPOSITE = "composite"; //$NON-NLS-1$
private static final String ELEMENT_DATA = "data"; //$NON-NLS-1$
private static final String ELEMENT_DATE = "date"; //$NON-NLS-1$
private static final String ELEMENT_FILECHOOSER = "fileChooser"; //$NON-NLS-1$
private static final String ELEMENT_FORM = "form"; //$NON-NLS-1$
private static final String ELEMENT_ICON = "icon"; //$NON-NLS-1$
private static final String ELEMENT_IMAGE = "image"; //$NON-NLS-1$
private static final String ELEMENT_ITEM = "item"; //$NON-NLS-1$
private static final String ELEMENT_ITEMS = "items"; //$NON-NLS-1$
private static final String ELEMENT_LABEL = "label"; //$NON-NLS-1$
private static final String ELEMENT_LINK = "link"; //$NON-NLS-1$
private static final String ELEMENT_LISTBOX = "listbox"; //$NON-NLS-1$
private static final String ELEMENT_OBJECTCLASSES = "objectClasses"; //$NON-NLS-1$
private static final String ELEMENT_PASSWORD = "password"; //$NON-NLS-1$
private static final String ELEMENT_RADIOBUTTONS = "radiobuttons"; //$NON-NLS-1$
private static final String ELEMENT_SECTION = "section"; //$NON-NLS-1$
private static final String ELEMENT_SPINNER = "spinner"; //$NON-NLS-1$
private static final String ELEMENT_STRUCTURAL = "structural"; //$NON-NLS-1$
private static final String ELEMENT_TABLE = "table"; //$NON-NLS-1$
private static final String ELEMENT_TEMPLATE = "template"; //$NON-NLS-1$
private static final String ELEMENT_TEXTFIELD = "textfield"; //$NON-NLS-1$
private static final String ELEMENT_VALUE = "value"; //$NON-NLS-1$
private static final String ELEMENT_UNCHECKEDVALUE = "uncheckedValue"; //$NON-NLS-1$
private static final String VALUE_BEGINNING = "beginning"; //$NON-NLS-1$
private static final String VALUE_CENTER = "center"; //$NON-NLS-1$
private static final String VALUE_END = "end"; //$NON-NLS-1$
private static final String VALUE_FALSE = "false"; //$NON-NLS-1$
private static final String VALUE_FILL = "fill"; //$NON-NLS-1$
private static final String VALUE_NONE = "none"; //$NON-NLS-1$
private static final String VALUE_TRUE = "true"; //$NON-NLS-1$
/**
* Reads the input stream as a file template
*
* @param is
* the input stream
* @return
* the template
* @throws TemplateIOException
* if an error occurs when converting the document
*/
public static FileTemplate readAsFileTemplate( InputStream is ) throws TemplateIOException
{
// Creating the FileTemplate
FileTemplate template = new FileTemplate();
// Reading the template
readTemplate( is, template );
// Returning the template
return template;
}
/**
* Reads the input stream as a preferences file template
*
* @param is
* the input stream
* @return
* the template
* @throws TemplateIOException
* if an error occurs when converting the document
*/
public static PreferencesFileTemplate readAsPreferencesFileTemplate( InputStream is ) throws TemplateIOException
{
// Creating the PreferencesFileTemplate
PreferencesFileTemplate template = new PreferencesFileTemplate();
// Reading the template
readTemplate( is, template );
// Returning the template
return template;
}
/**
* Reads the input stream as a file template
*
* @param is
* the input stream
* @return
* the template
* @throws TemplateIOException
* if an error occurs when converting the document
*/
public static ExtensionPointTemplate readAsExtensionPointTemplate( InputStream is ) throws TemplateIOException
{
// Creating the FileTemplate
ExtensionPointTemplate template = new ExtensionPointTemplate();
// Reading the template
readTemplate( is, template );
// Returning the template
return template;
}
/**
* Reads the input stream as a file template
*
* @param is
* the input stream
* @return
* the template
* @throws TemplateIOException
* if an error occurs when converting the document
*/
public static void readTemplate( InputStream is, Template template ) throws TemplateIOException
{
// Getting the document
Document document = getDocument( is );
// Reading the template.
readTemplate( document.getRootElement(), template );
}
/**
* Gets the document associated with the input stream.
*
* @param stream
* the input stream
* @return
* @throws TemplateIOException
*/
private static Document getDocument( InputStream is ) throws TemplateIOException
{
try
{
return ( new SAXReader() ).read( is );
}
catch ( DocumentException e )
{
throw new TemplateIOException( e.getMessage() );
}
}
/**
* Reads the template.
*
* @param rootElement
* the root element
* @param template
* the template
*/
private static void readTemplate( Element rootElement, Template template ) throws TemplateIOException
{
LOG.debug( "Reading the template" ); //$NON-NLS-1$
// Verifying the root 'template' element
if ( ( rootElement == null ) || ( !rootElement.getName().equalsIgnoreCase( ELEMENT_TEMPLATE ) ) )
{
LOG.error( "Unable to find element: '" + ELEMENT_TEMPLATE + "'." ); //$NON-NLS-1$ //$NON-NLS-2$
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" //$NON-NLS-1$
+ NLS.bind( Messages.getString( "TemplateIO.UnableToFindElement" ), ELEMENT_TEMPLATE ) ); //$NON-NLS-1$
}
// Reading the ID
Attribute idAttribute = rootElement.attribute( ATTRIBUTE_ID );
if ( ( idAttribute != null ) && ( idAttribute.getText() != null ) )
{
// Verifying if the ID is valid
if ( AbstractTemplate.isValidId( idAttribute.getText() ) )
{
LOG.debug( "ID='" + idAttribute.getText() + "'" ); //$NON-NLS-1$ //$NON-NLS-2$
template.setId( idAttribute.getText() );
}
else
{
LOG.error( "Invalid ID attribute: '" + idAttribute.getText() + "'." ); //$NON-NLS-1$ //$NON-NLS-2$
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" //$NON-NLS-1$
+ NLS.bind( Messages.getString( "TemplateIO.InvalidIdAttribute" ), idAttribute.getText() ) ); //$NON-NLS-1$
}
}
else
{
LOG.error( "Unable to find attribute or attribute empty: '" + ATTRIBUTE_ID + "'." ); //$NON-NLS-1$ //$NON-NLS-2$
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" //$NON-NLS-1$
+ NLS.bind( Messages.getString( "TemplateIO.AttributeNotFoundOrEmpty" ), ATTRIBUTE_ID ) ); //$NON-NLS-1$
}
// Reading the title
Attribute titleAttribute = rootElement.attribute( ATTRIBUTE_TITLE );
if ( ( titleAttribute != null ) && ( titleAttribute.getText() != null ) )
{
LOG.debug( "Title='" + titleAttribute.getText() + "'" ); //$NON-NLS-1$ //$NON-NLS-2$
template.setTitle( titleAttribute.getText() );
}
else
{
LOG.error( "Unable to find attribute or attribute empty: '" + ATTRIBUTE_TITLE + "'." ); //$NON-NLS-1$ //$NON-NLS-2$
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" //$NON-NLS-1$
+ NLS.bind( Messages.getString( "TemplateIO.AttributeNotFoundOrEmpty" ), ATTRIBUTE_TITLE ) ); //$NON-NLS-1$
}
// Reading the object classes
readObjectClasses( rootElement, template );
// Reading the form
readForm( rootElement, template );
}
/**
* Reads the object classes for the template.
*
* @param element
* the element
* @param template
* the template
* @throws TemplateIOException
*/
private static void readObjectClasses( Element element, Template template ) throws TemplateIOException
{
LOG.debug( "Reading the template's object classes" ); //$NON-NLS-1$
// Reading the 'objectClasses' element
Element objectClassesElement = element.element( ELEMENT_OBJECTCLASSES );
if ( objectClassesElement == null )
{
LOG.error( "Unable to find element: '" + ELEMENT_OBJECTCLASSES + "'." ); //$NON-NLS-1$ //$NON-NLS-2$
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" //$NON-NLS-1$
+ NLS.bind( Messages.getString( "TemplateIO.UnableToFindElement" ), ELEMENT_OBJECTCLASSES ) ); //$NON-NLS-1$
}
// Reading the 'structural' element
Element structuralElement = objectClassesElement.element( ELEMENT_STRUCTURAL );
if ( structuralElement != null )
{
String structuralObjectClassText = structuralElement.getText();
if ( ( structuralObjectClassText != null ) && ( !structuralObjectClassText.equals( "" ) ) ) //$NON-NLS-1$
{
template.setStructuralObjectClass( structuralObjectClassText );
}
}
else
{
LOG.error( "Unable to find any: '" + ELEMENT_STRUCTURAL + "' element." ); //$NON-NLS-1$ //$NON-NLS-2$
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" //$NON-NLS-1$
+ NLS.bind( Messages.getString( "TemplateIO.UnableToFindAnyElement" ), ELEMENT_STRUCTURAL ) ); //$NON-NLS-1$
}
// Reading the 'auxiliaries' element
Element auxliariesElement = objectClassesElement.element( ELEMENT_AUXILIARIES );
if ( auxliariesElement != null )
{
// Reading the auxiliaries object classes
for ( Iterator<?> i = auxliariesElement.elementIterator( ELEMENT_AUXILIARY ); i.hasNext(); )
{
Element auxliaryObjectClassElement = ( Element ) i.next();
String auxliaryObjectClassText = auxliaryObjectClassElement.getText();
if ( ( auxliaryObjectClassText != null ) && ( !auxliaryObjectClassText.equals( "" ) ) ) //$NON-NLS-1$
{
template.addAuxiliaryObjectClass( auxliaryObjectClassText );
}
}
}
}
/**
* Reads the form for the template.
*
* @param element
* the element
* @param template
* the template
* @throws TemplateIOException
*/
private static void readForm( Element element, Template template ) throws TemplateIOException
{
LOG.debug( "Reading the template's form" ); //$NON-NLS-1$
// Reading the 'form' element
Element formElement = element.element( ELEMENT_FORM );
if ( formElement == null )
{
LOG.error( "Unable to find element: '" + ELEMENT_FORM + "'." ); //$NON-NLS-1$//$NON-NLS-2$
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" //$NON-NLS-1$
+ NLS.bind( Messages.getString( "TemplateIO.UnableToFindElement" ), ELEMENT_FORM ) ); //$NON-NLS-1$
}
// Creating the form and setting it to the template
TemplateForm form = new TemplateForm();
template.setForm( form );
// Reading the child elements
for ( Iterator<?> i = formElement.elementIterator(); i.hasNext(); )
{
Element childElement = ( Element ) i.next();
// Getting the name of the element
String elementName = childElement.getName();
if ( elementName.equalsIgnoreCase( ELEMENT_COMPOSITE ) )
{
readComposite( childElement, form );
}
else if ( elementName.equalsIgnoreCase( ELEMENT_SECTION ) )
{
readSection( childElement, form );
}
else
{
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" //$NON-NLS-1$
+ NLS.bind( Messages.getString( "TemplateIO.ElementNotAllowedAtThisLevel" ), //$NON-NLS-1$
new String[]
{ elementName, ELEMENT_SECTION, ELEMENT_COMPOSITE } ) );
}
}
// Verifying if we've found at least one section
if ( form.getChildren().size() == 0 )
{
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" //$NON-NLS-1$
+ NLS.bind( Messages.getString( "TemplateIO.UnableToFindAnyXOrYElement" ), new String[] //$NON-NLS-1$
{ ELEMENT_SECTION, ELEMENT_COMPOSITE } ) );
}
}
/**
* Reads a widget.
*
* @param element
* the element
* @param template
* the template
* @throws TemplateIOException
*/
private static void readWidget( Element element, TemplateWidget parent ) throws TemplateIOException
{
// Getting the name of the element
String elementName = element.getName();
// Switching on the various widgets we support
if ( elementName.equalsIgnoreCase( ELEMENT_CHECKBOX ) )
{
readCheckbox( element, parent );
}
else if ( elementName.equalsIgnoreCase( ELEMENT_COMPOSITE ) )
{
readComposite( element, parent );
}
else if ( elementName.equalsIgnoreCase( ELEMENT_DATE ) )
{
readDate( element, parent );
}
else if ( elementName.equalsIgnoreCase( ELEMENT_FILECHOOSER ) )
{
readFileChooser( element, parent );
}
else if ( elementName.equalsIgnoreCase( ELEMENT_IMAGE ) )
{
readImage( element, parent );
}
else if ( elementName.equalsIgnoreCase( ELEMENT_LABEL ) )
{
readLabel( element, parent );
}
else if ( elementName.equalsIgnoreCase( ELEMENT_LINK ) )
{
readLink( element, parent );
}
else if ( elementName.equalsIgnoreCase( ELEMENT_LISTBOX ) )
{
readListbox( element, parent );
}
else if ( elementName.equalsIgnoreCase( ELEMENT_PASSWORD ) )
{
readPassword( element, parent );
}
else if ( elementName.equalsIgnoreCase( ELEMENT_RADIOBUTTONS ) )
{
readRadioButtons( element, parent );
}
else if ( elementName.equalsIgnoreCase( ELEMENT_SECTION ) )
{
readSection( element, parent );
}
else if ( elementName.equalsIgnoreCase( ELEMENT_SPINNER ) )
{
readSpinner( element, parent );
}
else if ( elementName.equalsIgnoreCase( ELEMENT_TABLE ) )
{
readTable( element, parent );
}
else if ( elementName.equalsIgnoreCase( ELEMENT_TEXTFIELD ) )
{
readTextfield( element, parent );
}
// We could not find a widget associated with this name.
else
{
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" //$NON-NLS-1$
+ NLS.bind( Messages.getString( "TemplateIO.UnknownWidget" ), elementName ) ); //$NON-NLS-1$
}
}
/**
* Reads the widget common properties like 'attributeType' and all position related properties.
*
* @param element
* the element to read from
* @param widget
* the associated widget
* @param throwExceptionIfMissingAttributeType
* <code>true</code> if the method should throw an exception if the 'attributeType' value is missing,
* <code>false</code> if not
* @param widgetElementName
* the name of the XML element of the widget (for debug purposes)
* @throws TemplateIOException
* if the mandatory 'attributeType' value is missing
*/
private static void readWidgetCommonProperties( Element element, TemplateWidget widget,
boolean throwExceptionIfMissingAttributeType, String widgetElementName ) throws TemplateIOException
{
// Reading the 'attributeType' attribute
boolean foundAttributeTypeAttribute = readAttributeTypeAttribute( element, widget );
// If the 'attributeType' attribute does not exist, we throw an
// exception
if ( throwExceptionIfMissingAttributeType && !foundAttributeTypeAttribute )
{
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" //$NON-NLS-1$
+ NLS.bind( Messages.getString( "TemplateIO.UnableToFindMandatoryAttribute" ), new String[] //$NON-NLS-1$
{ ATTRIBUTE_ATTRIBUTETYPE, widgetElementName } ) );
}
// Reading the 'horizontalAlignment' attribute
Attribute horizontalAlignmentAttribute = element.attribute( ATTRIBUTE_HORIZONTAL_ALIGNMENT );
if ( ( horizontalAlignmentAttribute != null ) && ( horizontalAlignmentAttribute.getText() != null ) )
{
widget.setHorizontalAlignment( readWidgetAlignmentValue( horizontalAlignmentAttribute.getText() ) );
}
// Reading the 'verticalAlignment' attribute
Attribute verticalAlignmentAttribute = element.attribute( ATTRIBUTE_VERTICAL_ALIGNMENT );
if ( ( verticalAlignmentAttribute != null ) && ( verticalAlignmentAttribute.getText() != null ) )
{
widget.setVerticalAlignment( readWidgetAlignmentValue( verticalAlignmentAttribute.getText() ) );
}
// Reading the 'grabExcessHorizontalSpace' attribute
Attribute grabExcessHorizontalSpaceAttribute = element.attribute( ATTRIBUTE_GRAB_EXCESS_HORIZONTAL_SPACE );
if ( ( grabExcessHorizontalSpaceAttribute != null ) && ( grabExcessHorizontalSpaceAttribute.getText() != null ) )
{
widget.setGrabExcessHorizontalSpace( readBoolean( grabExcessHorizontalSpaceAttribute.getText() ) );
}
// Reading the 'grabExcessVerticalSpace' attribute
Attribute grabExcessVerticalSpaceAttribute = element.attribute( ATTRIBUTE_GRAB_EXCESS_VERTICAL_SPACE );
if ( ( grabExcessVerticalSpaceAttribute != null ) && ( grabExcessVerticalSpaceAttribute.getText() != null ) )
{
widget.setGrabExcessVerticalSpace( readBoolean( grabExcessVerticalSpaceAttribute.getText() ) );
}
// Reading the 'horizontalSpan' attribute
Attribute horizontalSpanAttribute = element.attribute( ATTRIBUTE_HORIZONTAL_SPAN );
if ( ( horizontalSpanAttribute != null ) && ( horizontalSpanAttribute.getText() != null ) )
{
widget.setHorizontalSpan( readInteger( horizontalSpanAttribute.getText() ) );
}
// Reading the 'verticalSpan' attribute
Attribute verticalSpanAttribute = element.attribute( ATTRIBUTE_VERTICAL_SPAN );
if ( ( verticalSpanAttribute != null ) && ( verticalSpanAttribute.getText() != null ) )
{
widget.setVerticalSpan( readInteger( verticalSpanAttribute.getText() ) );
}
// Reading the 'width' attribute
Attribute widthAttribute = element.attribute( ATTRIBUTE_WIDTH );
if ( ( widthAttribute != null ) && ( widthAttribute.getText() != null ) )
{
widget.setImageWidth( readInteger( widthAttribute.getText() ) );
}
// Reading the 'height' attribute
Attribute heightAttribute = element.attribute( ATTRIBUTE_HEIGHT );
if ( ( heightAttribute != null ) && ( heightAttribute.getText() != null ) )
{
widget.setImageHeight( readInteger( heightAttribute.getText() ) );
}
}
/**
* Reads a widget alignment value.
*
* @param text
* the widget alignment value
*/
private static WidgetAlignment readWidgetAlignmentValue( String text ) throws TemplateIOException
{
if ( text.equalsIgnoreCase( VALUE_NONE ) )
{
return WidgetAlignment.NONE;
}
else if ( text.equalsIgnoreCase( VALUE_BEGINNING ) )
{
return WidgetAlignment.BEGINNING;
}
else if ( text.equalsIgnoreCase( VALUE_CENTER ) )
{
return WidgetAlignment.CENTER;
}
else if ( text.equalsIgnoreCase( VALUE_END ) )
{
return WidgetAlignment.END;
}
else if ( text.equalsIgnoreCase( VALUE_FILL ) )
{
return WidgetAlignment.FILL;
}
else
{
String message = NLS.bind( Messages.getString( "TemplateIO.UnableToConvertStringToWidgetAlignmentValue" ), //$NON-NLS-1$
new String[]
{ VALUE_NONE, VALUE_BEGINNING, VALUE_CENTER, VALUE_END, VALUE_FILL, text } );
LOG.error( message );
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" + message ); //$NON-NLS-1$
}
}
/**
* Reads the attribute type attribute.
*
* @param element
* the element to read from
* @param widget
* the associated widget
* @return
* <code>true</code> if the attribute type attribute has been found,
* <code>false</code> if not
*/
private static boolean readAttributeTypeAttribute( Element element, TemplateWidget widget )
{
// Reading the 'attributeType' attribute
Attribute attributeTypeAttribute = element.attribute( ATTRIBUTE_ATTRIBUTETYPE );
if ( ( attributeTypeAttribute != null ) && ( attributeTypeAttribute.getText() != null ) )
{
widget.setAttributeType( attributeTypeAttribute.getText() );
return true;
}
return false;
}
/**
* Reads a checkbox widget.
*
* @param element
* the element
* @param template
* the template
* @throws TemplateIOException
*/
private static void readCheckbox( Element element, TemplateWidget parent ) throws TemplateIOException
{
LOG.debug( "Reading a template checkbox" ); //$NON-NLS-1$
// Creating the checkbox
TemplateCheckbox templateCheckbox = new TemplateCheckbox( parent );
// Reading the widget's common properties
readWidgetCommonProperties( element, templateCheckbox, true, ELEMENT_CHECKBOX );
// Reading the 'label' attribute
Attribute labelAttribute = element.attribute( ATTRIBUTE_LABEL );
if ( ( labelAttribute != null ) && ( labelAttribute.getText() != null ) )
{
templateCheckbox.setLabel( labelAttribute.getText() );
}
// Reading the 'enabled' attribute
Attribute enabledAttribute = element.attribute( ATTRIBUTE_ENABLED );
if ( ( enabledAttribute != null ) && ( enabledAttribute.getText() != null ) )
{
templateCheckbox.setEnabled( readBoolean( enabledAttribute.getText() ) );
}
// Reading the 'checkedValue' element
Element checkedValueElement = element.element( ELEMENT_CHECKEDVALUE );
if ( checkedValueElement != null )
{
templateCheckbox.setCheckedValue( checkedValueElement.getText() );
}
// Reading the 'uncheckedValue' element
Element uncheckedValueElement = element.element( ELEMENT_UNCHECKEDVALUE );
if ( uncheckedValueElement != null )
{
templateCheckbox.setUncheckedValue( uncheckedValueElement.getText() );
}
}
/**
* Reads a composite widget.
*
* @param element
* the element
* @param template
* the template
* @throws TemplateIOException
*/
private static void readComposite( Element element, TemplateWidget parent ) throws TemplateIOException
{
LOG.debug( "Reading a template composite" ); //$NON-NLS-1$
// Creating the composite
TemplateComposite templateComposite = new TemplateComposite( parent );
// Reading the widget's common properties
readWidgetCommonProperties( element, templateComposite, false, ELEMENT_COMPOSITE );
// Reading the 'numberOfColumns' attribute
Attribute numberOfColumnsAttribute = element.attribute( ATTRIBUTE_NUMBEROFCOLUMNS );
if ( ( numberOfColumnsAttribute != null ) && ( numberOfColumnsAttribute.getText() != null ) )
{
templateComposite.setNumberOfColumns( readInteger( numberOfColumnsAttribute.getText() ) );
}
// Reading the 'equalColumns' attribute
Attribute equalColumnsAttribute = element.attribute( ATTRIBUTE_EQUALCOLUMNS );
if ( ( equalColumnsAttribute != null ) && ( equalColumnsAttribute.getText() != null ) )
{
templateComposite.setEqualColumns( readBoolean( equalColumnsAttribute.getText() ) );
}
// Reading the elements
for ( Iterator<?> i = element.elementIterator(); i.hasNext(); )
{
Element childElement = ( Element ) i.next();
readWidget( childElement, templateComposite );
}
}
/**
* Reads a date widget.
*
* @param element
* the element
* @param template
* the template
* @throws TemplateIOException
*/
private static void readDate( Element element, TemplateWidget parent ) throws TemplateIOException
{
LOG.debug( "Reading a template date" ); //$NON-NLS-1$
// Creating the file chooser
TemplateDate date = new TemplateDate( parent );
// Reading the widget's common properties
readWidgetCommonProperties( element, date, true, ELEMENT_DATE );
// Reading the 'format' attribute
Attribute formatAttribute = element.attribute( ATTRIBUTE_FORMAT );
if ( ( formatAttribute != null ) && ( formatAttribute.getText() != null ) )
{
date.setFormat( formatAttribute.getText() );
}
// Reading the 'showEditButton' attribute
Attribute showEditButtonAttribute = element.attribute( ATTRIBUTE_SHOWEDITBUTTON );
if ( ( showEditButtonAttribute != null ) && ( showEditButtonAttribute.getText() != null ) )
{
date.setShowEditButton( readBoolean( showEditButtonAttribute.getText() ) );
}
}
/**
* Reads a file chooser widget.
*
* @param element
* the element
* @param template
* the template
* @throws TemplateIOException
*/
private static void readFileChooser( Element element, TemplateWidget parent ) throws TemplateIOException
{
LOG.debug( "Reading a template file chooser" ); //$NON-NLS-1$
// Creating the file chooser
TemplateFileChooser fileChooser = new TemplateFileChooser( parent );
// Reading the widget's common properties
readWidgetCommonProperties( element, fileChooser, true, ELEMENT_FILECHOOSER );
// Reading the 'extensions' attribute
Attribute extensionsAttribute = element.attribute( ATTRIBUTE_EXTENSIONS );
if ( ( extensionsAttribute != null ) && ( extensionsAttribute.getText() != null ) )
{
readFileChooserExtensions( extensionsAttribute, fileChooser );
}
// Reading the 'showIcon' attribute
Attribute showIconAttribute = element.attribute( ATTRIBUTE_SHOWICON );
if ( ( showIconAttribute != null ) && ( showIconAttribute.getText() != null ) )
{
fileChooser.setShowIcon( readBoolean( showIconAttribute.getText() ) );
}
// Reading the 'showSaveAsButton' attribute
Attribute showSaveAsButtonAttribute = element.attribute( ATTRIBUTE_SHOWSAVEASBUTTON );
if ( ( showSaveAsButtonAttribute != null ) && ( showSaveAsButtonAttribute.getText() != null ) )
{
fileChooser.setShowSaveAsButton( readBoolean( showSaveAsButtonAttribute.getText() ) );
}
// Reading the 'showClearButton' attribute
Attribute showClearButtonAttribute = element.attribute( ATTRIBUTE_SHOWCLEARBUTTON );
if ( ( showClearButtonAttribute != null ) && ( showClearButtonAttribute.getText() != null ) )
{
fileChooser.setShowClearButton( readBoolean( showClearButtonAttribute.getText() ) );
}
// Reading the 'showBrowseButton' attribute
Attribute showBrowseButtonAttribute = element.attribute( ATTRIBUTE_SHOWBROWSEBUTTON );
if ( ( showBrowseButtonAttribute != null ) && ( showBrowseButtonAttribute.getText() != null ) )
{
fileChooser.setShowBrowseButton( readBoolean( showBrowseButtonAttribute.getText() ) );
}
// Reading the 'icon' element
Element iconElement = element.element( ELEMENT_ICON );
if ( iconElement != null )
{
fileChooser.setIcon( iconElement.getText() );
}
}
/**
* Reads the extensions of a file chooser widget.
*
* @param extensionsAttribute
* the attribute
* @param fileChooser
* the file chooser
*/
private static void readFileChooserExtensions( Attribute extensionsAttribute, TemplateFileChooser fileChooser )
{
// Getting the extensions
String extensions = extensionsAttribute.getText();
// Splitting and setting extensions to the file chooser
for ( String extension : extensions.split( "," ) ) //$NON-NLS-1$
{
fileChooser.addExtension( extension );
}
}
/**
* Reads an image widget.
*
* @param element
* the element
* @param template
* the template
* @throws TemplateIOException
*/
private static void readImage( Element element, TemplateWidget parent ) throws TemplateIOException
{
LOG.debug( "Reading a template image" ); //$NON-NLS-1$
// Creating the image
TemplateImage image = new TemplateImage( parent );
// Reading the widget's common properties
readWidgetCommonProperties( element, image, false, ELEMENT_IMAGE );
// Reading the 'showSaveAsButton' attribute
Attribute showSaveAsButtonAttribute = element.attribute( ATTRIBUTE_SHOWSAVEASBUTTON );
if ( ( showSaveAsButtonAttribute != null ) && ( showSaveAsButtonAttribute.getText() != null ) )
{
image.setShowSaveAsButton( readBoolean( showSaveAsButtonAttribute.getText() ) );
}
// Reading the 'showClearButton' attribute
Attribute showClearButtonAttribute = element.attribute( ATTRIBUTE_SHOWCLEARBUTTON );
if ( ( showClearButtonAttribute != null ) && ( showClearButtonAttribute.getText() != null ) )
{
image.setShowClearButton( readBoolean( showClearButtonAttribute.getText() ) );
}
// Reading the 'showBrowseButton' attribute
Attribute showBrowseButtonAttribute = element.attribute( ATTRIBUTE_SHOWBROWSEBUTTON );
if ( ( showBrowseButtonAttribute != null ) && ( showBrowseButtonAttribute.getText() != null ) )
{
image.setShowBrowseButton( readBoolean( showBrowseButtonAttribute.getText() ) );
}
// Reading the 'imageWidth' attribute
Attribute imageWidthAttribute = element.attribute( ATTRIBUTE_IMAGE_WIDTH );
if ( ( imageWidthAttribute != null ) && ( imageWidthAttribute.getText() != null ) )
{
image.setImageWidth( readInteger( imageWidthAttribute.getText() ) );
}
// Reading the 'imageHeight' attribute
Attribute imageHeightAttribute = element.attribute( ATTRIBUTE_IMAGE_HEIGHT );
if ( ( imageHeightAttribute != null ) && ( imageHeightAttribute.getText() != null ) )
{
image.setImageHeight( readInteger( imageHeightAttribute.getText() ) );
}
// Reading the 'data' element
Element imageDataElement = element.element( ELEMENT_DATA );
if ( imageDataElement != null )
{
image.setImageData( imageDataElement.getText() );
}
}
/**
* Reads a label widget.
*
* @param element
* the element
* @param template
* the template
* @throws TemplateIOException
*/
private static void readLabel( Element element, TemplateWidget parent ) throws TemplateIOException
{
LOG.debug( "Reading a template label" ); //$NON-NLS-1$
// Creating the label
TemplateLabel label = new TemplateLabel( parent );
// Reading the widget's common properties
readWidgetCommonProperties( element, label, false, ELEMENT_LABEL );
// Reading the 'value' attribute
Attribute valueAttribute = element.attribute( ATTRIBUTE_VALUE );
if ( ( valueAttribute != null ) && ( valueAttribute.getText() != null ) )
{
label.setValue( valueAttribute.getText() );
}
// Reading the 'numberOfRows' attribute
Attribute numberOfRowsAttribute = element.attribute( ATTRIBUTE_NUMBEROFROWS );
if ( ( numberOfRowsAttribute != null ) && ( numberOfRowsAttribute.getText() != null ) )
{
label.setNumberOfRows( readInteger( numberOfRowsAttribute.getText() ) );
}
// Reading the 'dollarSignIsNewLine' attribute
Attribute dollarSignIsNewLineAttribute = element.attribute( ATTRIBUTE_DOLLAR_SIGN_IS_NEW_LINE );
if ( ( dollarSignIsNewLineAttribute != null ) && ( dollarSignIsNewLineAttribute.getText() != null ) )
{
label.setDollarSignIsNewLine( readBoolean( dollarSignIsNewLineAttribute.getText() ) );
}
}
/**
* Reads a link widget.
*
* @param element
* the element
* @param template
* the template
* @throws TemplateIOException
*/
private static void readLink( Element element, TemplateWidget parent ) throws TemplateIOException
{
LOG.debug( "Reading a template link" ); //$NON-NLS-1$
// Creating the link
TemplateLink link = new TemplateLink( parent );
// Reading the widget's common properties
readWidgetCommonProperties( element, link, false, ELEMENT_LINK );
// Reading the 'value' attribute
Attribute valueAttribute = element.attribute( ATTRIBUTE_VALUE );
if ( ( valueAttribute != null ) && ( valueAttribute.getText() != null ) )
{
link.setValue( valueAttribute.getText() );
}
}
/**
* Reads a listbox widget.
*
* @param element
* the element
* @param template
* the template
* @throws TemplateIOException
*/
private static void readListbox( Element element, TemplateWidget parent ) throws TemplateIOException
{
LOG.debug( "Reading a template listbox" ); //$NON-NLS-1$
// Creating the listbox
TemplateListbox listbox = new TemplateListbox( parent );
// Reading the widget's common properties
readWidgetCommonProperties( element, listbox, true, ELEMENT_LISTBOX );
// Reading the 'multipleSelection' attribute
Attribute multipleSelectionAttribute = element.attribute( ATTRIBUTE_MULTIPLESELECTION );
if ( ( multipleSelectionAttribute != null ) && ( multipleSelectionAttribute.getText() != null ) )
{
listbox.setMultipleSelection( readBoolean( multipleSelectionAttribute.getText() ) );
}
// Reading the 'enabled' attribute
Attribute enabledAttribute = element.attribute( ATTRIBUTE_ENABLED );
if ( ( enabledAttribute != null ) && ( enabledAttribute.getText() != null ) )
{
listbox.setEnabled( readBoolean( enabledAttribute.getText() ) );
}
// Reading the 'items' element
Element itemsElement = element.element( ELEMENT_ITEMS );
if ( itemsElement != null )
{
// Reading the 'item' elements
for ( Iterator<?> i = itemsElement.elementIterator( ELEMENT_ITEM ); i.hasNext(); )
{
Element itemElement = ( Element ) i.next();
listbox.addValue( readValueItem( itemElement ) );
}
// Verifying if at least one button has been read
if ( listbox.getItems().size() == 0 )
{
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" //$NON-NLS-1$
+ NLS.bind( Messages.getString( "TemplateIO.UnableToFindAnyElement" ), ELEMENT_ITEM ) ); //$NON-NLS-1$
}
}
else
{
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" //$NON-NLS-1$
+ NLS.bind( Messages.getString( "TemplateIO.UnableToFindElement" ), ELEMENT_ITEMS ) ); //$NON-NLS-1$
}
}
/**
* Reads the value item.
*
* @param extensionsAttribute
* the attribute
* @param fileChooser
* the file chooser
*/
private static ValueItem readValueItem( Element element )
{
ValueItem valueItem = new ValueItem();
// Reading the 'label' element
Element labelElement = element.element( ELEMENT_LABEL );
if ( ( labelElement != null ) && ( labelElement.getText() != null ) )
{
valueItem.setLabel( labelElement.getText() );
}
// Reading the 'value' element
Element valueElement = element.element( ELEMENT_VALUE );
if ( ( valueElement != null ) && ( valueElement.getText() != null ) )
{
valueItem.setValue( valueElement.getText() );
}
return valueItem;
}
/**
* Reads a section widget.
*
* @param element
* the element
* @param template
* the template
* @throws TemplateIOException
*/
private static void readSection( Element element, TemplateWidget parent ) throws TemplateIOException
{
LOG.debug( "Reading a template section" ); //$NON-NLS-1$
// Creating the section
TemplateSection templateSection = new TemplateSection( parent );
// Reading the widget's common properties
readWidgetCommonProperties( element, templateSection, false, ELEMENT_SECTION );
// Reading the 'title' attribute
Attribute titleAttribute = element.attribute( ATTRIBUTE_TITLE );
if ( ( titleAttribute != null ) && ( titleAttribute.getText() != null ) )
{
templateSection.setTitle( titleAttribute.getText() );
}
// Reading the 'description' attribute
Attribute descriptionAttribute = element.attribute( ATTRIBUTE_DESCRIPTION );
if ( ( descriptionAttribute != null ) && ( descriptionAttribute.getText() != null ) )
{
templateSection.setDescription( descriptionAttribute.getText() );
}
// Reading the 'numberOfColumns' attribute
Attribute numberOfColumnsAttribute = element.attribute( ATTRIBUTE_NUMBEROFCOLUMNS );
if ( ( numberOfColumnsAttribute != null ) && ( numberOfColumnsAttribute.getText() != null ) )
{
templateSection.setNumberOfColumns( readInteger( numberOfColumnsAttribute.getText() ) );
}
// Reading the 'equalColumns' attribute
Attribute equalColumnsAttribute = element.attribute( ATTRIBUTE_EQUALCOLUMNS );
if ( ( equalColumnsAttribute != null ) && ( equalColumnsAttribute.getText() != null ) )
{
templateSection.setEqualColumns( readBoolean( equalColumnsAttribute.getText() ) );
}
// Reading the 'expandable' attribute
Attribute expandableAttribute = element.attribute( ATTRIBUTE_EXPANDABLE );
if ( ( expandableAttribute != null ) && ( expandableAttribute.getText() != null ) )
{
templateSection.setExpandable( readBoolean( expandableAttribute.getText() ) );
}
// Reading the 'expanded' attribute
Attribute expandedAttribute = element.attribute( ATTRIBUTE_EXPANDED );
if ( ( expandedAttribute != null ) && ( expandedAttribute.getText() != null ) )
{
templateSection.setExpanded( readBoolean( expandedAttribute.getText() ) );
}
// Reading the elements
for ( Iterator<?> i = element.elementIterator(); i.hasNext(); )
{
Element childElement = ( Element ) i.next();
readWidget( childElement, templateSection );
}
}
/**
* Reads a password widget.
*
* @param element
* the element
* @param template
* the template
* @throws TemplateIOException
*/
private static void readPassword( Element element, TemplateWidget parent ) throws TemplateIOException
{
LOG.debug( "Reading a template password" ); //$NON-NLS-1$
// Creating the password
TemplatePassword password = new TemplatePassword( parent );
// Reading the widget's common properties
readWidgetCommonProperties( element, password, true, ELEMENT_PASSWORD );
// Reading the 'hidden' attribute
Attribute hiddenAttribute = element.attribute( ATTRIBUTE_HIDDEN );
if ( ( hiddenAttribute != null ) && ( hiddenAttribute.getText() != null ) )
{
password.setHidden( readBoolean( hiddenAttribute.getText() ) );
}
// Reading the 'showEditButton' attribute
Attribute showEditButtonAttribute = element.attribute( ATTRIBUTE_SHOWEDITBUTTON );
if ( ( showEditButtonAttribute != null ) && ( showEditButtonAttribute.getText() != null ) )
{
password.setShowEditButton( readBoolean( showEditButtonAttribute.getText() ) );
}
// Reading the 'showShowPasswordCheckbox' attribute
Attribute showShowPasswordCheckboxAttribute = element.attribute( ATTRIBUTE_SHOWSHOWPASSWORDCHECKBOX );
if ( ( showShowPasswordCheckboxAttribute != null ) && ( showShowPasswordCheckboxAttribute.getText() != null ) )
{
password.setShowShowPasswordCheckbox( readBoolean( showShowPasswordCheckboxAttribute.getText() ) );
}
}
/**
* Reads a radio buttons widget.
*
* @param element
* the element
* @param template
* the template
* @throws TemplateIOException
*/
private static void readRadioButtons( Element element, TemplateWidget parent ) throws TemplateIOException
{
LOG.debug( "Reading a template radio buttons" ); //$NON-NLS-1$
// Creating the radioButtons
TemplateRadioButtons radioButtons = new TemplateRadioButtons( parent );
// Reading the widget's common properties
readWidgetCommonProperties( element, radioButtons, true, ELEMENT_RADIOBUTTONS );
// Reading the 'enabled' attribute
Attribute enabledAttribute = element.attribute( ATTRIBUTE_ENABLED );
if ( ( enabledAttribute != null ) && ( enabledAttribute.getText() != null ) )
{
radioButtons.setEnabled( readBoolean( enabledAttribute.getText() ) );
}
// Reading the 'buttons' element
Element buttonsElement = element.element( ELEMENT_BUTTONS );
if ( buttonsElement != null )
{
// Reading the 'button' elements
for ( Iterator<?> i = buttonsElement.elementIterator( ELEMENT_BUTTON ); i.hasNext(); )
{
Element buttonElement = ( Element ) i.next();
radioButtons.addButton( readValueItem( buttonElement ) );
}
// Verifying if at least one button has been read
if ( radioButtons.getButtons().size() == 0 )
{
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" //$NON-NLS-1$
+ NLS.bind( Messages.getString( "TemplateIO.UnableToFindAnyElement" ), ELEMENT_BUTTON ) ); //$NON-NLS-1$
}
}
else
{
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" //$NON-NLS-1$
+ NLS.bind( Messages.getString( "TemplateIO.UnableToFindElement" ), ELEMENT_BUTTONS ) ); //$NON-NLS-1$
}
}
/**
* Reads a spinner widget.
*
* @param element
* the element
* @param template
* the template
* @throws TemplateIOException
*/
private static void readSpinner( Element element, TemplateWidget parent ) throws TemplateIOException
{
LOG.debug( "Reading a template spinner" ); //$NON-NLS-1$
// Creating the spinner
TemplateSpinner spinner = new TemplateSpinner( parent );
// Reading the widget's common properties
readWidgetCommonProperties( element, spinner, true, ELEMENT_SPINNER );
// Reading the 'minimum' attribute
Attribute minimumAttribute = element.attribute( ATTRIBUTE_MINIMUM );
if ( ( minimumAttribute != null ) && ( minimumAttribute.getText() != null ) )
{
spinner.setMinimum( readInteger( minimumAttribute.getText() ) );
}
// Reading the 'maximum' attribute
Attribute maximumAttribute = element.attribute( ATTRIBUTE_MAXIMUM );
if ( ( maximumAttribute != null ) && ( maximumAttribute.getText() != null ) )
{
spinner.setMaximum( readInteger( maximumAttribute.getText() ) );
}
// Reading the 'increment' attribute
Attribute incrementAttribute = element.attribute( ATTRIBUTE_INCREMENT );
if ( ( incrementAttribute != null ) && ( incrementAttribute.getText() != null ) )
{
spinner.setIncrement( readInteger( incrementAttribute.getText() ) );
}
// Reading the 'pageIncrement' attribute
Attribute pageIncrementAttribute = element.attribute( ATTRIBUTE_PAGEINCREMENT );
if ( ( pageIncrementAttribute != null ) && ( pageIncrementAttribute.getText() != null ) )
{
spinner.setPageIncrement( readInteger( pageIncrementAttribute.getText() ) );
}
// Reading the 'digits' attribute
Attribute digitsAttribute = element.attribute( ATTRIBUTE_DIGITS );
if ( ( digitsAttribute != null ) && ( digitsAttribute.getText() != null ) )
{
spinner.setDigits( readInteger( digitsAttribute.getText() ) );
}
}
/**
* Reads a table widget.
*
* @param element
* the element
* @param template
* the template
* @throws TemplateIOException
*/
private static void readTable( Element element, TemplateWidget parent ) throws TemplateIOException
{
LOG.debug( "Reading a template table" ); //$NON-NLS-1$
// Creating the table
TemplateTable table = new TemplateTable( parent );
// Reading the widget's common properties
readWidgetCommonProperties( element, table, true, ELEMENT_TABLE );
// Reading the 'showAddButton' attribute
Attribute showAddButtonAttribute = element.attribute( ATTRIBUTE_SHOWADDBUTTON );
if ( ( showAddButtonAttribute != null ) && ( showAddButtonAttribute.getText() != null ) )
{
table.setShowAddButton( readBoolean( showAddButtonAttribute.getText() ) );
}
// Reading the 'showEditButton' attribute
Attribute showEditButtonAttribute = element.attribute( ATTRIBUTE_SHOWEDITBUTTON );
if ( ( showEditButtonAttribute != null ) && ( showEditButtonAttribute.getText() != null ) )
{
table.setShowEditButton( readBoolean( showEditButtonAttribute.getText() ) );
}
// Reading the 'showDeleteButton' attribute
Attribute showDeleteButtonAttribute = element.attribute( ATTRIBUTE_SHOWDELETEBUTTON );
if ( ( showDeleteButtonAttribute != null ) && ( showDeleteButtonAttribute.getText() != null ) )
{
table.setShowDeleteButton( readBoolean( showDeleteButtonAttribute.getText() ) );
}
}
/**
* Reads a text field widget.
*
* @param element
* the element
* @param template
* the template
* @throws TemplateIOException
*/
private static void readTextfield( Element element, TemplateWidget parent ) throws TemplateIOException
{
LOG.debug( "Reading a template textfield" ); //$NON-NLS-1$
// Creating the text field
TemplateTextField textField = new TemplateTextField( parent );
// Reading the widget's common properties
readWidgetCommonProperties( element, textField, true, ELEMENT_TEXTFIELD );
// Reading the 'numberOfRows' attribute
Attribute numberOfRowsAttribute = element.attribute( ATTRIBUTE_NUMBEROFROWS );
if ( ( numberOfRowsAttribute != null ) && ( numberOfRowsAttribute.getText() != null ) )
{
textField.setNumberOfRows( readInteger( numberOfRowsAttribute.getText() ) );
}
// Reading the 'charactersLimit' attribute
Attribute charactersLimitAttribute = element.attribute( ATTRIBUTE_CHARACTERSLIMIT );
if ( ( charactersLimitAttribute != null ) && ( charactersLimitAttribute.getText() != null ) )
{
textField.setCharactersLimit( readInteger( charactersLimitAttribute.getText() ) );
}
// Reading the 'dollarSignIsNewLine' attribute
Attribute dollarSignIsNewLineAttribute = element.attribute( ATTRIBUTE_DOLLAR_SIGN_IS_NEW_LINE );
if ( ( dollarSignIsNewLineAttribute != null ) && ( dollarSignIsNewLineAttribute.getText() != null ) )
{
textField.setDollarSignIsNewLine( readBoolean( dollarSignIsNewLineAttribute.getText() ) );
}
}
/**
* Reads a boolean.
*
* @param text
* the boolean as a string
*/
private static boolean readBoolean( String text ) throws TemplateIOException
{
if ( text.equalsIgnoreCase( VALUE_TRUE ) )
{
return true;
}
else if ( text.equalsIgnoreCase( VALUE_FALSE ) )
{
return false;
}
else
{
LOG.error( "Unable to convert this string to a boolean ('" + VALUE_TRUE + "' or '" + VALUE_FALSE + "'): '" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ text + "'." ); //$NON-NLS-1$
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" //$NON-NLS-1$
+ NLS.bind( Messages.getString( "TemplateIO.UnableToConvertStringToBoolean" ), new String[] //$NON-NLS-1$
{ VALUE_TRUE, VALUE_FALSE, text } ) );
}
}
/**
* Reads an integer.
*
* @param text
* the integer as a string
*/
private static int readInteger( String text ) throws TemplateIOException
{
try
{
return Integer.parseInt( text );
}
catch ( NumberFormatException e )
{
LOG.error( "Unable to convert this string to an integer: '" + text + "'." ); //$NON-NLS-1$ //$NON-NLS-2$
throw new TemplateIOException( THE_FILE_DOES_NOT_SEEM_TO_BE_A_VALID_TEMPLATE_FILE + "\n" //$NON-NLS-1$
+ NLS.bind( Messages.getString( "TemplateIO.UnableToConvertStringToInteger" ), text ) ); //$NON-NLS-1$
}
}
/**
* Saves the template using the writer.
*
* @param template
* the connections
* @param stream
* the OutputStream
* @throws IOException
* if an I/O error occurs
*/
public static void save( Template template, OutputStream stream ) throws IOException
{
// Creating the Document
Document document = DocumentHelper.createDocument();
writeTemplate( document, template );
// Writing the file to disk
OutputFormat outformat = OutputFormat.createPrettyPrint();
outformat.setEncoding( "UTF-8" ); //$NON-NLS-1$
XMLWriter writer = new XMLWriter( stream, outformat );
writer.write( document );
writer.flush();
writer.close();
}
/**
* Writes the template.
*
* @param document
* the document to write into
* @param template
* the template
*/
private static void writeTemplate( Document document, Template template )
{
// Creating the root element
Element rootElement = document.addElement( ELEMENT_TEMPLATE );
// Writing the ID
rootElement.addAttribute( ATTRIBUTE_ID, template.getId() );
// Writing the title
rootElement.addAttribute( ATTRIBUTE_TITLE, template.getTitle() );
// Writing the object classes
writeObjectClasses( rootElement, template );
// Writing the form
writeForm( rootElement, template );
}
/**
* Writes the object classes.
*
* @param element
* the parent element
* @param template
* the template
*/
private static void writeObjectClasses( Element element, Template template )
{
// Creating the 'objectClasses' element
Element objectClassesElement = element.addElement( ELEMENT_OBJECTCLASSES );
// Creating the 'structural' element
objectClassesElement.addElement( ELEMENT_STRUCTURAL ).setText( template.getStructuralObjectClass() );
List<String> auxiliaryObjectClasses = template.getAuxiliaryObjectClasses();
if ( ( auxiliaryObjectClasses != null ) & ( auxiliaryObjectClasses.size() > 0 ) )
{
// Creating the 'auxiliaries' element
Element auxiliariesElement = objectClassesElement.addElement( ELEMENT_AUXILIARIES );
// Creating each 'auxiliary' element
for ( String auxliaryObjectClass : template.getAuxiliaryObjectClasses() )
{
auxiliariesElement.addElement( ELEMENT_AUXILIARY ).setText( auxliaryObjectClass );
}
}
}
/**
* Writes the form.
*
* @param element
* the parent element
* @param template
* the template
*/
private static void writeForm( Element element, Template template )
{
// Creating the 'form' element
Element formElement = element.addElement( ELEMENT_FORM );
// Getting the form
TemplateForm form = template.getForm();
// Creating each child element
for ( TemplateWidget widget : form.getChildren() )
{
writeWidget( formElement, widget );
}
}
/**
* Writes a widget.
*
* @param element
* the parent element
* @param widget
* the widget
*/
private static void writeWidget( Element element, TemplateWidget widget )
{
// Switching on the various widgets we support
if ( widget instanceof TemplateCheckbox )
{
writeCheckbox( element, ( TemplateCheckbox ) widget );
}
else if ( widget instanceof TemplateComposite )
{
writeComposite( element, ( TemplateComposite ) widget );
}
else if ( widget instanceof TemplateDate )
{
writeDate( element, ( TemplateDate ) widget );
}
else if ( widget instanceof TemplateFileChooser )
{
writeFileChooser( element, ( TemplateFileChooser ) widget );
}
else if ( widget instanceof TemplateImage )
{
writeImage( element, ( TemplateImage ) widget );
}
else if ( widget instanceof TemplateLabel )
{
writeLabel( element, ( TemplateLabel ) widget );
}
else if ( widget instanceof TemplateLink )
{
writeLink( element, ( TemplateLink ) widget );
}
else if ( widget instanceof TemplateListbox )
{
writeListbox( element, ( TemplateListbox ) widget );
}
else if ( widget instanceof TemplateSection )
{
writeSection( element, ( TemplateSection ) widget );
}
else if ( widget instanceof TemplatePassword )
{
writePassword( element, ( TemplatePassword ) widget );
}
else if ( widget instanceof TemplateRadioButtons )
{
writeRadioButtons( element, ( TemplateRadioButtons ) widget );
}
else if ( widget instanceof TemplateSpinner )
{
writeSpinner( element, ( TemplateSpinner ) widget );
}
else if ( widget instanceof TemplateTable )
{
writeTable( element, ( TemplateTable ) widget );
}
else if ( widget instanceof TemplateTextField )
{
writeTextfield( element, ( TemplateTextField ) widget );
}
// We could not find a correct widget type.
else
{
// Unsupported widget type
}
}
/**
* Writes the widget's common properties like 'attributeType' and all position related properties.
*
* @param element
* the element
* @param widget
* the widget
*/
private static void writeWidgetCommonProperties( Element element, TemplateWidget widget )
{
// Creating the 'attributeType' attribute
writeAttributeTypeAttribute( element, widget );
// Creating the 'horizontalAlignment' attribute
if ( widget.getHorizontalAlignment() != TemplateWidget.DEFAULT_HORIZONTAL_ALIGNMENT )
{
element.addAttribute( ATTRIBUTE_HORIZONTAL_ALIGNMENT, getWidgetAlignmentValue( widget
.getHorizontalAlignment() ) );
}
// Creating the 'verticalAlignment' attribute
if ( widget.getVerticalAlignment() != TemplateWidget.DEFAULT_VERTICAL_ALIGNMENT )
{
element
.addAttribute( ATTRIBUTE_VERTICAL_ALIGNMENT, getWidgetAlignmentValue( widget.getVerticalAlignment() ) );
}
// Creating the 'grabExcessHorizontalSpace' attribute
if ( widget.isGrabExcessHorizontalSpace() != TemplateWidget.DEFAULT_GRAB_EXCESS_HORIZONTAL_SPACE )
{
element.addAttribute( ATTRIBUTE_GRAB_EXCESS_HORIZONTAL_SPACE, "" + widget.isGrabExcessHorizontalSpace() ); //$NON-NLS-1$
}
// Creating the 'grabExcessVerticalSpace' attribute
if ( widget.isGrabExcessVerticalSpace() != TemplateWidget.DEFAULT_GRAB_EXCESS_VERTICAL_SPACE )
{
element.addAttribute( ATTRIBUTE_GRAB_EXCESS_VERTICAL_SPACE, "" + widget.isGrabExcessVerticalSpace() ); //$NON-NLS-1$
}
// Creating the 'horizontalSpan' attribute
if ( widget.getHorizontalSpan() != TemplateWidget.DEFAULT_HORIZONTAL_SPAN )
{
element.addAttribute( ATTRIBUTE_HORIZONTAL_SPAN, "" + widget.getHorizontalSpan() ); //$NON-NLS-1$
}
// Creating the 'verticalSpan' attribute
if ( widget.getVerticalSpan() != TemplateWidget.DEFAULT_VERTICAL_SPAN )
{
element.addAttribute( ATTRIBUTE_VERTICAL_SPAN, "" + widget.getVerticalSpan() ); //$NON-NLS-1$
}
// Creating the 'width' attribute
if ( widget.getImageWidth() != TemplateWidget.DEFAULT_SIZE )
{
element.addAttribute( ATTRIBUTE_WIDTH, "" + widget.getImageWidth() ); //$NON-NLS-1$
}
// Creating the 'height' attribute
if ( widget.getImageHeight() != TemplateWidget.DEFAULT_SIZE )
{
element.addAttribute( ATTRIBUTE_HEIGHT, "" + widget.getImageHeight() ); //$NON-NLS-1$
}
}
/**
* Gets the String value associated with the given widget alignment.
*
* @param alignment
* the widget alignment
* @return
* the String value associated with the given widget alignment
*/
private static String getWidgetAlignmentValue( WidgetAlignment alignment )
{
switch ( alignment )
{
case NONE:
return VALUE_NONE;
case BEGINNING:
return VALUE_BEGINNING;
case CENTER:
return VALUE_CENTER;
case END:
return VALUE_END;
case FILL:
return VALUE_FILL;
default:
return VALUE_NONE;
}
}
/**
* Writes the attribute type attribute of a widget.
*
* @param element
* the element
* @param widget
* the widget
*/
private static void writeAttributeTypeAttribute( Element element, TemplateWidget widget )
{
String attributeType = widget.getAttributeType();
if ( ( attributeType != null ) && ( !attributeType.equals( "" ) ) ) //$NON-NLS-1$
{
element.addAttribute( ATTRIBUTE_ATTRIBUTETYPE, attributeType );
}
}
/**
* Writes a checkbox widget.
*
* @param element
* the parent element
* @param checkbox
* the checkbox widget
*/
private static void writeCheckbox( Element element, TemplateCheckbox checkbox )
{
// Creating the 'checkbox' element
Element checkboxElement = element.addElement( ELEMENT_CHECKBOX );
// Creating the widget's common properties
writeWidgetCommonProperties( checkboxElement, checkbox );
// Creating the 'label' attribute
String label = ( String ) checkbox.getLabel();
if ( ( label != null ) && ( !( label.equals( TemplateCheckbox.DEFAULT_LABEL ) ) ) )
{
checkboxElement.addAttribute( ATTRIBUTE_LABEL, checkbox.getLabel() );
}
// Creating the 'enabled' attribute
if ( checkbox.isEnabled() != TemplateCheckbox.DEFAULT_ENABLED )
{
checkboxElement.addAttribute( ATTRIBUTE_ENABLED, "" + checkbox.isEnabled() ); //$NON-NLS-1$
}
// Creating the 'checkedValue' element (if necessary)
String checkedValue = ( String ) checkbox.getCheckedValue();
if ( ( checkedValue != null ) && ( !( checkedValue.equals( TemplateCheckbox.DEFAULT_CHECKED_VALUE ) ) ) )
{
Element checkedValueElement = checkboxElement.addElement( ELEMENT_CHECKEDVALUE );
checkedValueElement.setText( checkedValue );
}
// Creating the 'uncheckedValue' element
String uncheckedValue = ( String ) checkbox.getUncheckedValue();
if ( ( uncheckedValue != null ) && ( !( uncheckedValue.equals( TemplateCheckbox.DEFAULT_UNCHECKED_VALUE ) ) ) )
{
Element uncheckedValueElement = checkboxElement.addElement( ELEMENT_UNCHECKEDVALUE );
uncheckedValueElement.setText( uncheckedValue );
}
}
/**
* Writes a composite widget.
*
* @param element
* the parent element
* @param composite
* the composite widget
*/
private static void writeComposite( Element element, TemplateComposite composite )
{
// Creating the 'composite' element
Element compositeElement = element.addElement( ELEMENT_COMPOSITE );
// Creating the widget's common properties
writeWidgetCommonProperties( compositeElement, composite );
// Creating the 'numberOfColumns' attribute
if ( composite.getNumberOfColumns() != TemplateComposite.DEFAULT_NUMBER_OF_COLUMNS )
{
compositeElement.addAttribute( ATTRIBUTE_NUMBEROFCOLUMNS, "" + composite.getNumberOfColumns() ); //$NON-NLS-1$
}
// Creating the 'equalColumns' attribute
if ( composite.isEqualColumns() != TemplateComposite.DEFAULT_EQUAL_COLUMNS )
{
compositeElement.addAttribute( ATTRIBUTE_EQUALCOLUMNS, "" + composite.isEqualColumns() ); //$NON-NLS-1$
}
// Creating the children
List<TemplateWidget> children = composite.getChildren();
if ( ( children != null ) && ( children.size() > 0 ) )
{
for ( TemplateWidget child : children )
{
writeWidget( compositeElement, child );
}
}
}
/**
* Writes a date widget.
*
* @param element
* the parent element
* @param date
* the date widget
*/
private static void writeDate( Element element, TemplateDate date )
{
// Creating the 'date' element
Element dateElement = element.addElement( ELEMENT_DATE );
// Creating the widget's common properties
writeWidgetCommonProperties( dateElement, date );
// Creating the 'showEditButton' attribute
if ( date.isShowEditButton() != TemplateDate.DEFAULT_SHOW_EDIT_BUTTON )
{
dateElement.addAttribute( ATTRIBUTE_SHOWEDITBUTTON, convert( date.isShowEditButton() ) );
}
// Creating the 'format' element
String format = date.getFormat();
if ( ( format != null ) && ( !( format.equals( TemplateDate.DEFAULT_FORMAT ) ) ) )
{
dateElement.addAttribute( ATTRIBUTE_FORMAT, format );
}
}
/**
* Writes a file chooser widget.
*
* @param element
* the parent element
* @param fileChooser
* the file chooser widget
*/
private static void writeFileChooser( Element element, TemplateFileChooser fileChooser )
{
// Creating the 'fileChooser' element
Element fileChooserElement = element.addElement( ELEMENT_FILECHOOSER );
// Creating the widget's common properties
writeWidgetCommonProperties( fileChooserElement, fileChooser );
// Creating the 'extensions' attribute (if necessary)
Set<String> extensions = fileChooser.getExtensions();
if ( ( extensions != null ) && ( extensions.size() > 0 ) )
{
// Creating the string containing the extensions value (all the
// extensions are concatenated and split with a ',' character).
StringBuilder sb = new StringBuilder();
for ( String extension : extensions )
{
sb.append( extension );
sb.append( "," ); //$NON-NLS-1$
}
// Removing the last ',' character
if ( sb.length() > 0 )
{
sb.deleteCharAt( sb.length() - 1 );
}
// Creating the 'extensions' attribute
fileChooserElement.addAttribute( ATTRIBUTE_EXTENSIONS, sb.toString() );
}
// Creating the 'showIcon' attribute
if ( fileChooser.isShowIcon() != TemplateFileChooser.DEFAULT_SHOW_ICON )
{
fileChooserElement.addAttribute( ATTRIBUTE_SHOWICON, convert( fileChooser.isShowIcon() ) );
}
// Creating the 'showSaveAsButton' attribute
if ( fileChooser.isShowClearButton() != TemplateFileChooser.DEFAULT_SHOW_SAVE_AS_BUTTON )
{
fileChooserElement.addAttribute( ATTRIBUTE_SHOWSAVEASBUTTON, convert( fileChooser.isShowSaveAsButton() ) );
}
// Creating the 'showClearButton' attribute
if ( fileChooser.isShowClearButton() != TemplateFileChooser.DEFAULT_SHOW_CLEAR_BUTTON )
{
fileChooserElement.addAttribute( ATTRIBUTE_SHOWCLEARBUTTON, convert( fileChooser.isShowClearButton() ) );
}
// Creating the 'showBrowseButton' attribute
if ( fileChooser.isShowBrowseButton() != TemplateFileChooser.DEFAULT_SHOW_BROWSE_BUTTON )
{
fileChooserElement.addAttribute( ATTRIBUTE_SHOWBROWSEBUTTON, convert( fileChooser.isShowBrowseButton() ) );
}
// Creating the 'icon' element
String icon = ( String ) fileChooser.getIcon();
if ( ( icon != null ) && ( !( icon.equals( TemplateFileChooser.DEFAULT_ICON ) ) ) )
{
fileChooserElement.addElement( ELEMENT_ICON ).setText( icon );
}
}
/**
* Writes an image widget.
*
* @param element
* the parent element
* @param image
* the image widget
*/
private static void writeImage( Element element, TemplateImage image )
{
// Creating the 'image' element
Element imageElement = element.addElement( ELEMENT_IMAGE );
// Creating the widget's common properties
writeWidgetCommonProperties( imageElement, image );
// Creating the 'showSaveAsButton' attribute
if ( image.isShowSaveAsButton() != TemplateImage.DEFAULT_SHOW_SAVE_AS_BUTTON )
{
imageElement.addAttribute( ATTRIBUTE_SHOWSAVEASBUTTON, convert( image.isShowSaveAsButton() ) );
}
// Creating the 'showClearButton' attribute
if ( image.isShowClearButton() != TemplateImage.DEFAULT_SHOW_CLEAR_BUTTON )
{
imageElement.addAttribute( ATTRIBUTE_SHOWCLEARBUTTON, convert( image.isShowClearButton() ) );
}
// Creating the 'showChooseButton' attribute
if ( image.isShowBrowseButton() != TemplateImage.DEFAULT_SHOW_BROWSE_BUTTON )
{
imageElement.addAttribute( ATTRIBUTE_SHOWBROWSEBUTTON, convert( image.isShowBrowseButton() ) );
}
// Creating the 'imageWidth' attribute
if ( image.getImageWidth() != TemplateWidget.DEFAULT_SIZE )
{
imageElement.addAttribute( ATTRIBUTE_IMAGE_WIDTH, "" + image.getImageWidth() ); //$NON-NLS-1$
}
// Creating the 'imageHeight' attribute
if ( image.getImageHeight() != TemplateWidget.DEFAULT_SIZE )
{
imageElement.addAttribute( ATTRIBUTE_IMAGE_HEIGHT, "" + image.getImageHeight() ); //$NON-NLS-1$
}
// Creating the 'data' element
String imageData = ( String ) image.getImageData();
if ( ( imageData != null ) && ( !( imageData.equals( TemplateImage.DEFAULT_IMAGE_DATA ) ) ) )
{
imageElement.addElement( ELEMENT_DATA ).setText( imageData );
}
}
/**
* Writes a label widget.
*
* @param element
* the parent element
* @param label
* the label widget
*/
private static void writeLabel( Element element, TemplateLabel label )
{
// Creating the 'label' element
Element labelElement = element.addElement( ELEMENT_LABEL );
// Creating the widget's common properties
writeWidgetCommonProperties( labelElement, label );
// Creating the 'value' attribute
String value = label.getValue();
if ( ( value != null ) && ( !( value.equals( TemplateLabel.DEFAULT_VALUE ) ) ) )
{
labelElement.addAttribute( ATTRIBUTE_VALUE, value );
}
// Creating the 'numberOfRows' attribute
if ( label.getNumberOfRows() != TemplateLabel.DEFAULT_NUMBER_OF_ROWS )
{
labelElement.addAttribute( ATTRIBUTE_NUMBEROFROWS, "" + label.getNumberOfRows() ); //$NON-NLS-1$
}
// Creating the 'dollarSignIsNewLine' attribute
if ( label.isDollarSignIsNewLine() != TemplateLabel.DEFAULT_DOLLAR_SIGN_IS_NEW_LINE )
{
labelElement.addAttribute( ATTRIBUTE_DOLLAR_SIGN_IS_NEW_LINE, "" + label.isDollarSignIsNewLine() ); //$NON-NLS-1$
}
}
/**
* Writes a link widget.
*
* @param element
* the parent element
* @param link
* the link widget
*/
private static void writeLink( Element element, TemplateLink link )
{
// Creating the 'link' element
Element linkElement = element.addElement( ELEMENT_LINK );
// Creating the widget's common properties
writeWidgetCommonProperties( linkElement, link );
// Creating the 'value' attribute
String value = link.getValue();
if ( ( value != null ) && ( !( value.equals( TemplateLink.DEFAULT_VALUE ) ) ) )
{
linkElement.addAttribute( ATTRIBUTE_VALUE, value );
}
}
/**
* Writes a lisbox widget.
*
* @param element
* the parent element
* @param listbox
*/
private static void writeListbox( Element element, TemplateListbox listbox )
{
// Creating the 'listbox' element
Element listboxElement = element.addElement( ELEMENT_LISTBOX );
// Creating the widget's common properties
writeWidgetCommonProperties( listboxElement, listbox );
// Creating the 'enabled' attribute
if ( listbox.isEnabled() != TemplateListbox.DEFAULT_ENABLED )
{
listboxElement.addAttribute( ATTRIBUTE_ENABLED, "" + listbox.isEnabled() ); //$NON-NLS-1$
}
// Creating the 'multipleSelection' attribute
if ( listbox.isMultipleSelection() != TemplateListbox.DEFAULT_MULTIPLE_SELECTION )
{
listboxElement.addAttribute( ATTRIBUTE_MULTIPLESELECTION, convert( listbox.isMultipleSelection() ) );
}
// Creating the 'items' element
List<ValueItem> items = listbox.getItems();
if ( ( items != null ) && ( items.size() > 0 ) )
{
Element itemsElement = listboxElement.addElement( ELEMENT_ITEMS );
// Creating the 'item' elements
for ( ValueItem item : items )
{
Element itemElement = itemsElement.addElement( ELEMENT_ITEM );
writeValueItem( itemElement, item );
}
}
}
/**
* Writes a value item.
*
* @param element
* the parent element
* @param item
* the value item
*/
private static void writeValueItem( Element element, ValueItem item )
{
// Creating the 'label' element
String itemLabel = item.getLabel();
if ( ( itemLabel != null ) && ( !itemLabel.equals( "" ) ) ) //$NON-NLS-1$
{
element.addElement( ELEMENT_LABEL ).setText( itemLabel );
}
// Creating the 'value' element
String itemValue = ( String ) item.getValue();
if ( ( itemValue != null ) && ( !itemValue.equals( "" ) ) ) //$NON-NLS-1$
{
element.addElement( ELEMENT_VALUE ).setText( itemValue );
}
}
/**
* Writes a password widget.
*
* @param element
* the parent element
* @param password
* the password widget
*/
private static void writePassword( Element element, TemplatePassword password )
{
// Creating the 'password' element
Element passwordElement = element.addElement( ELEMENT_PASSWORD );
// Creating the widget's common properties
writeWidgetCommonProperties( passwordElement, password );
// Creating the 'hidden' attribute
if ( password.isHidden() != TemplatePassword.DEFAULT_HIDDEN )
{
passwordElement.addAttribute( ATTRIBUTE_HIDDEN, convert( password.isHidden() ) );
}
// Creating the 'showEditButton' attribute
if ( password.isShowEditButton() != TemplatePassword.DEFAULT_SHOW_EDIT_BUTTON )
{
passwordElement.addAttribute( ATTRIBUTE_SHOWEDITBUTTON, convert( password.isShowEditButton() ) );
}
// Creating the 'showShowPasswordCheckbox' attribute
if ( password.isShowShowPasswordCheckbox() != TemplatePassword.DEFAULT_SHOW_PASSWORD_CHECKBOX )
{
passwordElement.addAttribute( ATTRIBUTE_SHOWSHOWPASSWORDCHECKBOX, convert( password
.isShowShowPasswordCheckbox() ) );
}
}
/**
* Writes a radio buttons widget.
*
* @param element
* the parent element
* @param radioButtons
* the radio buttons widget
*/
private static void writeRadioButtons( Element element, TemplateRadioButtons radioButtons )
{
// Creating the 'radioButtons' element
Element radioButtonsElement = element.addElement( ELEMENT_RADIOBUTTONS );
// Creating the widget's common properties
writeWidgetCommonProperties( element, radioButtons );
// Creating the 'enabled' attribute
if ( radioButtons.isEnabled() != TemplateRadioButtons.DEFAULT_ENABLED )
{
radioButtonsElement.addAttribute( ATTRIBUTE_ENABLED, "" + radioButtons.isEnabled() ); //$NON-NLS-1$
}
// Creating the 'buttons' element
List<ValueItem> buttons = radioButtons.getButtons();
if ( ( buttons != null ) && ( buttons.size() > 0 ) )
{
Element buttonsElement = radioButtonsElement.addElement( ELEMENT_BUTTONS );
for ( ValueItem button : buttons )
{
Element buttonElement = buttonsElement.addElement( ELEMENT_BUTTON );
writeValueItem( buttonElement, button );
}
}
}
/**
* Writes a section widget.
*
* @param element
* the parent element
* @param section
* the section widget
*/
private static void writeSection( Element element, TemplateSection section )
{
// Creating the 'section' element
Element sectionElement = element.addElement( ELEMENT_SECTION );
// Creating the widget's common properties
writeWidgetCommonProperties( sectionElement, section );
// Creating the 'title' attribute
String title = section.getTitle();
if ( ( title != null ) && ( !( title.equals( TemplateSection.DEFAULT_TITLE ) ) ) )
{
sectionElement.addAttribute( ATTRIBUTE_TITLE, title );
}
// Creating the 'description' attribute
String description = section.getDescription();
if ( ( description != null ) && ( !( description.equals( TemplateSection.DEFAULT_DESCRIPTION ) ) ) )
{
sectionElement.addAttribute( ATTRIBUTE_DESCRIPTION, description );
}
// Creating the 'numberOfColumns' attribute
if ( section.getNumberOfColumns() != TemplateSection.DEFAULT_NUMBER_OF_COLUMNS )
{
sectionElement.addAttribute( ATTRIBUTE_NUMBEROFCOLUMNS, "" + section.getNumberOfColumns() ); //$NON-NLS-1$
}
// Creating the 'equalColumns' attribute
if ( section.isEqualColumns() != TemplateSection.DEFAULT_EQUAL_COLUMNS )
{
sectionElement.addAttribute( ATTRIBUTE_EQUALCOLUMNS, "" + section.isEqualColumns() ); //$NON-NLS-1$
}
// Creating the 'expandable' attribute
if ( section.isExpandable() != TemplateSection.DEFAULT_EXPANDABLE )
{
sectionElement.addAttribute( ATTRIBUTE_EXPANDABLE, "" + section.isExpandable() ); //$NON-NLS-1$
}
// Creating the 'expanded' attribute
if ( section.isExpanded() != TemplateSection.DEFAULT_EXPANDED )
{
sectionElement.addAttribute( ATTRIBUTE_EXPANDED, "" + section.isExpanded() ); //$NON-NLS-1$
}
// Creating the children
List<TemplateWidget> children = section.getChildren();
if ( ( children != null ) && ( children.size() > 0 ) )
{
for ( TemplateWidget child : children )
{
writeWidget( sectionElement, child );
}
}
}
/**
* Writes a spinner widget.
*
* @param element
* the parent element
* @param spinner
* the spinner widget
*/
private static void writeSpinner( Element element, TemplateSpinner spinner )
{
// Creating the 'spinner' element
Element spinnerElement = element.addElement( ELEMENT_SPINNER );
// Creating the widget's common properties
writeWidgetCommonProperties( spinnerElement, spinner );
// Reading the 'minimum' attribute
if ( spinner.getMinimum() != TemplateSpinner.DEFAULT_MINIMUM )
{
spinnerElement.addAttribute( ATTRIBUTE_MINIMUM, "" + spinner.getMinimum() ); //$NON-NLS-1$
}
// Reading the 'maximum' attribute
if ( spinner.getMaximum() != TemplateSpinner.DEFAULT_MAXIMUM )
{
spinnerElement.addAttribute( ATTRIBUTE_MAXIMUM, "" + spinner.getMaximum() ); //$NON-NLS-1$
}
// Reading the 'increment' attribute
if ( spinner.getIncrement() != TemplateSpinner.DEFAULT_INCREMENT )
{
spinnerElement.addAttribute( ATTRIBUTE_INCREMENT, "" + spinner.getIncrement() ); //$NON-NLS-1$
}
// Reading the 'pageIncrement' attribute
if ( spinner.getPageIncrement() != TemplateSpinner.DEFAULT_PAGE_INCREMENT )
{
spinnerElement.addAttribute( ATTRIBUTE_PAGEINCREMENT, "" + spinner.getPageIncrement() ); //$NON-NLS-1$
}
// Reading the 'digits' attribute
if ( spinner.getDigits() != TemplateSpinner.DEFAULT_DIGITS )
{
spinnerElement.addAttribute( ATTRIBUTE_DIGITS, "" + spinner.getDigits() ); //$NON-NLS-1$
}
}
/**
* Writes the table widget.
*
* @param element
* the parent element
* @param table
* the table widget
*/
private static void writeTable( Element element, TemplateTable table )
{
// Creating the 'table' element
Element tableElement = element.addElement( ELEMENT_TABLE );
// Creating the widget's common properties
writeWidgetCommonProperties( tableElement, table );
// Creating the 'showAddButton' attribute
if ( table.isShowAddButton() != TemplateTable.DEFAULT_SHOW_ADD_BUTTON )
{
tableElement.addAttribute( ATTRIBUTE_SHOWADDBUTTON, convert( table.isShowAddButton() ) );
}
// Creating the 'showEditButton' attribute
if ( table.isShowEditButton() != TemplateTable.DEFAULT_SHOW_EDIT_BUTTON )
{
tableElement.addAttribute( ATTRIBUTE_SHOWEDITBUTTON, convert( table.isShowEditButton() ) );
}
// Creating the 'showDeleteButton' attribute
if ( table.isShowDeleteButton() != TemplateTable.DEFAULT_SHOW_DELETE_BUTTON )
{
tableElement.addAttribute( ATTRIBUTE_SHOWDELETEBUTTON, convert( table.isShowDeleteButton() ) );
}
}
/**
* Writes a text field widget.
*
* @param element
* the parent element
* @param textField
* the text field widget
*/
private static void writeTextfield( Element element, TemplateTextField textField )
{
// Creating the 'textField' element
Element textFieldElement = element.addElement( ELEMENT_TEXTFIELD );
// Creating the widget's common properties
writeWidgetCommonProperties( textFieldElement, textField );
// Creating the 'numberOfRows' attribute
if ( textField.getNumberOfRows() != TemplateTextField.DEFAULT_NUMBER_OF_ROWS )
{
textFieldElement.addAttribute( ATTRIBUTE_NUMBEROFROWS, "" + textField.getNumberOfRows() ); //$NON-NLS-1$
}
// Creating the 'charactersLimit' attribute
if ( textField.getCharactersLimit() != TemplateTextField.DEFAULT_CHARACTERS_LIMIT )
{
textFieldElement.addAttribute( ATTRIBUTE_CHARACTERSLIMIT, "" + textField.getCharactersLimit() ); //$NON-NLS-1$
}
// Creating the 'dollarSignIsNewLine' attribute
if ( textField.isDollarSignIsNewLine() != TemplateTextField.DEFAULT_DOLLAR_SIGN_IS_NEW_LINE )
{
textFieldElement.addAttribute( ATTRIBUTE_DOLLAR_SIGN_IS_NEW_LINE, "" + textField.isDollarSignIsNewLine() ); //$NON-NLS-1$
}
}
/**
* Converts a boolean.
*
* @param bool
* the boolean
* @return
* its String representation
*/
private static String convert( boolean bool )
{
if ( bool )
{
return VALUE_TRUE;
}
else
{
return VALUE_FALSE;
}
}
}