You are viewing a plain text version of this content. The canonical link for it is here.
Posted to adffaces-commits@incubator.apache.org by ma...@apache.org on 2007/03/07 14:44:48 UTC

svn commit: r515587 [4/19] - in /incubator/adffaces/branches/matzew-core-1.0.0-incubation: ./ examples/ examples/trinidad-demo/ examples/trinidad-demo/src/ examples/trinidad-demo/src/conf/ examples/trinidad-demo/src/main/ examples/trinidad-demo/src/mai...

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateField.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateField.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateField.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateField.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,254 @@
+/*
+ *  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.myfaces.trinidaddemo.composite;
+
+import java.io.IOException;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import javax.faces.application.FacesMessage;
+import javax.faces.component.NamingContainer;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.convert.NumberConverter;
+import javax.faces.event.ValueChangeEvent;
+import javax.faces.validator.LongRangeValidator;
+
+import org.apache.myfaces.trinidad.component.UIXEditableValue;
+import org.apache.myfaces.trinidad.component.core.output.CoreOutputText;
+import org.apache.myfaces.trinidad.component.core.input.CoreInputText;
+
+/**
+ * An experiment in building a composite component.  Some basic
+ * principles:
+ * <ul>
+ * <li> We're a NamingContainer, so our children won't show up in
+ *   findComponent() calls.
+ * <li> The child components get re-created on each pass through
+ *    the system;  this means seeing if they exist in both Apply Request
+ *    Values (<code>processDecodes</code>) and Render Response
+ *    (<code>encodeBegin()</code>), and marking the components
+ *    transient so they don't get saved.
+ * <li> The model is the tricky part:  instead of using real
+ *   <code>ValueBindings</code> on the children, I let them
+ *   use local values, and then manully transfer over their local values
+ *   into an overall "local value" during validate().  Unfortunately,
+ *   using ValueBindings to automate the transfer wouldn't quite work,
+ *   since the transfer wouldn't happen 'til Update Model, which is
+ *   too late to preserve the semantics of an editable value component in JSF.
+ * <li>Apply Request Values and Update Model don't need to do anything special
+ *  for the children;  they just run as needed.
+ * </ul>
+ * @author Adam Winer
+ */
+public class DateField extends UIXEditableValue implements NamingContainer
+{
+  public DateField()
+  {
+    super(null);
+  }
+
+  @Override
+  public void processDecodes(FacesContext context)
+  {
+    _addChildren(context);
+    super.processDecodes(context);
+  }
+
+  @Override
+  public void validate(FacesContext context)
+  {
+    if (!_month.isValid() ||
+        !_year.isValid() ||
+        !_day.isValid())
+    {
+      setValid(false);
+      return;
+    }
+
+    int year = ((Number) _year.getValue()).intValue();
+    // We'll be 1970 - 2069.  Good enough for a demo.
+    if (year < 70)
+      year += 100;
+
+    int month = ((Number) _month.getValue()).intValue() - 1;
+    int day = ((Number) _day.getValue()).intValue();
+
+    Date oldValue = (Date) getValue();
+    Calendar calendar = Calendar.getInstance();
+    calendar.setLenient(true);
+    calendar.setTime(oldValue);
+    calendar.set(Calendar.YEAR, year);
+    calendar.set(Calendar.MONTH, month);
+    calendar.set(Calendar.DAY_OF_MONTH, day);
+
+    //=-=AEW RUN VALIDATORS!
+
+    // Invalid day given the month
+    if (day != calendar.get(Calendar.DAY_OF_MONTH))
+    {
+      int numberOfDaysInMonth = day - calendar.get(Calendar.DAY_OF_MONTH);
+      FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
+                    "Invalid date.",
+                    "This month only has " + numberOfDaysInMonth + " days!");
+      setValid(false);
+      context.addMessage(getClientId(context), message);
+    }
+    // Looks good
+    else
+    {
+      setValid(true);
+
+      // And if the value actually changed, store it and send a value change
+      // event.
+      Date newValue = calendar.getTime();
+      if (!calendar.getTime().equals(oldValue))
+      {
+        setValue(newValue);
+        queueEvent(new ValueChangeEvent(this, oldValue, newValue));
+      }
+    }
+  }
+
+  @Override
+  public void encodeBegin(FacesContext context) throws IOException
+  {
+    _addChildren(context);
+    super.encodeBegin(context);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public void encodeChildren(FacesContext context) throws IOException
+  {
+    for(UIComponent child : (List<UIComponent>)getChildren())
+    {
+      assert(child.getChildCount() == 0);
+      assert(child.getFacets().isEmpty());
+      child.encodeBegin(context);
+      child.encodeChildren(context);
+      child.encodeEnd(context);
+    }
+  }
+
+  @Override
+  public boolean getRendersChildren()
+  {
+    return true;
+  }
+
+  @SuppressWarnings("unchecked")
+  private void _addChildren(FacesContext context)
+  {
+    if (_month != null)
+      return;
+
+    List<UIComponent> children = getChildren();
+    children.clear();
+
+    Date value = (Date) getValue();
+    Calendar calendar = null;
+    if(value != null)
+    {
+      calendar = Calendar.getInstance();
+      calendar.setLenient(true);
+      calendar.setTime(value);
+    }
+
+    // A proper implementation would add children in the correct
+    // order for the current locale
+    _month = _createTwoDigitInput(context);
+    _month.setId("month");
+    _month.setShortDesc("Month");
+    LongRangeValidator monthRange = _createLongRangeValidator(context);
+    monthRange.setMinimum(1);
+    monthRange.setMaximum(12);
+    _month.addValidator(monthRange);
+    if (value != null)
+      _month.setValue(new Integer(calendar.get(Calendar.MONTH) + 1));
+
+    _day = _createTwoDigitInput(context);
+    _day.setId("day");
+    _day.setShortDesc("Day");
+    LongRangeValidator dayRange = _createLongRangeValidator(context);
+    dayRange.setMinimum(1);
+    dayRange.setMaximum(31);
+    _day.addValidator(dayRange);
+    if (value != null)
+      _day.setValue(new Integer(calendar.get(Calendar.DAY_OF_MONTH)));
+
+    _year = _createTwoDigitInput(context);
+    _year.setId("year");
+    _year.setShortDesc("Year");
+    if (value != null)
+    {
+      int yearValue = calendar.get(Calendar.YEAR) - 1900;
+      if (yearValue >= 100)
+        yearValue -= 100;
+      _year.setValue(new Integer(yearValue));
+    }
+
+    children.add(_month);
+    children.add(_createSeparator(context));
+    children.add(_day);
+    children.add(_createSeparator(context));
+    children.add(_year);
+  }
+
+  private LongRangeValidator _createLongRangeValidator(FacesContext context)
+  {
+    return (LongRangeValidator)
+      context.getApplication().createValidator(LongRangeValidator.VALIDATOR_ID);
+  }
+
+  private CoreInputText _createTwoDigitInput(FacesContext context)
+  {
+    CoreInputText input = new CoreInputText();
+    input.setColumns(2);
+    input.setMaximumLength(2);
+    input.setTransient(true);
+    input.setRequired(true);
+    input.setSimple(true);
+
+    NumberConverter converter = (NumberConverter)
+      context.getApplication().createConverter(NumberConverter.CONVERTER_ID);
+    converter.setIntegerOnly(true);
+    converter.setMaxIntegerDigits(2);
+    converter.setMinIntegerDigits(2);
+    input.setConverter(converter);
+
+    return input;
+  }
+
+  // A proper implementation would create a separator appropriate
+  // to the current locale
+  private CoreOutputText _createSeparator(FacesContext context)
+  {
+    CoreOutputText output = new CoreOutputText();
+    output.setValue("/");
+    output.setTransient(true);
+    return output;
+  }
+
+  private transient CoreInputText _month;
+  private transient CoreInputText _year;
+  private transient CoreInputText _day;
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateField.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateField.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateFieldAsRenderer.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateFieldAsRenderer.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateFieldAsRenderer.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateFieldAsRenderer.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,257 @@
+/*
+ *  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.myfaces.trinidaddemo.composite;
+
+import java.io.IOException;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Map;
+
+import javax.faces.application.FacesMessage;
+import javax.faces.component.EditableValueHolder;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import javax.faces.convert.ConverterException;
+import javax.faces.convert.NumberConverter;
+import javax.faces.render.Renderer;
+import javax.faces.validator.LongRangeValidator;
+
+import org.apache.myfaces.trinidad.component.core.input.CoreInputText;
+
+/**
+ * An experiment in building a renderer that uses a composite
+ * component strategy to render.  Some basic principles:
+ * <ul>
+ * <li> The child components get re-created on each pass through
+ *    the system;  this means seeing if they exist in both Apply Request
+ *    Values (<code>decode()</code>) and Render Response
+ *    (<code>encodeBegin()</code>), and marking the components
+ *    transient so they don't get saved.
+ * <li> The model is the tricky part:  instead of using real
+ *   <code>ValueBindings</code> on the children, I let them
+ *   use local values, and then manully transfer over their local values
+ *   into an overall "local value" during validate().  Unfortunately,
+ *   using ValueBindings to automate the transfer wouldn't quite work,
+ *   since the transfer wouldn't happen 'til Update Model, which is
+ *   too late to preserve the semantics of an editable value component in JSF.
+ * </ul>
+ * @author Adam Winer
+ */
+public class DateFieldAsRenderer extends Renderer
+{
+  @SuppressWarnings("unchecked")
+  @Override
+  public void decode(FacesContext context, UIComponent component)
+  {
+    _addChildren(context, component);
+
+    Map<String, UIComponent> attrs = component.getAttributes();
+    if (Boolean.TRUE.equals(attrs.get("readOnly")) ||
+        Boolean.TRUE.equals(attrs.get("disabled")))
+      return;
+
+    // Just clue in component that we have been "submitted" so
+    // that it doesn't short-circuit anything
+    EditableValueHolder evh = (EditableValueHolder) component;
+    evh.setSubmittedValue(Boolean.TRUE);
+
+    // Because these components weren't around during processDecodes(),
+    // they didn't get decoded.  So, run that now.
+    component.getFacet("month").processDecodes(context);
+    component.getFacet("year").processDecodes(context);
+    component.getFacet("day").processDecodes(context);
+  }
+
+  @Override
+  public Object getConvertedValue(
+    FacesContext context,
+    UIComponent  component,
+    Object       submittedValue)
+  {
+    EditableValueHolder monthComp = (EditableValueHolder) component.getFacet("month");
+    EditableValueHolder yearComp = (EditableValueHolder) component.getFacet("year");
+    EditableValueHolder dayComp = (EditableValueHolder) component.getFacet("day");
+
+    if (!monthComp.isValid() ||
+        !yearComp.isValid() ||
+        !dayComp.isValid())
+    {
+      // =-=AEW What to do????????
+      //setValid(false);
+      return null;
+    }
+
+    int year = ((Number) yearComp.getValue()).intValue();
+    // We'll be 1970 - 2069.  Good enough for a demo.
+    if (year < 70)
+      year += 100;
+
+    int month = ((Number) monthComp.getValue()).intValue() - 1;
+    int day = ((Number) dayComp.getValue()).intValue();
+
+    Date oldValue = (Date) ((EditableValueHolder) component).getValue();
+    //Date newValue = (Date) oldValue.clone();
+    Calendar calendar = Calendar.getInstance();
+    calendar.setLenient(true);
+    calendar.setTime(oldValue);
+    calendar.set(Calendar.YEAR, year);
+    calendar.set(Calendar.MONTH, month);
+    calendar.set(Calendar.DAY_OF_MONTH, day);
+    
+    // Invalid day given the month
+    if (day != calendar.get(Calendar.DAY_OF_MONTH))
+    {
+      int numberOfDaysInMonth = day - calendar.get(Calendar.DAY_OF_MONTH);
+      FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
+                    "Invalid date.",
+                    "This month only has " + numberOfDaysInMonth + " days!");
+      throw new ConverterException(message);
+    }
+
+    return calendar.getTime();
+  }
+
+  @Override
+  public void encodeBegin(FacesContext context,
+                          UIComponent component) throws IOException
+  {
+    _addChildren(context, component);
+  }
+
+  @Override
+  public void encodeChildren(FacesContext context,
+                             UIComponent component) throws IOException
+  {
+    ResponseWriter out = context.getResponseWriter();
+
+    UIComponent month = component.getFacet("month");
+    month.encodeBegin(context);
+    month.encodeChildren(context);
+    month.encodeEnd(context);
+
+    out.writeText("\u00a0/\u00a0", null);
+
+    UIComponent day = component.getFacet("day");
+    day.encodeBegin(context);
+    day.encodeChildren(context);
+    day.encodeEnd(context);
+
+    out.writeText("\u00a0/\u00a0", null);
+
+    UIComponent year = component.getFacet("year");
+    year.encodeBegin(context);
+    year.encodeChildren(context);
+    year.encodeEnd(context);
+  }
+
+  @Override
+  public boolean getRendersChildren()
+  {
+    return true;
+  }
+
+  @SuppressWarnings("unchecked")
+  private void _addChildren(FacesContext context, UIComponent component)
+  {
+    // If the components are already there, bail.
+    if (component.getFacet("month") != null)
+      return;
+
+    String id = component.getId();
+    if (id == null)
+    {
+      id = context.getViewRoot().createUniqueId();
+      component.setId(id);
+    }
+
+    Map<String, UIComponent> facets = component.getFacets();
+    facets.clear();
+
+    Date value = (Date) ((EditableValueHolder) component).getValue();
+    Calendar calendar = null;
+    if(value != null)
+    {
+      calendar = Calendar.getInstance();
+      calendar.setLenient(true);
+      calendar.setTime(value);
+    }
+
+    CoreInputText month = _createTwoDigitInput(context);
+    month.setShortDesc("Month");
+    month.setId(id + "_month");
+
+    LongRangeValidator monthRange = _createLongRangeValidator(context);
+    monthRange.setMinimum(1);
+    monthRange.setMaximum(12);
+    month.addValidator(monthRange);
+    if (value != null)
+      month.setValue(new Integer(calendar.get(Calendar.MONTH) + 1));
+    facets.put("month", month);
+
+    CoreInputText day = _createTwoDigitInput(context);
+    day.setShortDesc("Day");
+    day.setId(id + "_day");
+    LongRangeValidator dayRange = _createLongRangeValidator(context);
+    dayRange.setMinimum(1);
+    dayRange.setMaximum(31);
+    day.addValidator(dayRange);
+    if (value != null)
+      day.setValue(new Integer(calendar.get(Calendar.DAY_OF_MONTH)));
+    facets.put("day", day);
+
+    CoreInputText year = _createTwoDigitInput(context);
+    year.setShortDesc("Year");
+    year.setId(id + "_year");
+    if (value != null)
+    {
+      int yearValue = calendar.get(Calendar.YEAR) - 1900;
+      if (yearValue >= 100)
+        yearValue -= 100;
+      year.setValue(new Integer(yearValue));
+    }
+
+    facets.put("year", year);
+  }
+
+  private LongRangeValidator _createLongRangeValidator(FacesContext context)
+  {
+    return (LongRangeValidator)
+      context.getApplication().createValidator(LongRangeValidator.VALIDATOR_ID);
+  }
+
+  private CoreInputText _createTwoDigitInput(FacesContext context)
+  {
+    CoreInputText input = new CoreInputText();
+    input.setColumns(2);
+    input.setMaximumLength(2);
+    input.setTransient(true);
+    input.setRequired(true);
+    input.setSimple(true);
+
+    NumberConverter converter = (NumberConverter)
+      context.getApplication().createConverter(NumberConverter.CONVERTER_ID);
+    converter.setIntegerOnly(true);
+    converter.setMaxIntegerDigits(2);
+    converter.setMinIntegerDigits(2);
+    input.setConverter(converter);
+
+    return input;
+  }
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateFieldAsRenderer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateFieldAsRenderer.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateFieldTag.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateFieldTag.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateFieldTag.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateFieldTag.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,42 @@
+/*
+ *  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.myfaces.trinidaddemo.composite;
+
+import org.apache.myfaces.trinidadinternal.taglib.UIXEditableValueTag;
+
+
+/**
+ * NOTE: a clients may not extend UIXEditableValueTag (or
+ * any other tag classes), as these are not part of the public
+ * API (note the package);  I'm doing it for expedience here.
+ */
+public class DateFieldTag extends UIXEditableValueTag
+{
+  @Override
+  public String getComponentType()
+  {
+    return "org.apache.myfaces.trinidaddemo.DateField";
+  }
+
+  @Override
+  public String getRendererType()
+  {
+    return null;
+  }
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateFieldTag.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/composite/DateFieldTag.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/ConvertSSNTag.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/ConvertSSNTag.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/ConvertSSNTag.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/ConvertSSNTag.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,51 @@
+/*
+ *  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.myfaces.trinidaddemo.convertValidate;
+
+import javax.faces.convert.Converter;
+import javax.faces.webapp.ConverterTag;
+
+import javax.servlet.jsp.JspException;
+
+
+public class ConvertSSNTag extends ConverterTag
+{
+
+  public ConvertSSNTag()
+  {
+  }
+
+  @Override
+  public int doStartTag() throws JspException
+  {
+    super.setConverterId(SSNConverter.CONVERTER_ID);
+    return super.doStartTag();
+  }
+
+  /**
+   * 
+   */
+  @Override
+  protected Converter createConverter() throws JspException
+  {
+    SSNConverter converter =
+                              (SSNConverter)super.createConverter();
+    return converter;
+  }
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/ConvertSSNTag.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/ConvertSSNTag.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/PasswordValidator.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/PasswordValidator.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/PasswordValidator.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/PasswordValidator.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,121 @@
+/*
+ *  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.myfaces.trinidaddemo.convertValidate;
+
+import java.util.Collection;
+
+import javax.faces.application.FacesMessage;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.validator.Validator;
+import javax.faces.validator.ValidatorException;
+
+import org.apache.myfaces.trinidad.validator.ClientValidator;
+import org.apache.myfaces.trinidad.util.LabeledFacesMessage;
+
+/**
+ * <p>Password validator - this is an incredibly simple
+ * password validator that makes sure there's at least one number
+ * in the password.</p>
+ *
+ */
+public class PasswordValidator implements Validator, ClientValidator
+{
+  public static final String VALIDATOR_ID = "org.apache.myfaces.trinidaddemo.PasswordValidator";
+
+  public void validate(
+    FacesContext context,
+    UIComponent component,
+    Object value) throws ValidatorException
+  {
+
+    String password = "";
+
+    if ( value != null)
+      password = value.toString().trim();
+
+    for (int j = 0;j < password.length();j++)
+    {
+      if (Character.isDigit(password.charAt(j)))
+      {
+        return;
+      }
+    }
+
+    // Using the LabeledFacesMessage allows the <tr:messages> component to
+    // properly prepend the label as a link.
+    LabeledFacesMessage lfm =
+      new LabeledFacesMessage(FacesMessage.SEVERITY_ERROR,
+                              "Validation Error",
+                              "The password must contain at least one number");
+    lfm.setLabel(_getLabel(component));
+    throw new ValidatorException(lfm);
+  }
+
+
+  public String getClientValidation(
+    FacesContext context,
+   UIComponent component)
+  {
+    return (_VALIDATOR_INSTANCE_STRING);
+  }
+
+
+  public Collection<String> getClientImportNames()
+  {
+    return null;
+  }
+
+  public String getClientLibrarySource(
+   FacesContext context)
+  {
+    return context.getExternalContext().getRequestContextPath() + 
+            "/jsLibs/passwordValidator.js";    
+  }
+
+
+  @SuppressWarnings("unchecked")
+  public String getClientScript(
+   FacesContext context,
+   UIComponent component)
+  {
+      return null;
+   }
+
+  private static Object _getLabel(UIComponent component)
+  {
+    Object o = null;
+    if (component != null)
+    {
+      o = component.getAttributes().get("label");
+      if (o == null)
+        o = component.getValueBinding("label");
+    }
+    return o;
+  }
+
+  // in a real app the messages would be translated
+  // The fourth field marker gets the field label
+  private static final String _VALIDATOR_INSTANCE_STRING =
+    "new PasswordValidator({"
+    + "NS:'The password is invalid.',"
+    + "ND:'The password value must contain at least one number.'})";
+
+
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/PasswordValidator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/PasswordValidator.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/SSNConverter.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/SSNConverter.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/SSNConverter.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/SSNConverter.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,180 @@
+/*
+ *  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.myfaces.trinidaddemo.convertValidate;
+
+import java.util.Collection;
+
+import javax.faces.application.FacesMessage;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.convert.Converter;
+import javax.faces.convert.ConverterException;
+
+import org.apache.myfaces.trinidad.convert.ClientConverter;
+import org.apache.myfaces.trinidad.util.LabeledFacesMessage;
+
+/**
+ * <p>Social Security number converter.</p>
+ *
+ */
+public class SSNConverter implements Converter, ClientConverter
+{
+    public static final String CONVERTER_ID = "org.apache.myfaces.trinidaddemo.SSN";
+
+    public Object getAsObject(
+      FacesContext context,
+      UIComponent component,
+      String value)
+    {
+      // In a real app all the error messages would be translated
+      if ( value == null || value.trim().length() == 0)
+        return null;
+
+      String tValue = value.trim();
+
+      int length = tValue.length();
+      if ( length < 9 )
+      {
+        throw new ConverterException(_getMessage(component, _SHORT_ERROR_TEXT));
+      }
+
+      if ( length > 11 )
+      {
+        throw new ConverterException(_getMessage(component, _LONG_ERROR_TEXT));
+      }
+
+      if (length == 9)
+      {
+        try
+        {
+          return Integer.valueOf(tValue);
+        }
+        catch(NumberFormatException nfe)
+        {
+          throw new ConverterException(_getMessage(component,
+                                                   _INVALID_ERROR_TEXT));
+        }
+      }
+
+      if ( length == 11 &&
+           tValue.charAt(3) == '-' &&
+           tValue.charAt(6) == '-')
+      {
+        String v = tValue.substring(0,3) +
+                   tValue.substring(4,6) +
+                   tValue.substring(7);
+
+        try
+        {
+          return Integer.valueOf(v);
+        }
+        catch(NumberFormatException nfe)
+        {
+          throw new ConverterException(_getMessage(component,
+                                                   _INVALID_ERROR_TEXT));
+        }
+
+      }
+      throw new ConverterException(_getMessage(component, _INVALID_ERROR_TEXT));
+    }
+
+    public String getAsString(
+      FacesContext context,
+      UIComponent component,
+      Object value)
+    {
+      if ( value == null || !(value instanceof Integer))
+        return null;
+
+      Integer integerValue = (Integer)value;
+
+      String valueString = integerValue.toString();
+
+      String ssn = valueString.substring(0,3) + '-' +
+                   valueString.substring(3,5) + '-' +
+                   valueString.substring(5,9);
+      return ssn;
+    }
+
+
+  public Collection<String> getClientImportNames()
+  {
+    return null;
+  }
+
+  public String getClientLibrarySource(
+   FacesContext context)
+  {
+    return context.getExternalContext().getRequestContextPath() + 
+            "/jsLibs/ssnConverter.js";    
+  }
+
+  public String getClientConversion(
+    FacesContext context,
+   UIComponent component)
+  {
+
+    // in a real app the messages would be translated
+    return ("new SSNConverter({"
+            + "SUM:'Invalid social security number.',"
+            + "S:'Value \"{1}\" is too short.',"
+            + "L:'Value \"{1}\" is too long.',"
+            + "N:'Value \"{1}\" is not a valid social security number.'})"
+            );
+  }
+
+  @SuppressWarnings("unchecked")
+  public String getClientScript(
+   FacesContext context,
+   UIComponent component)
+  {
+    return null;
+  }
+  
+  private LabeledFacesMessage _getMessage(
+   UIComponent component,
+   String text)
+  {
+    // Using the LabeledFacesMessage allows the <tr:messages> component to
+    // properly prepend the label as a link.
+    LabeledFacesMessage lfm =
+      new LabeledFacesMessage(FacesMessage.SEVERITY_ERROR,
+                              "Conversion Error", text);
+    if (component != null)
+    {
+      Object label = null;
+      label = component.getAttributes().get("label");
+      if (label == null)
+        label = component.getValueBinding("label");
+      if (label != null)
+        lfm.setLabel(label);
+    }
+    return lfm;
+  }
+
+  private static final String _SHORT_ERROR_TEXT
+    = "The value is too short to be a social security number";
+
+  private static final String _LONG_ERROR_TEXT
+    = "The value is too long to be a social security number";
+
+  private static final String _INVALID_ERROR_TEXT
+    = "The value is not a valid social security number";
+
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/SSNConverter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/SSNConverter.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/ValidatePasswordTag.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/ValidatePasswordTag.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/ValidatePasswordTag.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/ValidatePasswordTag.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,50 @@
+/*
+ *  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.myfaces.trinidaddemo.convertValidate;
+
+import javax.faces.validator.Validator;
+import javax.faces.webapp.ValidatorTag;
+import javax.servlet.jsp.JspException;
+
+
+public class ValidatePasswordTag extends ValidatorTag
+{
+
+  public ValidatePasswordTag()
+  {
+  }
+
+  @Override
+  public int doStartTag() throws JspException
+  {
+    super.setValidatorId(PasswordValidator.VALIDATOR_ID);
+    return super.doStartTag();
+  }
+
+  /**
+   * 
+   */
+  @Override
+  protected Validator createValidator() throws JspException
+  {
+    PasswordValidator validator =
+                              (PasswordValidator)super.createValidator();
+    return validator;
+  }
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/ValidatePasswordTag.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/convertValidate/ValidatePasswordTag.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/ChooseIntegerBean.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/ChooseIntegerBean.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/ChooseIntegerBean.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/ChooseIntegerBean.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,56 @@
+/*
+ *  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.myfaces.trinidaddemo.dialog;
+
+import javax.faces.application.FacesMessage;
+import javax.faces.context.FacesContext;
+
+import org.apache.myfaces.trinidad.event.ReturnEvent;
+
+public class ChooseIntegerBean
+{
+  public Integer getValue1()
+  {
+    return _value1;
+  }
+
+  public void setValue1(Integer value1)
+  {
+    _value1 = value1;
+  }
+
+  public Integer getValue2()
+  {
+    return _value2;
+  }
+
+  public void setValue2(Integer value2)
+  {
+    _value2 = value2;
+  }
+
+  public void sayHello(ReturnEvent event)
+  {
+    FacesMessage message = new FacesMessage("Hello!");
+    FacesContext.getCurrentInstance().addMessage(null, message);
+  }
+
+  private Integer _value1;
+  private Integer _value2;
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/ChooseIntegerBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/ChooseIntegerBean.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/LaunchDialogBean.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/LaunchDialogBean.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/LaunchDialogBean.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/LaunchDialogBean.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,129 @@
+/*
+ *  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.myfaces.trinidaddemo.dialog;
+
+import java.util.Date;
+import java.util.Map;
+import javax.faces.component.UIViewRoot;
+import javax.faces.context.FacesContext;
+
+import org.apache.myfaces.trinidad.component.UIXInput;
+import org.apache.myfaces.trinidad.context.RequestContext;
+import org.apache.myfaces.trinidad.event.ReturnEvent;
+import org.apache.myfaces.trinidad.event.LaunchEvent;
+import org.apache.myfaces.trinidad.event.PollEvent;
+
+public class LaunchDialogBean
+{
+  public UIXInput getInput()
+  {
+    return _input;
+  }
+
+  public void setInput(UIXInput input)
+  {
+    _input = input;
+  }
+
+  public void addParameter(LaunchEvent event)
+  {
+    // Pass an integer into the dialog.  Some automatic
+    // coercion would really help here (coming in JSF 1.2?)
+    Object value = getInput().getValue();
+    if (value != null)
+    {
+      try
+      {
+        Integer i = Integer.valueOf(value.toString());
+        event.getDialogParameters().put("value", i);
+      }
+      catch (Exception e)
+      {
+      }
+    }
+  }
+
+  public String doLaunch()
+  {
+    RequestContext afContext = RequestContext.getCurrentInstance();
+    Map<String, Object> process = afContext.getPageFlowScope();
+    process.put("lastLaunch", new Date());
+
+    return "dialog:chooseInteger";
+  }
+
+  public void returned(ReturnEvent event)
+  {
+    if (event.getReturnValue() != null)
+    {
+      getInput().setSubmittedValue(null);
+      getInput().setValue(event.getReturnValue());
+
+      RequestContext afContext = RequestContext.getCurrentInstance();
+      afContext.addPartialTarget(getInput());
+
+      FacesContext context = FacesContext.getCurrentInstance();
+      UIViewRoot root = context.getApplication().getViewHandler().createView(
+                           context, "/demos/successDialog.jspx");
+      // Launch a new, success dialog with a different width and height;
+      // this shows how to do so by queueing a LaunchEvent.
+      LaunchEvent launchEvent = new LaunchEvent(event.getComponent(), root);
+      launchEvent.getWindowProperties().put("width", "200");
+      launchEvent.getWindowProperties().put("height", "100");
+      launchEvent.queue();
+    }
+  }
+
+
+  public void poll(PollEvent event)
+  {
+    FacesContext context = FacesContext.getCurrentInstance();
+    UIViewRoot root = context.getApplication().getViewHandler().createView(
+                           context, "/demos/simpleDialog.jspx");
+
+    // Launch a dialog with a call to RequestContext
+    RequestContext afContext = RequestContext.getCurrentInstance();
+    afContext.launchDialog(root, null, event.getComponent(), true, null);
+    // Stop the poll from running
+    event.getComponent().setRendered(false);
+  }
+
+  public UIXInput getTableInput()
+  {
+    return _tableInput;
+  }
+
+  public void setTableInput(UIXInput tableInput)
+  {
+    _tableInput = tableInput;
+  }
+
+  public void tableReturned(ReturnEvent event)
+  {
+    if (event.getReturnValue() != null)
+    {
+      getTableInput().setValue(event.getReturnValue());
+      RequestContext afContext = RequestContext.getCurrentInstance();
+      afContext.addPartialTarget(getTableInput());
+    }
+  }
+
+  private UIXInput _input;
+  private UIXInput _tableInput;
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/LaunchDialogBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/LaunchDialogBean.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/PeriodicDialogBean.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/PeriodicDialogBean.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/PeriodicDialogBean.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/PeriodicDialogBean.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,68 @@
+/*
+ *  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.myfaces.trinidaddemo.dialog;
+
+import java.util.Iterator;
+
+import javax.faces.context.FacesContext;
+import javax.faces.el.ValueBinding;
+
+import org.apache.myfaces.trinidad.component.UIXTable;
+import org.apache.myfaces.trinidad.context.RequestContext;
+
+public class PeriodicDialogBean
+{
+  public UIXTable getTable()
+  {
+    return _table;
+  }
+
+  public void setTable(UIXTable table)
+  {
+    _table = table;
+  }
+
+  public String cancel()
+  {
+    RequestContext.getCurrentInstance().returnFromDialog(null, null);
+    return null;
+  }
+
+  @SuppressWarnings("unchecked")
+  public String select()
+  {
+    FacesContext context = FacesContext.getCurrentInstance();
+    // The tableSelectOne is marked as required; so there'd better
+    // be a selected row - an exception will result here if there
+    // isn't.  Is there some better code?
+    Iterator<Object> iterator = _table.getSelectedRowKeys().iterator();
+    String rowKey = (String) iterator.next();
+    Object oldRowKey = _table.getRowKey();
+    _table.setRowKey(rowKey);
+    ValueBinding binding = context.getApplication().
+      createValueBinding("#{row.symbol}");
+    Object value = binding.getValue(context);
+    RequestContext.getCurrentInstance().returnFromDialog(value, null);
+    _table.setRowKey(oldRowKey);
+
+    return null;
+  }
+
+  private UIXTable _table;
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/PeriodicDialogBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/dialog/PeriodicDialogBean.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/AccountData.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/AccountData.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/AccountData.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/AccountData.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,372 @@
+/*
+ *  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.myfaces.trinidaddemo.email;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.faces.application.FacesMessage;
+
+import javax.faces.context.FacesContext;
+
+import javax.mail.Folder;
+import javax.mail.MessagingException;
+import javax.mail.Session;
+import javax.mail.Store;
+
+import org.apache.myfaces.trinidad.model.ChildPropertyTreeModel;
+import org.apache.myfaces.trinidad.model.TreeModel;
+
+import org.apache.myfaces.trinidad.context.RequestContext;
+
+/**
+ * Root bean which stores information and actions related to the email account
+ *
+ * @version 1.0
+ */
+public final class AccountData implements java.io.Serializable
+{
+
+  public AccountData()
+  {
+    _initializeFromProperties();
+  }
+
+  /**
+   * Returns the user name.
+   */
+  public String getUsername()
+  {
+    return _username;
+  }
+
+  /**
+   * Returns the domain.
+   */
+  public String getDomain()
+  {
+    return _domain;
+  }
+
+  /**
+   * Returns the IMAP server.
+   */
+  public String getServer()
+  {
+    return _server;
+  }
+
+  /**
+   * Returns the SMTP server.
+   */
+  public String getSmtpServer()
+  {
+    return _smtpServer;
+  }
+
+  /**
+   * Returns the password for the current user.
+   */
+  public String getPassword()
+  {
+    return _password;
+  }
+
+  /**
+   * Returns the JavaMail Store object.
+   */
+  public Store getStore()
+  {
+    return _store;
+  }
+
+  /**
+   * Returns the currently selected folder.
+   */
+  public FolderData getCurrentFolder()
+  {
+    RequestContext afContext = RequestContext.getCurrentInstance();
+    return (FolderData) afContext.getPageFlowScope().get("currentFolder");
+  }
+
+  /**
+   * Returns the root folders.
+   */
+  public FolderData[] getRootFolders()
+  {
+    return _rootFolders;
+  }
+
+  /**
+   * Returns the current user's preferences
+   */
+  public PreferencesData getPreferences()
+  {
+    return _preferences;
+  }
+
+  /**
+   * Get the folder model used in the Trinidad tree component showing folders.
+   */
+  public TreeModel getFolderModel()
+  {
+    return _folderModel;
+  }
+
+  /**
+   * Sets the user name.
+   */
+  public void setUsername(String userName)
+  {
+    _username = userName;
+  }
+
+  /**
+   * Sets the domain for the current user.
+   */
+  public void setDomain(String domain)
+  {
+    _domain = domain;
+  }
+
+  /**
+   * Sets the IMAP server for the current user.
+   */
+  public void setServer(String server)
+  {
+    _server = server;
+  }
+
+  /**
+   * Sets the SMTP server.
+   */
+  public void setSmtpServer(String smtpServer)
+  {
+    _smtpServer = smtpServer;
+  }
+
+  /**
+   * Sets the password for the current user.
+   */
+  public void setPassword(String password)
+  {
+    _password = password;
+  }
+
+  /**
+   * Sets the Store.
+   */
+  public void setStore(Store store)
+  {
+    _store = store;
+  }
+
+  /**
+   * Sets the current folder.
+   */
+  public void setCurrentFolder(FolderData folderData)
+  {
+    RequestContext afContext = RequestContext.getCurrentInstance();
+    afContext.getPageFlowScope().put("currentFolder", folderData);
+  }
+
+  /**
+   * Sets the root folders.
+   */
+  public void setRootFolders(FolderData[] rootFolders)
+  {
+    _rootFolders = rootFolders;
+
+    List<Object> rootFolderList = Arrays.asList((Object[]) _rootFolders);
+
+    TreeModel folderTreeModel = new ChildPropertyTreeModel(rootFolderList, "subFolders");
+    setFolderModel(folderTreeModel);
+  }
+
+  /**
+   * Sets the Preferences for the current user.
+   */
+   public void setPreferences(PreferencesData preferences)
+     throws MessagingException
+  {
+    _preferences = preferences;
+
+    // Keep the block size in sync with the current preferences
+  // refreshPreferences(); ???
+  }
+
+  /**
+   * Set the folder model used in the Trinidad tree component showing folders.
+   */
+  public void setFolderModel(TreeModel model)
+  {
+    _folderModel = model;
+  }
+
+
+  /**
+   * Process login. Connect to server and move to folder display page.
+   */
+  public String login()
+  {
+    try
+    {
+      // login to the IMAP server
+      Properties props = new Properties();
+      Session session = Session.getInstance(props, null);
+      Store store = session.getStore("imap");
+      store.connect(_server, _username, _password);
+      setStore(store);
+
+      setRootFolders(FolderData.toFolderData(this, store.getDefaultFolder().list()));
+
+      // TODO: Add logged in indicator to restrict access
+
+      _gotoFolder(null);
+
+      // Set up the user's preferences;  in a real app, these would
+      // be persisted somewhere.
+      PreferencesData preferences = new PreferencesData();
+      setPreferences(preferences);
+    }
+    // catch all exceptions and report them as errors
+    catch (Exception e)
+    {
+      FacesMessage errorMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR,
+                                                   e.getMessage(), null);
+
+      FacesContext context = FacesContext.getCurrentInstance();
+    context.addMessage(null, errorMessage);
+
+      return null;
+    }
+
+    return "success";
+  }
+
+  /**
+   * Log out, and close up everything.
+   */
+  public String logout()
+  {
+    destroy();
+
+    setCurrentFolder(null);
+
+    _password = null;
+    _folderModel = null;
+    _rootFolders = null;
+    _preferences = null;
+
+    return "loggedOut";
+  }
+
+  /**
+   * Frees up resources used by this object.
+   */
+  public synchronized void destroy()
+  {
+    if (_store != null)
+    {
+      try
+      {
+        _store.close();
+        _store = null;
+      }
+      catch (MessagingException e)
+      {
+        e.printStackTrace();
+      }
+    }
+  }
+
+  /**
+   * Clean up resources
+   */
+  @Override
+  protected void finalize() throws Throwable
+  {
+    destroy();
+    super.finalize();
+  }
+
+  /**
+   * Go to a specified folder.
+   * @param newFolder the new folder to view. Maybe null, in which case INBOX
+   * will be opened.
+   */
+  private void _gotoFolder(String newFolder)
+    throws MessagingException
+  {
+    if (newFolder==null)
+      newFolder = "INBOX";
+
+    Folder folder  = getStore().getFolder(newFolder);
+    FolderData fdata = new FolderData(this, folder);
+    setCurrentFolder(fdata);
+  }
+
+  // Initialize everything (but the password!) from a .properties file
+  // for convenience
+  private void _initializeFromProperties()
+  {
+    String home = System.getProperty("user.home");
+    File file = new File(home, "adf-email-demo.properties");
+    _LOG.log(Level.FINE, "Loading properties from {0}", file);
+    try
+    {
+      InputStream stream = new FileInputStream(file);
+      Properties properties = new Properties();
+      properties.load(stream);
+
+      setUsername(properties.getProperty("username"));
+      setDomain(properties.getProperty("domain"));
+      setServer(properties.getProperty("server"));
+      String smtp = properties.getProperty("smtpserver");
+      if (smtp == null)
+        smtp = System.getProperty("mail.smtp.host");
+      setSmtpServer(properties.getProperty("smtpserver"));
+    }
+    catch (IOException ioe)
+    {
+      // The file doesn't have to be there.
+      ;
+    }
+  }
+
+  // No real attempt to support failover here, but just trying
+  // not to fail a Serialization test
+  private String _username, _password, _domain, _server;
+  private String _smtpServer;
+  private transient Store _store;
+  private transient TreeModel _folderModel;
+  private transient FolderData[] _rootFolders;
+  private transient PreferencesData _preferences;      // User preferences
+
+  static private final Logger _LOG =
+    Logger.getLogger(AccountData.class.getName());
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/AccountData.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/AccountData.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/EmailDisplayConverter.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/EmailDisplayConverter.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/EmailDisplayConverter.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/EmailDisplayConverter.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,54 @@
+/*
+ *  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.myfaces.trinidaddemo.email;
+
+import javax.faces.component.UIComponent;
+import javax.faces.convert.Converter;
+import javax.faces.context.FacesContext;
+
+/**
+ * Converter that displays just the name, or the full
+ * e-mail address if the name is not available.
+ */
+public class EmailDisplayConverter implements Converter
+{
+  public EmailDisplayConverter()
+  {
+  }
+
+  public String getAsString(FacesContext context, UIComponent component,
+                            Object value)
+  {
+    if (value == null)
+      return null;
+
+    String val = value.toString();
+    int lessThanIndex = val.indexOf('<');
+    if (lessThanIndex < 0)
+      return val;
+
+    return val.substring(0, lessThanIndex).trim();
+  }
+
+  public Object getAsObject(FacesContext context, UIComponent component,
+                            String value)
+  {
+    throw new UnsupportedOperationException();
+  }
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/EmailDisplayConverter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/EmailDisplayConverter.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/FolderData.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/FolderData.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/FolderData.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/FolderData.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,247 @@
+/*
+ *  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.myfaces.trinidaddemo.email;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.faces.model.DataModel;
+
+import javax.mail.Folder;
+import javax.mail.FetchProfile;
+import javax.mail.MessagingException;
+
+/**
+ * Reflects the folder information provided by javaMail folder
+ * @version 1.0
+ */
+public class FolderData
+{
+
+  /**
+   * @param data the user who owns this folder
+   * @param folder the folder being reflected
+   */
+  public FolderData(AccountData data, Folder folder) throws MessagingException
+  {
+    _folder = folder;
+    _accountData = data;
+    _holdsMessages  = (_folder.getType() & Folder.HOLDS_MESSAGES) > 0;
+  }
+
+
+  public void flush()
+  {
+    _messageListModel = null;
+  }
+
+  
+  /**
+   * Returns true if the folder can hold messages.
+   */
+  public boolean isHoldsMessages()
+  {
+    return _holdsMessages;
+  }
+
+  /**
+   * @return the number of messages in this folder
+   */
+  public int getMessageCount() throws MessagingException
+  {
+    // remember, we can only get messages if the type of this folder is
+    // Folder.HOLDS_MESSAGES
+    if (_holdsMessages)
+      return _folder.getMessageCount();
+
+    return 0;
+  }
+
+  /**
+   * @return the number of unread messages in this folder
+   */
+  public int getUnreadMessageCount() throws MessagingException
+  {
+    // remember, we can only get messages if the type of this folder is
+    // Folder.HOLDS_MESSAGES
+    if (_holdsMessages)
+      return _folder.getUnreadMessageCount();
+
+    return 0;
+  }
+
+  /**
+   * @return the index into the list of messages that was last
+   *  used by the messages table.  Stored here to keep it
+   *  scoped to the folder, instead of the session.
+   */
+  public int getStartIndex()
+  {
+    return _startIndex;
+  }
+  
+  /**
+   * Store the index into the list of messages.
+   */
+  public void setStartIndex(int startIndex)
+  {
+    _startIndex = startIndex;
+  }
+
+  /**
+   * gets the name of this folder
+   */
+  public String getName()
+  {
+    return _folder.getName();
+  }
+
+  /**
+   * gets the full name of this folder. This reflects the hierarchy of this
+   * folder.
+   */
+  public String getFullName()
+  {
+    return _folder.getFullName();
+  }
+
+  /**
+   * @return true if this folder is currently selected
+   */
+  /* =-=AEW Not used
+  public boolean isSelected()
+  {
+    return _folder.getFullName().equals
+      (_accountData.getCurrentFolder()._folder.getFullName());
+  }
+  */
+
+  /**
+   * gets this folder's subfolders
+   * @todo Why does this code return "null" instead of the empty list???
+   */
+  @SuppressWarnings("unchecked")
+  public synchronized List<Object> getSubFolders() throws MessagingException
+  {
+    if (_subFolders == Collections.EMPTY_LIST)
+    {
+      return null;
+    }
+    else if (_subFolders == null)
+    {
+      FolderData[] folders = toFolderData(_accountData, _folder.list());
+      if (folders == null)
+      {
+        _subFolders = Collections.EMPTY_LIST;
+        return null;
+      }
+      else
+      {
+        _subFolders = Arrays.asList((Object[]) folders);
+      }
+    }
+
+    return _subFolders;
+  }
+
+  /**
+   * Get the model for the messages in this folder.
+   */
+  public Object getMessageListModel()
+  {
+    if (_holdsMessages)
+    {
+      if (_messageListModel == null)
+      {
+        FetchProfile fetchProfile = new FetchProfile();
+        fetchProfile.add(FetchProfile.Item.ENVELOPE);
+        fetchProfile.add(FetchProfile.Item.FLAGS);
+        _messageListModel = new MessageDataModel(_folder,
+                                                 fetchProfile,
+                                                 _MESSAGE_LOAD_BLOCK_SIZE);
+      }
+
+      return _messageListModel;
+    }
+    else
+    {
+      return null;
+    }
+  }
+
+  /**
+   * converts {@link Folder}s to {@link FolderData}s.
+   */
+  public static FolderData[] toFolderData(AccountData data, Folder[] folders)
+    throws MessagingException
+  {
+    int sz = folders.length;
+    if (sz > 0)
+    {
+      FolderData[] subs = new FolderData[sz];
+      for(int i=0; i<sz; i++)
+      {
+        Folder f = folders[i];
+        subs[i] = new FolderData(data, f);
+      }
+
+      return subs;
+    }
+
+    return null;
+  }
+
+  /**
+   * Get the underlying Folder object.
+   */
+  public Folder getFolder()
+  {
+    return _folder;
+  }
+
+  /**
+   * Action for viewing the messages in this folder.
+   */
+  public String viewMessages()
+  {
+    // update the currentFolder on the account to point to this folder
+    _accountData.setCurrentFolder(this);
+	
+    _LOG.log(Level.FINE, 
+             "Showing messages for folder named {0} ", getName());
+  
+    return "messages";
+  }
+
+  private List<Object>      _subFolders = null;
+  private DataModel         _messageListModel = null;
+  private final Folder      _folder;
+  private final AccountData _accountData;
+  private final boolean     _holdsMessages;
+  private       int         _startIndex;
+  // Load 100 messages at a time (obviously, should be tuneable)
+  private static final int _MESSAGE_LOAD_BLOCK_SIZE = 100;
+
+  static private final Logger _LOG =
+    Logger.getLogger(FolderData.class.getName());
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/FolderData.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/FolderData.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageData.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageData.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageData.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageData.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,503 @@
+/*
+ *  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.myfaces.trinidaddemo.email;
+
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.mail.Address;
+import javax.mail.BodyPart;
+import javax.mail.Folder;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.Part;
+
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMultipart;
+import javax.mail.Flags.Flag;
+
+/**
+ * MessageData contains all the information needed to display a UI
+ * for a javax.mail.Message object.  There are methods to get the
+ * sender, the subject, the size, the date, the to list, the cc list,
+ * the content type, the content itself, and the line count of the message.
+ *
+ * @version 1.0
+ */
+public class MessageData
+{
+  /**
+   * Create a new MessageData object given the message object.
+   */
+  public MessageData(Message message) throws MessagingException
+  {
+    _message = message;
+
+    // cache the size just because it involves a calculation
+    _size = message.getSize() / 1024;
+
+    // cache this since the folder has to be open to get this:
+    _isRead = _message.isSet(Flag.SEEN); 
+    _isDeleted = _message.isSet(Flag.DELETED);
+  }
+
+  /**
+   * Get the number of the message in its containing folder.
+   *
+   * @return the message number. this index is based at 1
+   */
+  public int getMessageNumber()
+  {
+    return _message.getMessageNumber();
+  }
+
+  /**
+   * Get the Address object that corresponds to the sender
+   */
+  public Address getSender() throws MessagingException
+  {
+    // we assume that the original sender is the first one
+    return _message.getFrom()[0];
+  }
+
+  /**
+   * Get the subject of the message.  If the subject is empty or null
+   * we return a string <empty> to indicate the subject did not contain
+   * anything.
+   */
+  public String getSubject() throws MessagingException
+  {
+    String subject = _message.getSubject();
+
+    // if the subject is empty than make sure we return something so the
+    // user can click on it to see its contents!  Need to internationalize this.
+    if ( (subject == null) || "".equals(subject) )
+      subject = "<empty>";
+
+    return subject;
+  }
+
+  /**
+   * Get the size of the message in kilobytes.
+   *
+   * @return size in kilo bytes
+   */
+  public int getSize()
+  {
+    return _size;
+  }
+
+  /**
+   * Get the sent date of the message.
+   */
+  public Date getSentDate() throws MessagingException
+  {
+    return _message.getSentDate();
+  }
+
+  /**
+   * Get an array of Address objects that correspond to the list of
+   * addresses the message was sent to.
+   */
+  public Address[] getTos() throws MessagingException
+  {
+    Address[] tos = _message.getRecipients(Message.RecipientType.TO);
+    return tos;
+  }
+
+  /**
+   * Get an array of Address objects that correspond to the list of
+   * addresses the message was cc'd to.
+   */
+  public Address[] getCcs() throws MessagingException
+  {
+    Address[] ccs = _message.getRecipients(Message.RecipientType.CC);
+    return ccs;
+  }
+
+  /**
+   * Get a string representing the content type of the message.  The
+   * string returned is truncated to just show the initial part of the type
+   * like text/plain.  Also if the original message is a more complex type
+   * like multipart, this method will actually search through all the parts
+   * and try and find a text/plain or text/html to make the UI easier to
+   * handle.
+   */
+  public String getContentType() throws MessagingException
+  {
+    // catch IOExceptions and ignore them, because content type really
+    // shouldn't care much about io exceptions
+    try
+    {
+      _tryInit();
+    }
+    catch (IOException ioe)
+    {
+      ;
+    }
+
+    return _contentType;
+  }
+
+  /**
+   * Get an object representing the content type of the message.  If the
+   * original message is a more complex type like multipart, this method
+   * will actually search through all the parts and try and find a
+   * text/plain or text/html to make the UI easier to handle.
+   */
+  public Object getContent() throws MessagingException, IOException
+  {
+    // catch IOExceptions and ignore them, because content type really
+    // shouldn't care much about io exceptions
+    try
+    {
+      _tryInit();
+    }
+    catch (IOException ioe)
+    {
+      ;
+    }
+
+    return _content;
+  }
+
+  /**
+   * Get the number of lines in the message.  If the original message is a
+   * more complex type like multipart, this method will actually search
+   * through all the parts and try and find a text/plain or text/html
+   * and getLineCount() will return the number of messages in that part.
+   */
+  public int getLineCount() throws MessagingException
+  {
+    // catch IOExceptions and ignore them, because content type really
+    // shouldn't care much about io exceptions
+    try
+    {
+      _tryInit();
+    }
+    catch (IOException ioe)
+    {
+      ;
+    }
+
+    return _lineCount;
+  }
+
+
+  /**
+   * Return true if the message has been read yet.
+   */
+  public boolean isRead()
+  {
+    return _isRead;
+  }
+
+  /**
+   * Return true if the message has been deleted.
+   */
+  public boolean isDeleted()
+  {
+    return _isDeleted;
+  }
+  
+  /**
+   * Get the underlying Message Object.
+   */
+  public Message getMessage()
+  {
+    return _message;
+  }
+
+  /**
+   * Get the list of attachments.
+   */ 
+  public List<BodyPart> getAttachments()
+  {
+    return _attachments;
+  }
+
+  /**
+   * Returns true if any attachments are available.
+   */
+  public boolean isAttachmentPresent()
+  {
+    return (_attachments != null) && (!_attachments.isEmpty());
+  }
+
+
+  ////////////////////////////////////////////////////////////////////////////
+  // private methods
+  ////////////////////////////////////////////////////////////////////////////
+  /**
+   * Initialize the linecount, content type, and content once and for all.
+   */
+  synchronized private void _tryInit() throws MessagingException, IOException
+  {
+    // only gather the information if we haven't been initalized yet
+    if (_lineCount == -1)
+    {
+      int count = 0;
+      String contentType = null;
+      Object content = null;
+
+      // open the folder;  open it read-write if the message hasn't yet
+      // been read (in which case we'll need to set it accordingly)
+      _message.getFolder().open(_isRead
+                                ? Folder.READ_ONLY
+                                : Folder.READ_WRITE);
+      
+      List<BodyPart> attachments = new ArrayList<BodyPart>();
+
+      try
+      {
+        // get the linecount, content type, and content
+        count = _message.getLineCount();
+        contentType = _message.getContentType();
+        content = _message.getContent();
+
+        // if its a multipart type then lets look through all the parts
+        // and see if we can find the more interesting text or html ones
+        // so that we can display them better
+        if (contentType.startsWith(_MULTIPART))
+        {
+          if (content instanceof MimeMultipart)
+          {
+            boolean found = false;
+            
+            MimeMultipart mm = (MimeMultipart)content;
+            for (int i=0;i<mm.getCount();i++)
+            {
+              BodyPart bp = mm.getBodyPart(i);
+              
+              if (!found && (bp instanceof MimeBodyPart))
+              {
+                MimeBodyPart mbp = (MimeBodyPart)bp;
+                String type = mbp.getContentType();
+                
+                if (type.startsWith(_HTML_TEXT) ||
+                    type.startsWith(_PLAIN_TEXT) )
+                {
+                  found = true;
+                  count = mbp.getLineCount();
+                  content = mbp.getContent();
+                  contentType = type;
+                  
+                  // be happy with the first thing we find either plain
+                  // text or html, and skip over it as an attachment
+                  continue;
+                }
+              }
+
+              // OK, now let's see if it's an attachment
+              String disp = bp.getDisposition();
+              if (disp == null || disp.equalsIgnoreCase(Part.ATTACHMENT))
+              {
+                attachments.add(bp);
+              }
+            }
+            
+            // if we don't find something either text or html, and we don't
+            // have any attachments then we are in trouble.  Just throw an
+            // exception and let the code below set things up properly.
+            if (!found)
+            {
+              if (!attachments.isEmpty())
+                content = "";
+              else
+                throw new IllegalStateException();
+            }
+          }
+        }
+
+        // strip of the extra parts of the content type so we return something
+        // like plain/text or html/text
+        int index = contentType.indexOf(';');
+        if (index != -1)
+          contentType = contentType.substring(0, index);
+
+        // Mark it as seen
+        _message.getFlags().add(Flag.SEEN);
+        _isRead = true;
+      }
+      catch (Exception e)
+      {
+        content = "Error trying to display content";
+        count = 1;
+        contentType = _PLAIN_TEXT;
+        attachments.clear();
+      }
+      // always make sure to close the message in case there was an error.
+      finally
+      {
+        _message.getFolder().close(false);
+      }
+
+      _lineCount = count;
+      _contentType = contentType;
+      _content = content;
+      _attachments = attachments;
+    }
+  }
+
+  // this implementation tries very poorly to handle attachments by just
+  // putting them inline.  If we had more time to figure out java mail we
+  // could do something better with attachements
+  /**
+   * Initialize the linecount, content type, and content once and for all.
+  synchronized private void _tryInit() throws MessagingException, IOException
+  {
+    // only gather the information if we haven't been initalized yet
+    if (_lineCount == -1)
+    {
+      int count = 0;
+      String contentType = null;
+      Object content = null;
+
+      // open the folder
+      _message.getFolder().open(Folder.READ_ONLY);
+
+      try
+      {
+        // get the linecount, content type, and content
+        count = _message.getLineCount();
+        contentType = _message.getContentType();
+        content = _message.getContent();
+
+        // if its a multipart type then lets look through all the parts
+        // and see if we can find the more interesting text or html ones
+        // so that we can display them better
+        if (contentType.startsWith(_MULTIPART))
+        {
+            if (content instanceof MimeMultipart)
+            {
+              MimeMultipart mm = (MimeMultipart)content;
+              Object plainContent = null;
+              Object htmlContent = null;
+              int plainCount = 0;
+              int htmlCount = 0;
+
+              // loop through all of the parts.  If we find more than
+              // one plain text than append then all together so we can
+              // display simple attachements better
+              for (int i=0;i<mm.getCount();i++)
+              {
+                BodyPart bp = mm.getBodyPart(i);
+
+                if (bp instanceof MimeBodyPart)
+                {
+                  MimeBodyPart mbp = (MimeBodyPart)bp;
+                  String type = mbp.getContentType();
+
+                  if (type.startsWith(_PLAIN_TEXT))
+                  {
+                    plainCount += mbp.getLineCount();
+                    Object newContent = mbp.getContent();
+
+                    if (plainContent == null)
+                      plainContent = newContent;
+                    else
+                    {
+                      plainContent = plainContent + "\n---------------------------------\n" + newContent;
+                      plainCount++;
+                    }
+                  }
+                  else if (type.startsWith(_HTML_TEXT))
+                  {
+                    htmlCount += mbp.getLineCount();
+                    Object newContent = mbp.getContent();
+
+                    if (htmlContent == null)
+                      htmlContent = newContent;
+                    else
+                    {
+                      htmlContent = htmlContent + "\n---------------------------------\n" + newContent;
+                      htmlCount++;
+                    }
+                  }
+                }
+              }
+
+              // if we found any plain content use that first
+              if (plainContent != null)
+              {
+                count = plainCount;
+                content = plainContent;
+                contentType = _PLAIN_TEXT;
+              }
+              // then html
+              else if (htmlContent != null)
+              {
+                count = htmlCount;
+                content = htmlContent;
+                contentType = _HTML_TEXT;
+              }
+              // if we found neither thrown an exception which we will
+              // catch down below to setup state
+              else
+              {
+                throw new IllegalStateException();
+              }
+            }
+        }
+
+        // strip of the extra parts of the content type so we return something
+        // like plain/text or html/text
+        int index = contentType.indexOf(';');
+        if (index != -1)
+          contentType = contentType.substring(0, index);
+      }
+      catch (Exception e)
+      {
+        content = "Could not display content";
+        count = 0;
+        contentType = _PLAIN_TEXT;
+      }
+      // always make sure to close the message in case there was an error.
+      finally
+      {
+        _message.getFolder().close(false);
+      }
+
+      _lineCount = count;
+      _contentType = contentType;
+      _content = content;
+    }
+  }
+   */
+
+  ////////////////////////////////////////////////////////////////////////////
+  // private variables
+  ////////////////////////////////////////////////////////////////////////////
+  private static final String _PLAIN_TEXT = "TEXT/PLAIN";
+  private static final String _HTML_TEXT = "TEXT/HTML";
+  private static final String _MULTIPART = "multipart";
+
+  private final Message _message;
+  private Object _content = null;
+  private String _contentType= null;
+  private int _lineCount = -1;
+  private int _size;
+  private boolean _isRead;
+  private boolean _isDeleted;
+  private List<BodyPart> _attachments;
+}
+