/*
* JBoss, Home of Professional Open Source
* Copyright 2010-2016, Red Hat, Inc. and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.richfaces.tests.metamer.bean;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.DateTimeConverter;
import javax.faces.convert.IntegerConverter;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.richfaces.component.UICalendar;
import org.richfaces.component.UIOrderingList;
import org.richfaces.component.UIPickList;
import org.richfaces.component.html.HtmlInputNumberSlider;
import org.richfaces.component.html.HtmlInputNumberSpinner;
import org.richfaces.tests.metamer.bean.rich.RichCalendarBean;
import org.richfaces.tests.metamer.converter.CapitalConverter;
import org.richfaces.tests.metamer.model.Capital;
/**
* Bean used for testing of input components @converter and @converterMessage
*
* @author <a href="mailto:jstefek@redhat.com">Jiri Stefek</a>
*/
@ManagedBean(name = "converterBean")
@SessionScoped
public class ConverterBean implements Serializable {
private static final DateTimeZone DATETIME_ZONE = DateTimeZone.forTimeZone(RichCalendarBean.TIME_ZONE);
public static final String ERROR_MSG = "Intentional failure of the converter";
private static final long serialVersionUID = -1L;
private List<Capital> capitals;
private SwitchableFailingConverter converter;
private String converterMessage;
private boolean failing;
@ManagedProperty(value = "#{model.capitals}")
private List<Capital> originalCapitals;
private Capital valueCapital;
private Date valueDate;
private List<Capital> valueListOfCapitals;
private Number valueNumber;
public List<Capital> getCapitals() {
return capitals;
}
public Converter getConverter() {
return converter;
}
public String getConverterMessage() {
return converterMessage;
}
public List<Capital> getOriginalCapitals() {
return originalCapitals;
}
public Object getOutput() {
switch (converter.preferedOutput) {
case CAPITAL:
return valueCapital;
case DATE:
return new DateTime(valueDate).withZone(DATETIME_ZONE).toString(DateTimeFormat.mediumDateTime());
case LIST_OF_CAPITALS:
return valueListOfCapitals;
case NUMBER:
return valueNumber;
default:
throw new UnsupportedOperationException();
}
}
public Capital getValueCapital() {
return valueCapital;
}
public Date getValueDate() {
return valueDate;
}
public List<Capital> getValueListOfCapitals() {
return valueListOfCapitals;
}
public Number getValueNumber() {
return valueNumber;
}
@PostConstruct
public void init() {
converter = new SwitchableFailingConverter();
capitals = originalCapitals.subList(0, 10);
valueCapital = originalCapitals.get(0);
valueDate = new Date(0);
valueListOfCapitals = originalCapitals.subList(0, 1);
valueNumber = 5;
}
public boolean isFailing() {
return failing;
}
public void setConverterMessage(String converterMessage) {
this.converterMessage = converterMessage;
}
public void setFailing(boolean failing) {
this.failing = failing;
}
public void setOriginalCapitals(List<Capital> originalCapitals) {
this.originalCapitals = originalCapitals;
}
public void setValueCapital(Capital valueCapital) {
this.valueCapital = valueCapital;
}
public void setValueDate(Date valueDate) {
this.valueDate = valueDate;
}
public void setValueListOfCapitals(List<Capital> valueListOfCapitals) {
this.valueListOfCapitals = valueListOfCapitals;
}
public void setValueNumber(Number valueNumber) {
this.valueNumber = valueNumber;
}
private enum PreferedOutput {
DATE, LIST_OF_CAPITALS, NUMBER, CAPITAL
}
private class SwitchableFailingConverter implements Converter {
private PreferedOutput preferedOutput;
private final DateTimeConverter dateTimeConverter = new DateTimeConverter();
private final CapitalConverter capitalConverter = new CapitalConverter();
private final IntegerConverter integerConverter = new IntegerConverter();
private final FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, ERROR_MSG, ERROR_MSG);
public SwitchableFailingConverter() {
dateTimeConverter.setPattern(UICalendar.DEFAULT_DATE_PATTERN);
dateTimeConverter.setTimeZone(RichCalendarBean.TIME_ZONE);
}
private Converter getConverter() {
switch (preferedOutput) {
case CAPITAL:
return capitalConverter;
case DATE:
return dateTimeConverter;
case LIST_OF_CAPITALS:
return capitalConverter;
case NUMBER:
return integerConverter;
default:
throw new UnsupportedOperationException();
}
}
@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String string) {
initPreferedOutput(uic);
if (failing) {
throw new ConverterException(message);
}
return getConverter().getAsObject(fc, uic, trimParagraph(string));
}
@Override
public String getAsString(FacesContext fc, UIComponent uic, Object o) {
initPreferedOutput(uic);
if (failing) {
throw new ConverterException(message);
}
return getConverter().getAsString(fc, uic, o);
}
private String trimParagraph(String value) {
return value.replace("<p>", "").replace("</p>", "").trim();
}
private void initPreferedOutput(UIComponent c) {
if (c instanceof UICalendar) {
preferedOutput = PreferedOutput.DATE;
} else if (c instanceof UIPickList || c instanceof UIOrderingList) {
preferedOutput = PreferedOutput.LIST_OF_CAPITALS;
} else if (c instanceof HtmlInputNumberSpinner || c instanceof HtmlInputNumberSlider) {
preferedOutput = PreferedOutput.NUMBER;
} else {
preferedOutput = PreferedOutput.CAPITAL;
}
}
}
}