/*
* Copyright 2016 astamuse company,Ltd.
*
* 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 com.astamuse.asta4d.web.form.flow.base;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.nodes.Element;
import com.astamuse.asta4d.Configuration;
import com.astamuse.asta4d.util.annotation.AnnotatedPropertyInfo;
import com.astamuse.asta4d.util.annotation.AnnotatedPropertyUtil;
import com.astamuse.asta4d.web.form.annotation.FormField;
import com.astamuse.asta4d.web.form.field.FormFieldValueRenderer;
public class BasicFormFlowTraitHelper {
public static class FieldRenderingInfo {
String editSelector;
String displaySelector;
FormFieldValueRenderer valueRenderer;
FieldRenderingInfo replaceArrayIndex(BasicFormFlowSnippetTrait snippet, int[] indexes) {
FieldRenderingInfo newInfo = new FieldRenderingInfo();
newInfo.editSelector = snippet.rewriteArrayIndexPlaceHolder(editSelector, indexes);
newInfo.displaySelector = snippet.rewriteArrayIndexPlaceHolder(displaySelector, indexes);
newInfo.valueRenderer = valueRenderer;
return newInfo;
}
}
private static final Map<String, List<AnnotatedPropertyInfo>> RenderingTargetFieldsMap = new ConcurrentHashMap<>();
private static final Map<AnnotatedPropertyInfo, BasicFormFlowTraitHelper.FieldRenderingInfo> FieldRenderingInfoMap = new ConcurrentHashMap<>();
static final List<AnnotatedPropertyInfo> retrieveRenderTargetFieldList(Object form) {
List<AnnotatedPropertyInfo> list = RenderingTargetFieldsMap.get(form.getClass().getName());
if (list == null) {
list = new LinkedList<AnnotatedPropertyInfo>(AnnotatedPropertyUtil.retrieveProperties(form.getClass()));
Iterator<AnnotatedPropertyInfo> it = list.iterator();
while (it.hasNext()) {
// remove all the non form field properties
if (it.next().getAnnotation(FormField.class) == null) {
it.remove();
}
}
RenderingTargetFieldsMap.put(form.getClass().getName(), list);
}
return list;
}
static final BasicFormFlowTraitHelper.FieldRenderingInfo getRenderingInfo(BasicFormFlowSnippetTrait snippet, AnnotatedPropertyInfo f,
int[] indexes) {
BasicFormFlowTraitHelper.FieldRenderingInfo info = FieldRenderingInfoMap.get(f);
if (info == null) {
info = new BasicFormFlowTraitHelper.FieldRenderingInfo();
FormField ffAnno = f.getAnnotation(FormField.class);
String fieldName = f.getName();
String editSelector = ffAnno.editSelector();
if (StringUtils.isEmpty(editSelector)) {
editSelector = snippet.defaultEditElementSelectorForField(fieldName);
}
info.editSelector = editSelector;
String displaySelector = ffAnno.displaySelector();
if (StringUtils.isEmpty(displaySelector)) {
displaySelector = snippet.defaultDisplayElementSelectorForField(fieldName);
}
info.displaySelector = displaySelector;
try {
info.valueRenderer = ffAnno.fieldValueRenderer().newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException(e);
}
if (Configuration.getConfiguration().isCacheEnable()) {
FieldRenderingInfoMap.put(f, info);
}
}
if (indexes.length > 0) {
return info.replaceArrayIndex(snippet, indexes);
} else {
return info;
}
}
//@formatter:off
static final String[] DefaultCascadeFormFieldArrayRefTargetAttrs = {
"id",
"name",
"cascade-ref",
"cascade-ref-target",
"cascade-ref-info-1",
"cascade-ref-info-2",
"cascade-ref-info-3",
"cascade-ref-info-4",
"cascade-ref-info-5",
"cascade-ref-info-6",
"cascade-ref-info-7",
"cascade-ref-info-8",
"cascade-ref-info-9",
};
//@formatter:on
static Element ClientCascadeJsContentCache = null;
}