/**
* Copyright (C) 2015 Valkyrie RCP
*
* 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.valkyriercp.form;
import org.valkyriercp.binding.form.FormModel;
import org.valkyriercp.binding.form.HierarchicalFormModel;
import org.valkyriercp.binding.form.ValidatingFormModel;
import org.valkyriercp.binding.form.support.DefaultFormModel;
import org.valkyriercp.binding.validation.support.RulesValidator;
import org.valkyriercp.binding.value.ValueModel;
import org.valkyriercp.core.Messagable;
import org.valkyriercp.rules.RulesSource;
/**
* This provides a collection of useful functions for working with {@link FormModel}s.
*
* @author Keith Donald
* @author Jim Moore
*/
public class FormModelFactory {
public ValidatingFormModel createFormModel(Object formObject, String formId) {
return createFormModel(formObject, true, formId);
}
public ValidatingFormModel createUnbufferedFormModel(Object formObject, String formId) {
return createFormModel(formObject, false, formId);
}
public ValidatingFormModel createFormModel(Object formObject, boolean bufferChanges, String formId) {
DefaultFormModel formModel = new DefaultFormModel(formObject, bufferChanges);
formModel.setId(formId);
return formModel;
}
public ValidatingFormModel createFormModel(Object formObject, boolean bufferChanges, RulesSource rulesSource,
String formId) {
DefaultFormModel formModel = new DefaultFormModel(formObject, bufferChanges);
formModel.setId(formId);
formModel.setValidator(new RulesValidator(formModel, rulesSource));
return formModel;
}
public ValidatingFormModel createCompoundFormModel(Object formObject, String formId) {
DefaultFormModel model = new DefaultFormModel(formObject);
model.setId(formId);
return model;
}
public ValidatingFormModel createFormModel(ValueModel formObjectHolder) {
return createFormModel(formObjectHolder, true, null);
}
public ValidatingFormModel createFormModel(ValueModel formObjectHolder, String formId) {
return createFormModel(formObjectHolder, true, formId);
}
public ValidatingFormModel createUnbufferedFormModel(ValueModel formObjectHolder, String formId) {
return createFormModel(formObjectHolder, false, formId);
}
public ValidatingFormModel createFormModel(ValueModel formObjectHolder, boolean bufferChanges,
String formId) {
DefaultFormModel formModel = new DefaultFormModel(formObjectHolder, bufferChanges);
formModel.setId(formId);
return formModel;
}
public ValidatingFormModel createCompoundFormModel(ValueModel formObjectHolder, String formId) {
DefaultFormModel model = new DefaultFormModel(formObjectHolder);
model.setId(formId);
return model;
}
public ValidatingFormModel createFormModel(Object formObject) {
return createFormModel(formObject, true);
}
public ValidatingFormModel createUnbufferedFormModel(Object formObject) {
return createFormModel(formObject, false);
}
public ValidatingFormModel createFormModel(Object formObject, boolean bufferChanges) {
return createFormModel(formObject, bufferChanges, null);
}
public HierarchicalFormModel createCompoundFormModel(Object formObject) {
return createCompoundFormModel(formObject, null);
}
public FormModel createChildPageFormModel(HierarchicalFormModel parentModel) {
return createChildPageFormModel(parentModel, null);
}
public ValidatingFormModel createChildPageFormModel(HierarchicalFormModel parentModel,
String childPageName) {
ValidatingFormModel child = createFormModel(parentModel.getFormObjectHolder());
child.setId(childPageName);
parentModel.addChild(child);
return child;
}
/**
* Create a child form model nested by this form model identified by the
* provided name. The form object associated with the created child model is
* the value model at the specified parent property path.
*
* @param parentModel the model to create the FormModelFactory in
* @param childPageName the name to associate the created FormModelFactory
* with in the groupingModel
* @param childFormObjectPropertyPath the path into the groupingModel that
* the FormModelFactory is for
*
* @return The child form model
*/
public ValidatingFormModel createChildPageFormModel(HierarchicalFormModel parentModel, String childPageName,
String childFormObjectPropertyPath) {
final ValueModel childValueModel = parentModel.getValueModel(childFormObjectPropertyPath);
return createChildPageFormModel(parentModel, childPageName, childValueModel);
}
public ValidatingFormModel createChildPageFormModel(HierarchicalFormModel parentModel, String childPageName,
ValueModel childFormObjectHolder) {
ValidatingFormModel child = createFormModel(childFormObjectHolder);
child.setId(childPageName);
parentModel.addChild(child);
return child;
}
public ValidationResultsReporter createSingleLineResultsReporter(ValidatingFormModel formModel,
Messagable messageReceiver) {
return new SimpleValidationResultsReporter(formModel.getValidationResults(), messageReceiver);
}
/**
* Returns the child of the formModel with the given page name.
*
* @param formModel the parent model to get the child from
* @param childPageName the name of the child to retrieve
*
* @return null the child can not be found
*
* @throws IllegalArgumentException if childPageName or formModel are null
*/
public FormModel getChild(HierarchicalFormModel formModel, String childPageName) {
if (childPageName == null) throw new IllegalArgumentException("childPageName == null");
if (formModel == null) throw new IllegalArgumentException("formModel == null");
final FormModel[] children = formModel.getChildren();
if (children == null) return null;
for (int i = 0; i < children.length; i++) {
final FormModel child = children[i];
if (childPageName.equals(child.getId())) return child;
}
return null;
}
}