org.richfaces.tests.metamer.bean.ConverterBean.java Source code

Java tutorial

Introduction

Here is the source code for org.richfaces.tests.metamer.bean.ConverterBean.java

Source

/*
 * 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;
            }
        }
    }
}