/*
This file is part of Cyclos (www.cyclos.org).
A project of the Social Trade Organisation (www.socialtrade.org).
Cyclos is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Cyclos 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Cyclos; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package nl.strohalm.cyclos.controls.elements;
import java.util.Calendar;
import nl.strohalm.cyclos.controls.ActionContext;
import nl.strohalm.cyclos.controls.BaseFormAction;
import nl.strohalm.cyclos.entities.access.User;
import nl.strohalm.cyclos.entities.customization.fields.CustomField;
import nl.strohalm.cyclos.entities.customization.fields.CustomFieldValue;
import nl.strohalm.cyclos.entities.groups.Group;
import nl.strohalm.cyclos.entities.members.Element;
import nl.strohalm.cyclos.entities.settings.LocalSettings;
import nl.strohalm.cyclos.entities.settings.events.LocalSettingsChangeListener;
import nl.strohalm.cyclos.entities.settings.events.LocalSettingsEvent;
import nl.strohalm.cyclos.utils.binding.BeanBinder;
import nl.strohalm.cyclos.utils.binding.BeanCollectionBinder;
import nl.strohalm.cyclos.utils.binding.DataBinder;
import nl.strohalm.cyclos.utils.binding.PropertyBinder;
import nl.strohalm.cyclos.utils.conversion.HtmlConverter;
import nl.strohalm.cyclos.utils.conversion.IdConverter;
import nl.strohalm.cyclos.utils.conversion.ReferenceConverter;
/**
* Action used to retrieve and store a member or admin profile
* @author luis
*/
public abstract class ProfileAction<E extends Element> extends BaseFormAction implements LocalSettingsChangeListener {
private DataBinder<E> readDataBinder;
private DataBinder<E> writeDataBinder;
public DataBinder<E> getReadDataBinder(final ActionContext context) {
if (readDataBinder == null) {
readDataBinder = initDataBinderForRead(context);
}
return readDataBinder;
}
public DataBinder<E> getWriteDataBinder(final ActionContext context) {
if (writeDataBinder == null) {
writeDataBinder = initDataBinderForWrite(context);
}
return writeDataBinder;
}
/**
* We must re-create the DataBinders when the settings are saved
*/
@Override
public void onLocalSettingsUpdate(final LocalSettingsEvent event) {
readDataBinder = null;
}
protected abstract <CFV extends CustomFieldValue> Class<CFV> getCustomFieldValueClass();
protected abstract Class<E> getElementClass();
protected abstract <G extends Group> Class<G> getGroupClass();
protected abstract <U extends User> Class<U> getUserClass();
protected DataBinder<E> initDataBinderForRead(final ActionContext context) {
final LocalSettings settings = settingsService.getLocalSettings();
final BeanBinder<? extends User> userBinder = BeanBinder.instance(getUserClass(), "user");
userBinder.registerBinder("username", PropertyBinder.instance(String.class, "username"));
userBinder.registerBinder("lastLogin", PropertyBinder.instance(Calendar.class, "lastLogin", settings.getDateConverter()));
final BeanBinder<? extends Group> groupBinder = BeanBinder.instance(getGroupClass(), "group");
groupBinder.registerBinder("name", PropertyBinder.instance(String.class, "name"));
final BeanBinder<E> elementBinder = BeanBinder.instance(getElementClass());
elementBinder.registerBinder("id", PropertyBinder.instance(Long.class, "id", IdConverter.instance()));
elementBinder.registerBinder("name", PropertyBinder.instance(String.class, "name"));
elementBinder.registerBinder("user", userBinder);
elementBinder.registerBinder("email", PropertyBinder.instance(String.class, "email"));
elementBinder.registerBinder("creationDate", PropertyBinder.instance(Calendar.class, "creationDate", settings.getDateConverter()));
elementBinder.registerBinder("group", groupBinder);
return elementBinder;
}
protected DataBinder<E> initDataBinderForWrite(final ActionContext context) {
final BeanBinder<? extends CustomFieldValue> customValueBinder = BeanBinder.instance(getCustomFieldValueClass());
customValueBinder.registerBinder("field", PropertyBinder.instance(CustomField.class, "field", ReferenceConverter.instance(CustomField.class)));
customValueBinder.registerBinder("value", PropertyBinder.instance(String.class, "value", HtmlConverter.instance()));
final BeanBinder<? extends User> userBinder = BeanBinder.instance(getUserClass(), "user");
userBinder.registerBinder("username", PropertyBinder.instance(String.class, "username"));
final BeanBinder<E> elementBinder = BeanBinder.instance(getElementClass());
elementBinder.registerBinder("id", PropertyBinder.instance(Long.class, "id"));
elementBinder.registerBinder("name", PropertyBinder.instance(String.class, "name"));
elementBinder.registerBinder("email", PropertyBinder.instance(String.class, "email"));
elementBinder.registerBinder("customValues", BeanCollectionBinder.instance(customValueBinder, "customValues"));
elementBinder.registerBinder("user", userBinder);
return elementBinder;
}
}