More efficient access when DTOs are used in template models.
This commit is contained in:
parent
11452babe6
commit
2ed51772ed
5 changed files with 98 additions and 18 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
#Tue May 23 17:52:06 CEST 2023
|
#Sun May 28 16:23:45 CEST 2023
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
|
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
|
||||||
org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
|
org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
|
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
|
||||||
|
|
@ -286,9 +286,9 @@ org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=1
|
||||||
org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
|
org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
|
||||||
org.eclipse.jdt.core.formatter.lineSplit=80
|
org.eclipse.jdt.core.formatter.lineSplit=80
|
||||||
org.eclipse.jdt.core.compiler.source=17
|
org.eclipse.jdt.core.compiler.source=17
|
||||||
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
|
|
||||||
org.eclipse.jdt.core.formatter.tabulation.size=4
|
org.eclipse.jdt.core.formatter.tabulation.size=4
|
||||||
|
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
|
||||||
|
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
|
||||||
org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false
|
org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false
|
||||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
|
org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
|
||||||
|
|
@ -304,13 +304,13 @@ org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
|
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
|
||||||
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
|
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
|
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
|
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
|
||||||
|
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
|
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
|
||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
|
org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
|
eclipse.preferences.version=1
|
||||||
org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
|
org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
|
||||||
|
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
|
||||||
org.eclipse.jdt.core.compiler.compliance=17
|
org.eclipse.jdt.core.compiler.compliance=17
|
||||||
org.eclipse.jdt.core.formatter.blank_lines_after_package=1
|
org.eclipse.jdt.core.formatter.blank_lines_after_package=1
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
|
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,5 @@ plugins {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'com.fasterxml.jackson.core:jackson-databind:[2.15.0,3]'
|
|
||||||
implementation 'org.freemarker:freemarker:[2.3.32,2.4)'
|
implementation 'org.freemarker:freemarker:[2.3.32,2.4)'
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,15 @@
|
||||||
|
|
||||||
package org.jdrupes.vmoperator.util;
|
package org.jdrupes.vmoperator.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Marks a class as the definition of a data transfer object.
|
||||||
|
* DTOs have public attributes and usually no behavior (though
|
||||||
|
* the can have e.g. methods for checking the consistency.
|
||||||
|
*
|
||||||
|
* The DTO marker affects the conversion of objects to other
|
||||||
|
* representations.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("PMD.ShortClassName")
|
||||||
public interface Dto {
|
public interface Dto {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
* VM-Operator
|
||||||
|
* Copyright (C) 2023 Michael N. Lipp
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program 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 Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jdrupes.vmoperator.util;
|
||||||
|
|
||||||
|
import freemarker.ext.util.WrapperTemplateModel;
|
||||||
|
import freemarker.template.ObjectWrapper;
|
||||||
|
import freemarker.template.TemplateHashModel;
|
||||||
|
import freemarker.template.TemplateModel;
|
||||||
|
import freemarker.template.TemplateModelException;
|
||||||
|
import freemarker.template.WrappingTemplateModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wraps a DTO in a {@link TemplateHashModel}.
|
||||||
|
*/
|
||||||
|
public class DtoTemplateModel extends WrappingTemplateModel
|
||||||
|
implements WrapperTemplateModel, TemplateHashModel {
|
||||||
|
|
||||||
|
private final Dto dto;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiates a new DTO template model.
|
||||||
|
*
|
||||||
|
* @param objectWrapper the object wrapper
|
||||||
|
* @param dto the dto
|
||||||
|
*/
|
||||||
|
public DtoTemplateModel(ObjectWrapper objectWrapper, Dto dto) {
|
||||||
|
super(objectWrapper);
|
||||||
|
this.dto = dto;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("PMD.PreserveStackTrace")
|
||||||
|
public TemplateModel get(String key) throws TemplateModelException {
|
||||||
|
try {
|
||||||
|
var field = dto.getClass().getDeclaredField(key);
|
||||||
|
return wrap(field.get(dto));
|
||||||
|
} catch (NoSuchFieldException | SecurityException e) {
|
||||||
|
throw new TemplateModelException("No Field " + key
|
||||||
|
+ " in class " + dto.getClass());
|
||||||
|
} catch (IllegalArgumentException | IllegalAccessException e) {
|
||||||
|
throw new TemplateModelException("Cannot access field " + key
|
||||||
|
+ " in class " + dto.getClass());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEmpty() throws TemplateModelException {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getWrappedObject() {
|
||||||
|
return dto;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -18,31 +18,31 @@
|
||||||
|
|
||||||
package org.jdrupes.vmoperator.util;
|
package org.jdrupes.vmoperator.util;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
||||||
import freemarker.template.DefaultObjectWrapper;
|
import freemarker.template.DefaultObjectWrapper;
|
||||||
import freemarker.template.TemplateModel;
|
import freemarker.template.TemplateModel;
|
||||||
import freemarker.template.TemplateModelException;
|
import freemarker.template.TemplateModelException;
|
||||||
import freemarker.template.Version;
|
import freemarker.template.Version;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides an object wrapper that handles {@link Dto}s.
|
||||||
|
*/
|
||||||
public class ExtendedObjectWrapper extends DefaultObjectWrapper {
|
public class ExtendedObjectWrapper extends DefaultObjectWrapper {
|
||||||
|
|
||||||
private ObjectMapper mapper;
|
/**
|
||||||
|
* Instantiates a new extended object wrapper.
|
||||||
public ExtendedObjectWrapper(Version incompatibleImprovements,
|
*
|
||||||
ObjectMapper mapper) {
|
* @param incompatibleImprovements the incompatible improvements
|
||||||
|
*/
|
||||||
|
public ExtendedObjectWrapper(Version incompatibleImprovements) {
|
||||||
super(incompatibleImprovements);
|
super(incompatibleImprovements);
|
||||||
this.mapper = mapper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected TemplateModel handleUnknownType(final Object obj)
|
protected TemplateModel handleUnknownType(final Object obj)
|
||||||
throws TemplateModelException {
|
throws TemplateModelException {
|
||||||
if (obj instanceof Dto) {
|
if (obj instanceof Dto dto) {
|
||||||
var asMap = mapper.convertValue(obj, Map.class);
|
return new DtoTemplateModel(this, dto);
|
||||||
return this.wrap(asMap);
|
|
||||||
}
|
}
|
||||||
return super.handleUnknownType(obj);
|
return super.handleUnknownType(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue