/* * Copyright (C) 1999-2006 Jive Software. All rights reserved. * * Licensed 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.jivesoftware.openfire.fastpath.dataforms; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.jivesoftware.xmpp.workgroup.DbProperties; import org.jivesoftware.xmpp.workgroup.UnauthorizedException; import org.jivesoftware.xmpp.workgroup.Workgroup; import org.jivesoftware.xmpp.workgroup.WorkgroupManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xmpp.forms.DataForm; import org.xmpp.forms.FormField; import com.thoughtworks.xstream.XStream; public class FormManager { private static final Logger Log = LoggerFactory.getLogger(FormManager.class); private static FormManager singleton = new FormManager(); private Map<Workgroup, WorkgroupForm> forms = new ConcurrentHashMap<Workgroup, WorkgroupForm>(); /** * Returns the singleton instance of <CODE>FormManager</CODE>, * creating it if necessary. * <p/> * * @return the singleton instance of <Code>FormManager</CODE> */ public static FormManager getInstance() { return singleton; } private FormManager() { // Prevent initialization loadWebForms(); } public void addWorkgroupForm(Workgroup workgroup, WorkgroupForm workgroupForm) { forms.put(workgroup, workgroupForm); } public WorkgroupForm getWebForm(Workgroup workgroup) { return forms.get(workgroup); } public void removeForm(Workgroup workgroup) { forms.remove(workgroup); } public void saveWorkgroupForm(Workgroup workgroup) { // Save Web Form for editing WorkgroupForm workgroupForm = getWebForm(workgroup); if (workgroupForm != null) { XStream xstream = new XStream(); String xmlToSave = xstream.toXML(workgroupForm); DbProperties props = workgroup.getProperties(); String context = "jive.webform.wg"; try { props.deleteProperty(context); props.setProperty(context, xmlToSave); } catch (UnauthorizedException e) { Log.error(e.getMessage(), e); } } // Save DataForm for usage saveDataForm(workgroup); } private void saveDataForm(Workgroup workgroup) { DataForm dataForm = new DataForm(DataForm.Type.form); WorkgroupForm form = getWebForm(workgroup); if (form.getTitle() != null) { dataForm.setTitle(form.getTitle()); } if (form.getDescription() != null) { dataForm.addInstruction(form.getDescription()); } List<FormElement> elems = new ArrayList<FormElement>(); // Add normal elems int size = form.getFormElements().size(); for (int j = 0; j < size; j++) { elems.add(form.getFormElementAt(j)); } size = form.getHiddenVars().size(); for (int k = 0; k < size; k++) { elems.add(form.getHiddenVars().get(k)); } size = elems.size(); for (int i = 0; i < size; i++) { FormElement elem = elems.get(i); FormField field = dataForm.addField(); field.setLabel(elem.getLabel()); field.setVariable(elem.getVariable()); field.setRequired(elem.isRequired()); if (elem.getDescription() != null) { field.setDescription(elem.getDescription()); } if (elem.getAnswerType() == WorkgroupForm.FormEnum.textarea) { field.setType(FormField.Type.text_multi); } else if (elem.getAnswerType() == WorkgroupForm.FormEnum.textfield) { field.setType(FormField.Type.text_single); } else if (elem.getAnswerType() == WorkgroupForm.FormEnum.checkbox) { field.setType(FormField.Type.boolean_type); } else if (elem.getAnswerType() == WorkgroupForm.FormEnum.radio_button) { field.setType(FormField.Type.list_multi); } else if (elem.getAnswerType() == WorkgroupForm.FormEnum.dropdown_box) { field.setType(FormField.Type.list_single); } else if(elem.getAnswerType() == WorkgroupForm.FormEnum.hidden){ field.setType(FormField.Type.hidden); } else if (elem.getAnswerType() == WorkgroupForm.FormEnum.password) { field.setType(FormField.Type.text_private); } if (elem.getAnswers().size() > 0 && elem.getAnswerType() != WorkgroupForm.FormEnum.hidden) { for(String item : elem.getAnswers()) { field.addOption(item, item); } } else if (elem.getAnswers().size() > 0) { // Add hidden element values. for(String item : elem.getAnswers()) { field.addValue(item); } } } XStream xstream = new XStream(); String xmlToSave = xstream.toXML(dataForm); DbProperties props = workgroup.getProperties(); String context = "jive.dataform.wg"; try { props.deleteProperty(context); props.setProperty(context, xmlToSave); } catch (UnauthorizedException e) { Log.error(e.getMessage(), e); } } public DataForm getDataForm(Workgroup workgroup) { DbProperties props = workgroup.getProperties(); String context = "jive.dataform.wg"; String form = props.getProperty(context); if (form != null) { XStream xstream = new XStream(); xstream.setClassLoader(this.getClass().getClassLoader()); try { return (DataForm) xstream.fromXML(form); } catch (Exception e) { Log.error(e.getMessage(), e); } } return null; } private void loadWebForms() { final WorkgroupManager workgroupManager = WorkgroupManager.getInstance(); for (Workgroup workgroup : workgroupManager.getWorkgroups()) { DbProperties props = workgroup.getProperties(); String context = "jive.webform.wg"; String form = props.getProperty(context); if (form != null) { XStream xstream = new XStream(); xstream.setClassLoader(this.getClass().getClassLoader()); try { Object object = xstream.fromXML(form); WorkgroupForm workgroupForm = (WorkgroupForm)object; if (workgroupForm != null) { addWorkgroupForm(workgroup, workgroupForm); } } catch (Exception e) { Log.error(e.getMessage(), e); } } else { // Create a default Web Form createGenericForm(workgroup); } } } /** * Creates a new generic dataform for the Workgroup if one does not exist. * * @param workgroup the workgroup without a dataform. */ public void createGenericForm(Workgroup workgroup) { WorkgroupForm workgroupForm = new WorkgroupForm(); FormElement username = new FormElement(); username.setRequired(true); username.setAnswerType(WorkgroupForm.FormEnum.textfield); username.setVariable("username"); username.setLabel("Name:"); workgroupForm.addFormElement(username); FormElement email = new FormElement(); email.setRequired(true); email.setAnswerType(WorkgroupForm.FormEnum.textfield); email.setVariable("email"); email.setLabel("Email Address:"); workgroupForm.addFormElement(email); FormElement question = new FormElement(); question.setRequired(true); question.setAnswerType(WorkgroupForm.FormEnum.textfield); question.setVariable("question"); question.setLabel("Question:"); workgroupForm.addFormElement(question); addWorkgroupForm(workgroup, workgroupForm); saveWorkgroupForm(workgroup); } }