/*
* gvNIX is an open source tool for rapid application development (RAD).
* Copyright (C) 2010 Generalitat Valenciana
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.gvnix.addon.geo.addon;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.gvnix.addon.geo.annotations.GvNIXGeoConversionService;
import org.gvnix.support.ItdBuilderHelper;
import org.springframework.roo.classpath.PhysicalTypeIdentifierNamingUtils;
import org.springframework.roo.classpath.PhysicalTypeMetadata;
import org.springframework.roo.classpath.details.FieldMetadata;
import org.springframework.roo.classpath.details.FieldMetadataBuilder;
import org.springframework.roo.classpath.details.MemberFindingUtils;
import org.springframework.roo.classpath.details.MethodMetadata;
import org.springframework.roo.classpath.details.MethodMetadataBuilder;
import org.springframework.roo.classpath.details.annotations.AnnotatedJavaType;
import org.springframework.roo.classpath.details.annotations.AnnotationMetadataBuilder;
import org.springframework.roo.classpath.itd.AbstractItdTypeDetailsProvidingMetadataItem;
import org.springframework.roo.classpath.itd.InvocableMemberBodyBuilder;
import org.springframework.roo.metadata.MetadataIdentificationUtils;
import org.springframework.roo.model.DataType;
import org.springframework.roo.model.JavaSymbolName;
import org.springframework.roo.model.JavaType;
import org.springframework.roo.project.LogicalPath;
/**
* ITD generator for {@link GvNIXGeoConversionService} annotation.
*
* @author <a href="http://www.disid.com">DISID Corporation S.L.</a> made for <a
* href="http://www.dgti.gva.es">General Directorate for Information
* Technologies (DGTI)</a>
* @since 1.4.0
*/
public class GvNIXGeoConversionServiceMetadata extends
AbstractItdTypeDetailsProvidingMetadataItem {
private static final String RET_JL_STRING = " return new %s<%s, java.lang.String>() {";
private static final String RET_JL_STRING_S = " return new %s<java.lang.String, %s>() {";
private static final String TRY_BR = "try {";
private static final String CATCH = "}catch( %s e) {";
private static final String THROW_ILLEGAL_EX = "throw new IllegalArgumentException(";
private static final JavaType PARSE_EXCEPTION_TYPE = new JavaType(
"com.vividsolutions.jts.io.ParseException");
private static final JavaType CONVERTER_TYPE = new JavaType(
"org.springframework.core.convert.converter.Converter");
private static final JavaType WKTREADER_TYPE = new JavaType(
"com.vividsolutions.jts.io.WKTReader");
private static final JavaType WKTWRITER_TYPE = new JavaType(
"com.vividsolutions.jts.io.WKTWriter");
private static final JavaType POINT_TYPE = new JavaType(
"com.vividsolutions.jts.geom.Point");
private static final JavaType LINESTRING_TYPE = new JavaType(
"com.vividsolutions.jts.geom.LineString");
private static final JavaType POLYGON_TYPE = new JavaType(
"com.vividsolutions.jts.geom.Polygon");
private static final JavaType GEOMETRY_TYPE = new JavaType(
"com.vividsolutions.jts.geom.Geometry");
private static final JavaType MULTILINESTRING_TYPE = new JavaType(
"com.vividsolutions.jts.geom.MultiLineString");
private static final JavaSymbolName POINT_TO_STRING_METHOD = new JavaSymbolName(
"getPointToStringConverter");
private static final JavaSymbolName STRING_TO_POINT_METHOD = new JavaSymbolName(
"getStringToPointConverter");
private static final JavaSymbolName LINESTRING_TO_STRING_METHOD = new JavaSymbolName(
"getLineStringToStringConverter");
private static final JavaSymbolName STRING_TO_LINESTRING_METHOD = new JavaSymbolName(
"getStringToLineStringConverter");
private static final JavaSymbolName POLYGON_TO_STRING_METHOD = new JavaSymbolName(
"getPolygonToStringConverter");
private static final JavaSymbolName STRING_TO_POLYGON_METHOD = new JavaSymbolName(
"getStringToPolygonConverter");
private static final JavaSymbolName GEOMETRY_TO_STRING_METHOD = new JavaSymbolName(
"getGeometryToStringConverter");
private static final JavaSymbolName STRING_TO_GEOMETRY_METHOD = new JavaSymbolName(
"getStringToGeometryConverter");
private static final JavaSymbolName MULTLINESTR_TO_STR_MET = new JavaSymbolName(
"getMultiLineStringToStringConverter");
private static final JavaSymbolName STR_TO_MULTSTR_MET = new JavaSymbolName(
"getStringToMultiLineStringConverter");
private static final JavaSymbolName INSTALL_GEO_LABLES_METHOD = new JavaSymbolName(
"installGeoLabelConverters");
private static final JavaSymbolName AFTER_PROPERTY_SET = new JavaSymbolName(
"afterPropertiesSet");
private static final JavaType CONVERTER_POINT_STRING = new JavaType(
CONVERTER_TYPE.getFullyQualifiedTypeName(), 0, DataType.TYPE, null,
Arrays.asList(POINT_TYPE, JavaType.STRING));
private static final JavaType CONVERTER_STRING_POINT = new JavaType(
CONVERTER_TYPE.getFullyQualifiedTypeName(), 0, DataType.TYPE, null,
Arrays.asList(JavaType.STRING, POINT_TYPE));
private static final JavaType CONVERTER_LINESTRING_STRING = new JavaType(
CONVERTER_TYPE.getFullyQualifiedTypeName(), 0, DataType.TYPE, null,
Arrays.asList(LINESTRING_TYPE, JavaType.STRING));
private static final JavaType CONVERTER_STRING_LINESTRING = new JavaType(
CONVERTER_TYPE.getFullyQualifiedTypeName(), 0, DataType.TYPE, null,
Arrays.asList(JavaType.STRING, LINESTRING_TYPE));
private static final JavaType CONVERTER_POLYGON_STRING = new JavaType(
CONVERTER_TYPE.getFullyQualifiedTypeName(), 0, DataType.TYPE, null,
Arrays.asList(POLYGON_TYPE, JavaType.STRING));
private static final JavaType CONVERTER_STRING_POLYGON = new JavaType(
CONVERTER_TYPE.getFullyQualifiedTypeName(), 0, DataType.TYPE, null,
Arrays.asList(JavaType.STRING, POLYGON_TYPE));
private static final JavaType CONVERTER_GEOMETRY_STRING = new JavaType(
CONVERTER_TYPE.getFullyQualifiedTypeName(), 0, DataType.TYPE, null,
Arrays.asList(GEOMETRY_TYPE, JavaType.STRING));
private static final JavaType CONVERTER_STRING_GEOMETRY = new JavaType(
CONVERTER_TYPE.getFullyQualifiedTypeName(), 0, DataType.TYPE, null,
Arrays.asList(JavaType.STRING, GEOMETRY_TYPE));
private static final JavaType CONV_MULTSTR_STR = new JavaType(
CONVERTER_TYPE.getFullyQualifiedTypeName(), 0, DataType.TYPE, null,
Arrays.asList(MULTILINESTRING_TYPE, JavaType.STRING));
private static final JavaType CONV_STR_MULTSTR = new JavaType(
CONVERTER_TYPE.getFullyQualifiedTypeName(), 0, DataType.TYPE, null,
Arrays.asList(JavaType.STRING, MULTILINESTRING_TYPE));
/**
* Itd builder helper
*/
private final ItdBuilderHelper helper;
private static final String PROVIDES_TYPE_STRING = GvNIXGeoConversionServiceMetadata.class
.getName();
private static final String PROVIDES_TYPE = MetadataIdentificationUtils
.create(PROVIDES_TYPE_STRING);
public GvNIXGeoConversionServiceMetadata(String identifier,
JavaType aspectName,
PhysicalTypeMetadata governorPhysicalTypeMetadata,
JavaType conversionServiceAspectName) {
super(identifier, aspectName, governorPhysicalTypeMetadata);
// Helper itd generation
this.helper = new ItdBuilderHelper(this, governorPhysicalTypeMetadata,
builder.getImportRegistrationResolver());
// Adding precedence declaration
// This aspect before Roo_ConversionService
builder.setDeclarePrecedence(aspectName, conversionServiceAspectName);
// Creating WKTReader reader = new WKTReader(); field
builder.addField(getField("reader", "new WKTReader()", WKTREADER_TYPE,
Modifier.PRIVATE, null));
// Creating WKTWriter writer = new WKTWriter(); field
builder.addField(getField("writer", "new WKTWriter()", WKTWRITER_TYPE,
Modifier.PRIVATE, null));
// Adding Converter methods
builder.addMethod(getPointToStringConverterMethod());
builder.addMethod(getStringToPointConverterMethod());
builder.addMethod(getLineStringToStringConverterMethod());
builder.addMethod(getStringToLineStringConverterMethod());
builder.addMethod(getPolygonToStringConverterMethod());
builder.addMethod(getStringToPolygonConverterMethod());
builder.addMethod(getGeometryToStringConverterMethod());
builder.addMethod(getStringToGeometryConverterMethod());
builder.addMethod(getMultiLineStringToStringConverterMethod());
builder.addMethod(getStringToMultiLineStringConverterMethod());
// Adding registry methods
builder.addMethod(getInstallGeoLabelsConverterMethod());
builder.addMethod(getAfterPropertiesSetMethod());
// Create a representation of the desired output ITD
itdTypeDetails = builder.build();
}
/**
* Gets <code>getPointToStringConverter</code> method. <br>
*
* @return
*/
private MethodMetadata getPointToStringConverterMethod() {
// Define method parameter types
List<AnnotatedJavaType> parameterTypes = new ArrayList<AnnotatedJavaType>();
// Check if a method with the same signature already exists in the
// target type
final MethodMetadata method = methodExists(POINT_TO_STRING_METHOD,
parameterTypes);
if (method != null) {
// If it already exists, just return the method and omit its
// generation via the ITD
return method;
}
// Define method annotations
List<AnnotationMetadataBuilder> annotations = new ArrayList<AnnotationMetadataBuilder>();
// Define method throws types
List<JavaType> throwsTypes = new ArrayList<JavaType>();
// Define method parameter names
List<JavaSymbolName> parameterNames = new ArrayList<JavaSymbolName>();
// Create the method body
InvocableMemberBodyBuilder bodyBuilder = new InvocableMemberBodyBuilder();
buildGetPointToStringConverterMethodBody(bodyBuilder);
// Use the MethodMetadataBuilder for easy creation of MethodMetadata
MethodMetadataBuilder methodBuilder = new MethodMetadataBuilder(
getId(), Modifier.PUBLIC, POINT_TO_STRING_METHOD,
CONVERTER_POINT_STRING, parameterTypes, parameterNames,
bodyBuilder);
methodBuilder.setAnnotations(annotations);
methodBuilder.setThrowsTypes(throwsTypes);
return methodBuilder.build(); // Build and return a MethodMetadata
// instance
}
/**
* Gets <code>getStringToPointConverter</code> method. <br>
*
* @return
*/
private MethodMetadata getStringToPointConverterMethod() {
// Define method parameter types
List<AnnotatedJavaType> parameterTypes = new ArrayList<AnnotatedJavaType>();
// Check if a method with the same signature already exists in the
// target type
final MethodMetadata method = methodExists(STRING_TO_POINT_METHOD,
parameterTypes);
if (method != null) {
// If it already exists, just return the method and omit its
// generation via the ITD
return method;
}
// Define method annotations
List<AnnotationMetadataBuilder> annotations = new ArrayList<AnnotationMetadataBuilder>();
// Define method throws types
List<JavaType> throwsTypes = new ArrayList<JavaType>();
// Define method parameter names
List<JavaSymbolName> parameterNames = new ArrayList<JavaSymbolName>();
// Create the method body
InvocableMemberBodyBuilder bodyBuilder = new InvocableMemberBodyBuilder();
buildGetStringToPointConverterMethodBody(bodyBuilder);
// Use the MethodMetadataBuilder for easy creation of MethodMetadata
MethodMetadataBuilder methodBuilder = new MethodMetadataBuilder(
getId(), Modifier.PUBLIC, STRING_TO_POINT_METHOD,
CONVERTER_STRING_POINT, parameterTypes, parameterNames,
bodyBuilder);
methodBuilder.setAnnotations(annotations);
methodBuilder.setThrowsTypes(throwsTypes);
return methodBuilder.build(); // Build and return a MethodMetadata
// instance
}
/**
* Gets <code>installGeoLabelsConverter</code> method. <br>
*
* @return
*/
private MethodMetadata getInstallGeoLabelsConverterMethod() {
// Define method parameter types
List<AnnotatedJavaType> parameterTypes = new ArrayList<AnnotatedJavaType>();
parameterTypes.add(new AnnotatedJavaType(new JavaType(
"org.springframework.format.FormatterRegistry")));
// Check if a method with the same signature already exists in the
// target type
final MethodMetadata method = methodExists(INSTALL_GEO_LABLES_METHOD,
parameterTypes);
if (method != null) {
// If it already exists, just return the method and omit its
// generation via the ITD
return method;
}
// Define method annotations
List<AnnotationMetadataBuilder> annotations = new ArrayList<AnnotationMetadataBuilder>();
// Define method throws types
List<JavaType> throwsTypes = new ArrayList<JavaType>();
// Define method parameter names
List<JavaSymbolName> parameterNames = new ArrayList<JavaSymbolName>();
parameterNames.add(new JavaSymbolName("registry"));
// Create the method body
InvocableMemberBodyBuilder bodyBuilder = new InvocableMemberBodyBuilder();
buildInstallGeoLabelsConvertersMethodBody(bodyBuilder);
// Use the MethodMetadataBuilder for easy creation of MethodMetadata
MethodMetadataBuilder methodBuilder = new MethodMetadataBuilder(
getId(), Modifier.PUBLIC, INSTALL_GEO_LABLES_METHOD,
JavaType.VOID_PRIMITIVE, parameterTypes, parameterNames,
bodyBuilder);
methodBuilder.setAnnotations(annotations);
methodBuilder.setThrowsTypes(throwsTypes);
return methodBuilder.build(); // Build and return a MethodMetadata
// instance
}
/**
* Gets <code>afterPropertiesSet</code> method. <br>
*
* @return
*/
private MethodMetadata getAfterPropertiesSetMethod() {
// Define method parameter types
List<AnnotatedJavaType> parameterTypes = new ArrayList<AnnotatedJavaType>();
// Check if a method with the same signature already exists in the
// target type
final MethodMetadata method = methodExists(AFTER_PROPERTY_SET,
parameterTypes);
if (method != null) {
// If it already exists, just return the method and omit its
// generation via the ITD
return method;
}
// Define method annotations
List<AnnotationMetadataBuilder> annotations = new ArrayList<AnnotationMetadataBuilder>();
// Define method throws types
List<JavaType> throwsTypes = new ArrayList<JavaType>();
// Define method parameter names
List<JavaSymbolName> parameterNames = new ArrayList<JavaSymbolName>();
// Create the method body
InvocableMemberBodyBuilder bodyBuilder = new InvocableMemberBodyBuilder();
buildAfterPropertiesSetMethodBody(bodyBuilder);
// Use the MethodMetadataBuilder for easy creation of MethodMetadata
MethodMetadataBuilder methodBuilder = new MethodMetadataBuilder(
getId(), Modifier.PUBLIC, AFTER_PROPERTY_SET,
JavaType.VOID_PRIMITIVE, parameterTypes, parameterNames,
bodyBuilder);
methodBuilder.setAnnotations(annotations);
methodBuilder.setThrowsTypes(throwsTypes);
return methodBuilder.build(); // Build and return a MethodMetadata
// instance
}
/**
* Gets <code>getLineStringToStringConverter</code> method. <br>
*
* @return
*/
private MethodMetadata getLineStringToStringConverterMethod() {
// Define method parameter types
List<AnnotatedJavaType> parameterTypes = new ArrayList<AnnotatedJavaType>();
// Check if a method with the same signature already exists in the
// target type
final MethodMetadata method = methodExists(LINESTRING_TO_STRING_METHOD,
parameterTypes);
if (method != null) {
// If it already exists, just return the method and omit its
// generation via the ITD
return method;
}
// Define method annotations
List<AnnotationMetadataBuilder> annotations = new ArrayList<AnnotationMetadataBuilder>();
// Define method throws types
List<JavaType> throwsTypes = new ArrayList<JavaType>();
// Define method parameter names
List<JavaSymbolName> parameterNames = new ArrayList<JavaSymbolName>();
// Create the method body
InvocableMemberBodyBuilder bodyBuilder = new InvocableMemberBodyBuilder();
buildGetLineStringToStringConverterMethodBody(bodyBuilder);
// Use the MethodMetadataBuilder for easy creation of MethodMetadata
MethodMetadataBuilder methodBuilder = new MethodMetadataBuilder(
getId(), Modifier.PUBLIC, LINESTRING_TO_STRING_METHOD,
CONVERTER_LINESTRING_STRING, parameterTypes, parameterNames,
bodyBuilder);
methodBuilder.setAnnotations(annotations);
methodBuilder.setThrowsTypes(throwsTypes);
return methodBuilder.build(); // Build and return a MethodMetadata
// instance
}
/**
* Gets <code>getStringToLineStringConverter</code> method. <br>
*
* @return
*/
private MethodMetadata getStringToLineStringConverterMethod() {
// Define method parameter types
List<AnnotatedJavaType> parameterTypes = new ArrayList<AnnotatedJavaType>();
// Check if a method with the same signature already exists in the
// target type
final MethodMetadata method = methodExists(STRING_TO_LINESTRING_METHOD,
parameterTypes);
if (method != null) {
// If it already exists, just return the method and omit its
// generation via the ITD
return method;
}
// Define method annotations
List<AnnotationMetadataBuilder> annotations = new ArrayList<AnnotationMetadataBuilder>();
// Define method throws types
List<JavaType> throwsTypes = new ArrayList<JavaType>();
// Define method parameter names
List<JavaSymbolName> parameterNames = new ArrayList<JavaSymbolName>();
// Create the method body
InvocableMemberBodyBuilder bodyBuilder = new InvocableMemberBodyBuilder();
buildGetStringToLineStringConverterMethodBody(bodyBuilder);
// Use the MethodMetadataBuilder for easy creation of MethodMetadata
MethodMetadataBuilder methodBuilder = new MethodMetadataBuilder(
getId(), Modifier.PUBLIC, STRING_TO_LINESTRING_METHOD,
CONVERTER_STRING_LINESTRING, parameterTypes, parameterNames,
bodyBuilder);
methodBuilder.setAnnotations(annotations);
methodBuilder.setThrowsTypes(throwsTypes);
return methodBuilder.build(); // Build and return a MethodMetadata
// instance
}
/**
* Gets <code>getPolygonToStringConverter</code> method. <br>
*
* @return
*/
private MethodMetadata getPolygonToStringConverterMethod() {
// Define method parameter types
List<AnnotatedJavaType> parameterTypes = new ArrayList<AnnotatedJavaType>();
// Check if a method with the same signature already exists in the
// target type
final MethodMetadata method = methodExists(POLYGON_TO_STRING_METHOD,
parameterTypes);
if (method != null) {
// If it already exists, just return the method and omit its
// generation via the ITD
return method;
}
// Define method annotations
List<AnnotationMetadataBuilder> annotations = new ArrayList<AnnotationMetadataBuilder>();
// Define method throws types
List<JavaType> throwsTypes = new ArrayList<JavaType>();
// Define method parameter names
List<JavaSymbolName> parameterNames = new ArrayList<JavaSymbolName>();
// Create the method body
InvocableMemberBodyBuilder bodyBuilder = new InvocableMemberBodyBuilder();
buildGetPolygonToStringConverterMethodBody(bodyBuilder);
// Use the MethodMetadataBuilder for easy creation of MethodMetadata
MethodMetadataBuilder methodBuilder = new MethodMetadataBuilder(
getId(), Modifier.PUBLIC, POLYGON_TO_STRING_METHOD,
CONVERTER_POLYGON_STRING, parameterTypes, parameterNames,
bodyBuilder);
methodBuilder.setAnnotations(annotations);
methodBuilder.setThrowsTypes(throwsTypes);
return methodBuilder.build(); // Build and return a MethodMetadata
// instance
}
/**
* Gets <code>getStringToPolygonConverter</code> method. <br>
*
* @return
*/
private MethodMetadata getStringToPolygonConverterMethod() {
// Define method parameter types
List<AnnotatedJavaType> parameterTypes = new ArrayList<AnnotatedJavaType>();
// Check if a method with the same signature already exists in the
// target type
final MethodMetadata method = methodExists(STRING_TO_POLYGON_METHOD,
parameterTypes);
if (method != null) {
// If it already exists, just return the method and omit its
// generation via the ITD
return method;
}
// Define method annotations
List<AnnotationMetadataBuilder> annotations = new ArrayList<AnnotationMetadataBuilder>();
// Define method throws types
List<JavaType> throwsTypes = new ArrayList<JavaType>();
// Define method parameter names
List<JavaSymbolName> parameterNames = new ArrayList<JavaSymbolName>();
// Create the method body
InvocableMemberBodyBuilder bodyBuilder = new InvocableMemberBodyBuilder();
buildGetStringToPolygonConverterMethodBody(bodyBuilder);
// Use the MethodMetadataBuilder for easy creation of MethodMetadata
MethodMetadataBuilder methodBuilder = new MethodMetadataBuilder(
getId(), Modifier.PUBLIC, STRING_TO_POLYGON_METHOD,
CONVERTER_STRING_POLYGON, parameterTypes, parameterNames,
bodyBuilder);
methodBuilder.setAnnotations(annotations);
methodBuilder.setThrowsTypes(throwsTypes);
return methodBuilder.build(); // Build and return a MethodMetadata
// instance
}
/**
* Gets <code>getGeometryToStringConverter</code> method. <br>
*
* @return
*/
private MethodMetadata getGeometryToStringConverterMethod() {
// Define method parameter types
List<AnnotatedJavaType> parameterTypes = new ArrayList<AnnotatedJavaType>();
// Check if a method with the same signature already exists in the
// target type
final MethodMetadata method = methodExists(GEOMETRY_TO_STRING_METHOD,
parameterTypes);
if (method != null) {
// If it already exists, just return the method and omit its
// generation via the ITD
return method;
}
// Define method annotations
List<AnnotationMetadataBuilder> annotations = new ArrayList<AnnotationMetadataBuilder>();
// Define method throws types
List<JavaType> throwsTypes = new ArrayList<JavaType>();
// Define method parameter names
List<JavaSymbolName> parameterNames = new ArrayList<JavaSymbolName>();
// Create the method body
InvocableMemberBodyBuilder bodyBuilder = new InvocableMemberBodyBuilder();
buildGetGeometryToStringConverterMethodBody(bodyBuilder);
// Use the MethodMetadataBuilder for easy creation of MethodMetadata
MethodMetadataBuilder methodBuilder = new MethodMetadataBuilder(
getId(), Modifier.PUBLIC, GEOMETRY_TO_STRING_METHOD,
CONVERTER_GEOMETRY_STRING, parameterTypes, parameterNames,
bodyBuilder);
methodBuilder.setAnnotations(annotations);
methodBuilder.setThrowsTypes(throwsTypes);
return methodBuilder.build(); // Build and return a MethodMetadata
// instance
}
/**
* Gets <code>getStringToGeometryConverter</code> method. <br>
*
* @return
*/
private MethodMetadata getStringToGeometryConverterMethod() {
// Define method parameter types
List<AnnotatedJavaType> parameterTypes = new ArrayList<AnnotatedJavaType>();
// Check if a method with the same signature already exists in the
// target type
final MethodMetadata method = methodExists(STRING_TO_GEOMETRY_METHOD,
parameterTypes);
if (method != null) {
// If it already exists, just return the method and omit its
// generation via the ITD
return method;
}
// Define method annotations
List<AnnotationMetadataBuilder> annotations = new ArrayList<AnnotationMetadataBuilder>();
// Define method throws types
List<JavaType> throwsTypes = new ArrayList<JavaType>();
// Define method parameter names
List<JavaSymbolName> parameterNames = new ArrayList<JavaSymbolName>();
// Create the method body
InvocableMemberBodyBuilder bodyBuilder = new InvocableMemberBodyBuilder();
buildGetStringToGeometryConverterMethodBody(bodyBuilder);
// Use the MethodMetadataBuilder for easy creation of MethodMetadata
MethodMetadataBuilder methodBuilder = new MethodMetadataBuilder(
getId(), Modifier.PUBLIC, STRING_TO_GEOMETRY_METHOD,
CONVERTER_STRING_GEOMETRY, parameterTypes, parameterNames,
bodyBuilder);
methodBuilder.setAnnotations(annotations);
methodBuilder.setThrowsTypes(throwsTypes);
return methodBuilder.build(); // Build and return a MethodMetadata
// instance
}
/**
* Gets <code>getMultiLineStringToStringConverter</code> method. <br>
*
* @return
*/
private MethodMetadata getMultiLineStringToStringConverterMethod() {
// Define method parameter types
List<AnnotatedJavaType> parameterTypes = new ArrayList<AnnotatedJavaType>();
// Check if a method with the same signature already exists in the
// target type
final MethodMetadata method = methodExists(MULTLINESTR_TO_STR_MET,
parameterTypes);
if (method != null) {
// If it already exists, just return the method and omit its
// generation via the ITD
return method;
}
// Define method annotations
List<AnnotationMetadataBuilder> annotations = new ArrayList<AnnotationMetadataBuilder>();
// Define method throws types
List<JavaType> throwsTypes = new ArrayList<JavaType>();
// Define method parameter names
List<JavaSymbolName> parameterNames = new ArrayList<JavaSymbolName>();
// Create the method body
InvocableMemberBodyBuilder bodyBuilder = new InvocableMemberBodyBuilder();
buildGetMultiLineStringToStringConverterMethodBody(bodyBuilder);
// Use the MethodMetadataBuilder for easy creation of MethodMetadata
MethodMetadataBuilder methodBuilder = new MethodMetadataBuilder(
getId(), Modifier.PUBLIC, MULTLINESTR_TO_STR_MET,
CONV_MULTSTR_STR, parameterTypes, parameterNames, bodyBuilder);
methodBuilder.setAnnotations(annotations);
methodBuilder.setThrowsTypes(throwsTypes);
return methodBuilder.build(); // Build and return a MethodMetadata
// instance
}
/**
* Gets <code>getStringToMultiLineStringConverter</code> method. <br>
*
* @return
*/
private MethodMetadata getStringToMultiLineStringConverterMethod() {
// Define method parameter types
List<AnnotatedJavaType> parameterTypes = new ArrayList<AnnotatedJavaType>();
// Check if a method with the same signature already exists in the
// target type
final MethodMetadata method = methodExists(STR_TO_MULTSTR_MET,
parameterTypes);
if (method != null) {
// If it already exists, just return the method and omit its
// generation via the ITD
return method;
}
// Define method annotations
List<AnnotationMetadataBuilder> annotations = new ArrayList<AnnotationMetadataBuilder>();
// Define method throws types
List<JavaType> throwsTypes = new ArrayList<JavaType>();
// Define method parameter names
List<JavaSymbolName> parameterNames = new ArrayList<JavaSymbolName>();
// Create the method body
InvocableMemberBodyBuilder bodyBuilder = new InvocableMemberBodyBuilder();
buildGetStringToMultiLineStringConverterMethodBody(bodyBuilder);
// Use the MethodMetadataBuilder for easy creation of MethodMetadata
MethodMetadataBuilder methodBuilder = new MethodMetadataBuilder(
getId(), Modifier.PUBLIC, STR_TO_MULTSTR_MET, CONV_STR_MULTSTR,
parameterTypes, parameterNames, bodyBuilder);
methodBuilder.setAnnotations(annotations);
methodBuilder.setThrowsTypes(throwsTypes);
return methodBuilder.build(); // Build and return a MethodMetadata
// instance
}
/**
* Builds body method for <code>getPointToStringConverter</code> method. <br>
*
* @param bodyBuilder
*/
private void buildGetPointToStringConverterMethodBody(
InvocableMemberBodyBuilder bodyBuilder) {
bodyBuilder.appendFormalLine(String.format(RET_JL_STRING,
helper.getFinalTypeName(CONVERTER_TYPE),
helper.getFinalTypeName(POINT_TYPE)));
bodyBuilder.indent();
bodyBuilder.appendFormalLine("public String convert(Point point) {");
bodyBuilder.indent();
bodyBuilder.appendFormalLine(String.format(
"return %s.toPoint(point.getCoordinate());",
helper.getFinalTypeName(WKTWRITER_TYPE)));
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("}");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("};");
}
/**
* Builds body method for <code>getStringToPointConverter</code> method. <br>
*
* @param bodyBuilder
*/
private void buildGetStringToPointConverterMethodBody(
InvocableMemberBodyBuilder bodyBuilder) {
bodyBuilder.appendFormalLine(String.format(RET_JL_STRING_S,
helper.getFinalTypeName(CONVERTER_TYPE),
helper.getFinalTypeName(POINT_TYPE)));
bodyBuilder.indent();
bodyBuilder.appendFormalLine("public Point convert(String str) {");
bodyBuilder.indent();
bodyBuilder.appendFormalLine(TRY_BR);
bodyBuilder.indent();
bodyBuilder.appendFormalLine("return (Point) reader.read(str);");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine(String.format(CATCH,
helper.getFinalTypeName(PARSE_EXCEPTION_TYPE)));
bodyBuilder.indent();
bodyBuilder.appendFormalLine(THROW_ILLEGAL_EX);
bodyBuilder.indent();
bodyBuilder
.appendFormalLine(" \"Invalid string for point: \".concat(str), e);");
bodyBuilder.indentRemove();
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("}");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("}");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("};");
// Reset indent
bodyBuilder.reset();
}
/**
* Builds body method for <code>getLineStringToStringConverter</code>
* method. <br>
*
* @param bodyBuilder
*/
private void buildGetLineStringToStringConverterMethodBody(
InvocableMemberBodyBuilder bodyBuilder) {
bodyBuilder.appendFormalLine(String.format(RET_JL_STRING,
helper.getFinalTypeName(CONVERTER_TYPE),
helper.getFinalTypeName(LINESTRING_TYPE)));
bodyBuilder.indent();
bodyBuilder
.appendFormalLine("public String convert(LineString lineString) {");
bodyBuilder.indent();
bodyBuilder.appendFormalLine(String.format(
"return %s.toLineString(lineString.getCoordinateSequence());",
helper.getFinalTypeName(WKTWRITER_TYPE)));
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("}");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("};");
}
/**
* Builds body method for <code>getStringToLineStringConverter</code>
* method. <br>
*
* @param bodyBuilder
*/
private void buildGetStringToLineStringConverterMethodBody(
InvocableMemberBodyBuilder bodyBuilder) {
bodyBuilder.appendFormalLine(String.format(RET_JL_STRING_S,
helper.getFinalTypeName(CONVERTER_TYPE),
helper.getFinalTypeName(LINESTRING_TYPE)));
bodyBuilder.indent();
bodyBuilder.appendFormalLine("public LineString convert(String str) {");
bodyBuilder.indent();
bodyBuilder.appendFormalLine(TRY_BR);
bodyBuilder.indent();
bodyBuilder.appendFormalLine("return (LineString) reader.read(str);");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine(String.format(CATCH,
helper.getFinalTypeName(PARSE_EXCEPTION_TYPE)));
bodyBuilder.indent();
bodyBuilder.appendFormalLine(THROW_ILLEGAL_EX);
bodyBuilder.indent();
bodyBuilder
.appendFormalLine(" \"Invalid string for LineString: \".concat(str), e);");
bodyBuilder.indentRemove();
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("}");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("}");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("};");
// Reset indent
bodyBuilder.reset();
}
/**
* Builds body method for <code>getPolygonToStringConverter</code> method. <br>
*
* @param bodyBuilder
*/
private void buildGetPolygonToStringConverterMethodBody(
InvocableMemberBodyBuilder bodyBuilder) {
bodyBuilder.appendFormalLine(String.format(RET_JL_STRING,
helper.getFinalTypeName(CONVERTER_TYPE),
helper.getFinalTypeName(POLYGON_TYPE)));
bodyBuilder.indent();
bodyBuilder
.appendFormalLine("public String convert(Polygon polygon) {");
bodyBuilder.indent();
bodyBuilder.appendFormalLine("return writer.writeFormatted(polygon);");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("}");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("};");
}
/**
* Builds body method for <code>getStringToPolygonConverter</code> method. <br>
*
* @param bodyBuilder
*/
private void buildGetStringToPolygonConverterMethodBody(
InvocableMemberBodyBuilder bodyBuilder) {
bodyBuilder.appendFormalLine(String.format(RET_JL_STRING_S,
helper.getFinalTypeName(CONVERTER_TYPE),
helper.getFinalTypeName(POLYGON_TYPE)));
bodyBuilder.indent();
bodyBuilder.appendFormalLine("public Polygon convert(String str) {");
bodyBuilder.indent();
bodyBuilder.appendFormalLine(TRY_BR);
bodyBuilder.indent();
bodyBuilder.appendFormalLine("return (Polygon) reader.read(str);");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine(String.format(CATCH,
helper.getFinalTypeName(PARSE_EXCEPTION_TYPE)));
bodyBuilder.indent();
bodyBuilder.appendFormalLine(THROW_ILLEGAL_EX);
bodyBuilder.indent();
bodyBuilder
.appendFormalLine(" \"Invalid string for Polygon: \".concat(str), e);");
bodyBuilder.indentRemove();
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("}");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("}");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("};");
// Reset indent
bodyBuilder.reset();
}
/**
* Builds body method for <code>getGeometryToStringConverter</code> method. <br>
*
* @param bodyBuilder
*/
private void buildGetGeometryToStringConverterMethodBody(
InvocableMemberBodyBuilder bodyBuilder) {
bodyBuilder.appendFormalLine(String.format(RET_JL_STRING,
helper.getFinalTypeName(CONVERTER_TYPE),
helper.getFinalTypeName(GEOMETRY_TYPE)));
bodyBuilder.indent();
bodyBuilder
.appendFormalLine("public String convert(Geometry geometry) {");
bodyBuilder.indent();
bodyBuilder.appendFormalLine("return writer.writeFormatted(geometry);");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("}");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("};");
}
/**
* Builds body method for <code>getStringToGeometryConverter</code> method. <br>
*
* @param bodyBuilder
*/
private void buildGetStringToGeometryConverterMethodBody(
InvocableMemberBodyBuilder bodyBuilder) {
bodyBuilder.appendFormalLine(String.format(RET_JL_STRING_S,
helper.getFinalTypeName(CONVERTER_TYPE),
helper.getFinalTypeName(GEOMETRY_TYPE)));
bodyBuilder.indent();
bodyBuilder.appendFormalLine("public Geometry convert(String str) {");
bodyBuilder.indent();
bodyBuilder.appendFormalLine(TRY_BR);
bodyBuilder.indent();
bodyBuilder.appendFormalLine("return reader.read(str);");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine(String.format(CATCH,
helper.getFinalTypeName(PARSE_EXCEPTION_TYPE)));
bodyBuilder.indent();
bodyBuilder.appendFormalLine(THROW_ILLEGAL_EX);
bodyBuilder.indent();
bodyBuilder
.appendFormalLine(" \"Invalid string for Geometry: \".concat(str), e);");
bodyBuilder.indentRemove();
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("}");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("}");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("};");
// Reset indent
bodyBuilder.reset();
}
/**
* Builds body method for <code>getMultiLineStringToStringConverter</code>
* method. <br>
*
* @param bodyBuilder
*/
private void buildGetMultiLineStringToStringConverterMethodBody(
InvocableMemberBodyBuilder bodyBuilder) {
bodyBuilder.appendFormalLine(String.format(RET_JL_STRING,
helper.getFinalTypeName(CONVERTER_TYPE),
helper.getFinalTypeName(MULTILINESTRING_TYPE)));
bodyBuilder.indent();
bodyBuilder
.appendFormalLine("public String convert(MultiLineString multiLineString) {");
bodyBuilder.indent();
bodyBuilder
.appendFormalLine("return writer.writeFormatted(multiLineString);");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("}");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("};");
}
/**
* Builds body method for <code>getStringToMultiLineStringConverter</code>
* method. <br>
*
* @param bodyBuilder
*/
private void buildGetStringToMultiLineStringConverterMethodBody(
InvocableMemberBodyBuilder bodyBuilder) {
bodyBuilder.appendFormalLine(String.format(RET_JL_STRING_S,
helper.getFinalTypeName(CONVERTER_TYPE),
helper.getFinalTypeName(MULTILINESTRING_TYPE)));
bodyBuilder.indent();
bodyBuilder
.appendFormalLine("public MultiLineString convert(String str) {");
bodyBuilder.indent();
bodyBuilder.appendFormalLine(TRY_BR);
bodyBuilder.indent();
bodyBuilder
.appendFormalLine("return (MultiLineString) reader.read(str);");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine(String.format(CATCH,
helper.getFinalTypeName(PARSE_EXCEPTION_TYPE)));
bodyBuilder.indent();
bodyBuilder.appendFormalLine(THROW_ILLEGAL_EX);
bodyBuilder.indent();
bodyBuilder
.appendFormalLine(" \"Invalid string for MultiLineString: \".concat(str), e);");
bodyBuilder.indentRemove();
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("}");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("}");
bodyBuilder.indentRemove();
bodyBuilder.appendFormalLine("};");
// Reset indent
bodyBuilder.reset();
}
/**
* Builds body method for <code>afterPropertySet</code> method. <br>
*
* @param bodyBuilder
*/
private void buildAfterPropertiesSetMethodBody(
InvocableMemberBodyBuilder bodyBuilder) {
bodyBuilder.appendFormalLine("super.afterPropertiesSet();");
bodyBuilder.appendFormalLine("installLabelConverters(getObject());");
bodyBuilder.appendFormalLine("installGeoLabelConverters(getObject());");
}
/**
* Builds body method for <code>installGeoLabelsConverters</code> method. <br>
*
* @param bodyBuilder
*/
private void buildInstallGeoLabelsConvertersMethodBody(
InvocableMemberBodyBuilder bodyBuilder) {
// Adding all methods added bellow
bodyBuilder
.appendFormalLine("registry.addConverter(getPointToStringConverter());");
bodyBuilder
.appendFormalLine("registry.addConverter(getStringToPointConverter());");
bodyBuilder
.appendFormalLine("registry.addConverter(getLineStringToStringConverter());");
bodyBuilder
.appendFormalLine("registry.addConverter(getStringToLineStringConverter());");
bodyBuilder
.appendFormalLine("registry.addConverter(getPolygonToStringConverter());");
bodyBuilder
.appendFormalLine("registry.addConverter(getStringToPolygonConverter());");
bodyBuilder
.appendFormalLine("registry.addConverter(getGeometryToStringConverter());");
bodyBuilder
.appendFormalLine("registry.addConverter(getStringToGeometryConverter());");
bodyBuilder
.appendFormalLine("registry.addConverter(getMultiLineStringToStringConverter());");
bodyBuilder
.appendFormalLine("registry.addConverter(getStringToMultiLineStringConverter());");
}
public String toString() {
final ToStringBuilder builder = new ToStringBuilder(this);
builder.append("identifier", getId());
builder.append("valid", valid);
builder.append("aspectName", aspectName);
builder.append("destinationType", destination);
builder.append("governor", governorPhysicalTypeMetadata.getId());
builder.append("itdTypeDetails", itdTypeDetails);
return builder.toString();
}
private MethodMetadata methodExists(JavaSymbolName methodName,
List<AnnotatedJavaType> paramTypes) {
return MemberFindingUtils.getDeclaredMethod(governorTypeDetails,
methodName,
AnnotatedJavaType.convertFromAnnotatedJavaTypes(paramTypes));
}
/**
* Create metadata for a field definition.
*
* @return a FieldMetadata object
*/
private FieldMetadata getField(String name, String value,
JavaType javaType, int modifier,
List<AnnotationMetadataBuilder> annotations) {
JavaSymbolName curName = new JavaSymbolName(name);
String initializer = value;
FieldMetadata field = getOrCreateField(curName, javaType, initializer,
modifier, annotations);
return field;
}
public static final JavaType getJavaType(String metadataIdentificationString) {
return PhysicalTypeIdentifierNamingUtils.getJavaType(
PROVIDES_TYPE_STRING, metadataIdentificationString);
}
public static final LogicalPath getPath(String metadataIdentificationString) {
return PhysicalTypeIdentifierNamingUtils.getPath(PROVIDES_TYPE_STRING,
metadataIdentificationString);
}
public static final String getMetadataIdentiferType() {
return PROVIDES_TYPE;
}
public static final String createIdentifier(JavaType javaType,
LogicalPath path) {
return PhysicalTypeIdentifierNamingUtils.createIdentifier(
PROVIDES_TYPE_STRING, javaType, path);
}
/**
* Gets or creates a field based on parameters.<br>
* First try to get a suitable field (by name and type). If not found create
* a new one (adding a counter to name if it's needed)
*
* @param fielName
* @param fieldType
* @param initializer (String representation)
* @param modifier See {@link Modifier}
* @param annotations optional (can be null)
* @return
*/
private FieldMetadata getOrCreateField(JavaSymbolName fielName,
JavaType fieldType, String initializer, int modifier,
List<AnnotationMetadataBuilder> annotations) {
JavaSymbolName curName = fielName;
// Check if field exist
FieldMetadata currentField = governorTypeDetails
.getDeclaredField(curName);
if (currentField != null) {
if (!currentField.getFieldType().equals(fieldType)) {
// No compatible field: look for new name
currentField = null;
JavaSymbolName newName = curName;
int i = 1;
while (governorTypeDetails.getDeclaredField(newName) != null) {
newName = new JavaSymbolName(curName.getSymbolName()
.concat(StringUtils.repeat('_', i)));
i++;
}
curName = newName;
}
}
if (currentField == null) {
// create field
if (annotations == null) {
annotations = new ArrayList<AnnotationMetadataBuilder>(0);
}
// Using the FieldMetadataBuilder to create the field
// definition.
final FieldMetadataBuilder fieldBuilder = new FieldMetadataBuilder(
getId(), modifier, annotations, curName, // Field
fieldType); // Field type
fieldBuilder.setFieldInitializer(initializer);
currentField = fieldBuilder.build(); // Build and return a
// FieldMetadata
// instance
}
return currentField;
}
}