@SuppressWarnings("serial") private List<Statement> generateDataFieldMetas(final String dataFieldMetasVarName, final Decorable decorable) { final Map<String, DataField> annoMap = DataFieldCodeDecorator.aggregateDataFieldAnnotationMap(decorable, decorable.getType()); final List<Statement> stmts = new ArrayList<>(annoMap.size()+1); stmts.add(declareFinalVariable(dataFieldMetasVarName, new TypeLiteral<Map<String, DataFieldMeta>>() { }, newObject(parameterizedAs(HashMap.class, typeParametersOf(String.class, DataFieldMeta.class)), annoMap.size()))); annoMap .entrySet() .stream() .map(entry -> { final String fieldName = entry.getKey(); final DataField dataField = entry.getValue(); Statement dataFieldMetaInstance; if (dataField.attributeRules().length == 0 && dataField.defaultStrategy().equals(ConflictStrategy.USE_TEMPLATE)) { dataFieldMetaInstance = newObject(DataFieldMeta.class); } else { dataFieldMetaInstance = newObject(DataFieldMeta.class, loadLiteral(dataField.attributeRules()), loadLiteral(dataField.defaultStrategy())); } return loadVariable(dataFieldMetasVarName).invoke("put", fieldName, dataFieldMetaInstance); }) .collect(Collectors.toCollection(() -> stmts)); return stmts; }
@SuppressWarnings("serial") private List<Statement> generateDataFieldMetas(final String dataFieldMetasVarName, final Decorable decorable) { final Map<String, DataField> annoMap = DataFieldCodeDecorator.aggregateDataFieldAnnotationMap(decorable, decorable.getType()); final List<Statement> stmts = new ArrayList<>(annoMap.size()+1); stmts.add(declareFinalVariable(dataFieldMetasVarName, new TypeLiteral<Map<String, DataFieldMeta>>() { }, newObject(parameterizedAs(HashMap.class, typeParametersOf(String.class, DataFieldMeta.class)), annoMap.size()))); annoMap .entrySet() .stream() .map(entry -> { final String fieldName = entry.getKey(); final DataField dataField = entry.getValue(); Statement dataFieldMetaInstance; if (dataField.attributeRules().length == 0 && dataField.defaultStrategy().equals(ConflictStrategy.USE_TEMPLATE)) { dataFieldMetaInstance = newObject(DataFieldMeta.class); } else { dataFieldMetaInstance = newObject(DataFieldMeta.class, loadLiteral(dataField.attributeRules()), loadLiteral(dataField.defaultStrategy())); } return loadVariable(dataFieldMetasVarName).invoke("put", fieldName, dataFieldMetaInstance); }) .collect(Collectors.toCollection(() -> stmts)); return stmts; }
private static void mergeAttribute(final DataFieldMeta meta, final HTMLElement beanElement, final HTMLElement templateElement, final String name, final String value) { final ConflictStrategy strategy = meta.getStrategy(name); // Merge all class names regardless of strategy if (name.equals("class")) { DOMUtil.tokenStream(templateElement.getClassList()) .filter(token -> !beanElement.getClassList().contains(token)) .forEach(token -> beanElement.getClassList().add(token)); } // Merge individual properties in style only using the strategy when both elements have a value. else if (name.equals("style")) { Stream<String> propertyNameStream = DOMUtil.cssPropertyNameStream(templateElement.getStyle()); if (ConflictStrategy.USE_BEAN.equals(strategy)) { propertyNameStream = propertyNameStream .filter(propertyName -> { final String beanPropertyValue = beanElement.getStyle().getPropertyValue(propertyName); return beanPropertyValue == null || beanPropertyValue.isEmpty(); }); } propertyNameStream .forEach(propertyName -> beanElement.getStyle().setProperty(propertyName, templateElement.getStyle().getPropertyValue(propertyName), "")); } // Use strategy to decide which value is used. else { final String beanValue = beanElement.getAttribute(name); if (ConflictStrategy.USE_TEMPLATE.equals(strategy) || beanValue == null || beanValue.isEmpty()) { beanElement.setAttribute(name, value); } } }
private static void mergeAttribute(final DataFieldMeta meta, final HTMLElement beanElement, final HTMLElement templateElement, final String name, final String value) { final ConflictStrategy strategy = meta.getStrategy(name); // Merge all class names regardless of strategy if (name.equals("class")) { DOMUtil.tokenStream(templateElement.getClassList()) .filter(token -> !beanElement.getClassList().contains(token)) .forEach(token -> beanElement.getClassList().add(token)); } // Merge individual properties in style only using the strategy when both elements have a value. else if (name.equals("style")) { Stream<String> propertyNameStream = DOMUtil.cssPropertyNameStream(templateElement.getStyle()); if (ConflictStrategy.USE_BEAN.equals(strategy)) { propertyNameStream = propertyNameStream .filter(propertyName -> { final String beanPropertyValue = beanElement.getStyle().getPropertyValue(propertyName); return beanPropertyValue == null || beanPropertyValue.isEmpty(); }); } propertyNameStream .forEach(propertyName -> beanElement.getStyle().setProperty(propertyName, templateElement.getStyle().getPropertyValue(propertyName), "")); } // Use strategy to decide which value is used. else { final String beanValue = beanElement.getAttribute(name); if (ConflictStrategy.USE_TEMPLATE.equals(strategy) || beanValue == null || beanValue.isEmpty()) { beanElement.setAttribute(name, value); } } }