use of org.springframework.roo.classpath.details.annotations.ClassAttributeValue in project spring-roo by spring-projects.
the class WsOperationsImpl method addSEI.
@Override
public void addSEI(JavaType service, JavaType sei, JavaType endpointClass, JavaType configClass, String profile, boolean force) {
Validate.notNull(service, "ERROR: Provide a valid service");
Validate.notNull(sei, "ERROR: Provide a valid sei");
// Check if provided service exists
ClassOrInterfaceTypeDetails serviceTypeDetails = getTypeLocationService().getTypeDetails(service);
Validate.notNull(serviceTypeDetails, "ERROR: Provide an existing service");
// Check if provided service is annotated with @RooService
AnnotationMetadata serviceAnnotation = serviceTypeDetails.getAnnotation(RooJavaType.ROO_SERVICE);
Validate.notNull(serviceAnnotation, "ERROR: Provide a valid service annotated with @RooService");
// Check if provided service has a related entity
AnnotationAttributeValue<JavaType> entityAttr = serviceAnnotation.getAttribute("entity");
Validate.notNull(entityAttr, "ERROR: The provided service is annotated with @RooService but doesn't " + "contains the 'entity' attribute");
JavaType relatedEntity = entityAttr.getValue();
Validate.notNull(relatedEntity, "ERROR: The provided service is annotated with @RooService but doesn't " + "contains a valid entity in the 'entity' attribute");
// Check if provided SEI is located in an application module
if (!isLocatedInApplicationModule(sei) && !force) {
LOGGER.log(Level.INFO, "ERROR: The provided SEI is not located in an application module.");
return;
}
// Check if the configClass is located in an application module
if (configClass != null && !isLocatedInApplicationModule(configClass) && !force) {
LOGGER.log(Level.INFO, "ERROR: The provided config class is not located in an application module.");
return;
}
// new one inside the provided SEI module using the provided SEI name and 'Endpoint' suffix.
if (endpointClass == null) {
endpointClass = new JavaType(String.format("%sEndpoint", sei.getFullyQualifiedTypeName()), sei.getModule());
}
// new one inside the provided SEI module using the provided SEI name and 'Configuration' suffix
if (configClass == null) {
configClass = new JavaType(String.format("%sConfiguration", sei.getFullyQualifiedTypeName()), sei.getModule());
}
// Check if provided configClass exists or should be generated
boolean isNewConfigClass = false;
ClassOrInterfaceTypeDetails configClassDetails = getTypeLocationService().getTypeDetails(configClass);
if (configClassDetails == null) {
isNewConfigClass = true;
}
// If it have it, it should match with the provided one the provided one
if (!isNewConfigClass) {
MemberDetails configClassMemberDetails = getMemberDetailsScanner().getMemberDetails(getClass().getName(), configClassDetails);
AnnotationMetadata configurationAnnotation = configClassMemberDetails.getAnnotation(SpringJavaType.CONFIGURATION);
if (configurationAnnotation == null) {
LOGGER.log(Level.INFO, "ERROR: The provided class is not annotated with @Configuration so is not possible to include Web Service client configuration on it." + "Specify other configuration class that contains @Configuration annotation or specify a not existing class to generate it.");
return;
}
if (StringUtils.isNotEmpty(profile)) {
AnnotationMetadata profileAnnotation = configClassMemberDetails.getAnnotation(SpringJavaType.PROFILE);
if (profileAnnotation != null) {
String profiles = (String) profileAnnotation.getAttribute("value").getValue();
String[] definedProfiles = profiles.split(",");
boolean profileExists = false;
for (String definedProfile : definedProfiles) {
if (definedProfile.equals(profile)) {
profileExists = true;
}
}
if (!profileExists) {
LOGGER.log(Level.INFO, "ERROR: The provided configuration class doesn't work in the provided profile. " + "Use a different configuration class or use a different profile.");
return;
}
}
}
}
// Check if some the provided classes that should be generated already exists
if (getTypeLocationService().getTypeDetails(sei) != null) {
LOGGER.log(Level.INFO, "ERROR: The provided SEI already exists. Specify a different one using" + " --sei parameter.");
return;
}
if (getTypeLocationService().getTypeDetails(endpointClass) != null) {
LOGGER.log(Level.INFO, "ERROR: The provided Endpoint class already exists. Specify a different one using" + " --class parameter.");
return;
}
// Include necessary dependencies
includeDependenciesAndPluginsForSei(sei.getModule());
// Include the necessary properties using the provided profile
getApplicationConfigService().addProperty(sei.getModule(), "cxf.path", "/services", profile, true);
getApplicationConfigService().addProperty(sei.getModule(), "cxf.servlet.load-on-startup", "-1", profile, true);
// Generate the new SEI
final String seiIdentifier = getPathResolver().getCanonicalPath(sei.getModule(), Path.SRC_MAIN_JAVA, sei);
final String midSEI = PhysicalTypeIdentifier.createIdentifier(sei, getPathResolver().getPath(seiIdentifier));
ClassOrInterfaceTypeDetailsBuilder cidBuilderSEI = new ClassOrInterfaceTypeDetailsBuilder(midSEI, Modifier.PUBLIC, sei, PhysicalTypeCategory.INTERFACE);
// Create new @RooWsEndpoint annotation
AnnotationMetadataBuilder seiAnnotation = new AnnotationMetadataBuilder(new JavaType(RooSei.class));
// Including service parameter to @RooSei annotation
seiAnnotation.addClassAttribute("service", service);
// Include new @RooSei annotation
cidBuilderSEI.addAnnotation(seiAnnotation);
// Write SEI class on disk
getTypeManagementService().createOrUpdateTypeOnDisk(cidBuilderSEI.build());
// Generate the new Endpoint
final String endpointIdentifier = getPathResolver().getCanonicalPath(endpointClass.getModule(), Path.SRC_MAIN_JAVA, endpointClass);
final String midEndpoint = PhysicalTypeIdentifier.createIdentifier(endpointClass, getPathResolver().getPath(endpointIdentifier));
ClassOrInterfaceTypeDetailsBuilder cidBuilderEndpoint = new ClassOrInterfaceTypeDetailsBuilder(midEndpoint, Modifier.PUBLIC, endpointClass, PhysicalTypeCategory.CLASS);
// Create new @RooSeiImpl annotation
AnnotationMetadataBuilder endpointAnnotation = new AnnotationMetadataBuilder(new JavaType(RooSeiImpl.class));
// Include sei parameter to @RooSeiImpl annotation
endpointAnnotation.addClassAttribute("sei", sei);
// Include new @RooSeiImpl annotation
cidBuilderEndpoint.addAnnotation(endpointAnnotation);
// Include implements
cidBuilderEndpoint.addImplementsType(sei);
// Write endpoint class on disk
getTypeManagementService().createOrUpdateTypeOnDisk(cidBuilderEndpoint.build());
// If configuration class exists, check if is already annotated and update it.
// If not exists, create a new one
ClassOrInterfaceTypeDetailsBuilder cidBuilderConfig = null;
if (!isNewConfigClass) {
// Obtain builder from the existing class
cidBuilderConfig = new ClassOrInterfaceTypeDetailsBuilder(configClassDetails);
// Check if already have @RooWsEndpoints annotation
AnnotationMetadataBuilder wsEndpointsAnnotation = cidBuilderConfig.getDeclaredTypeAnnotation(RooJavaType.ROO_WS_ENDPOINTS);
if (wsEndpointsAnnotation != null) {
// Update the existing one
AnnotationAttributeValue<?> existingEndPoints = wsEndpointsAnnotation.build().getAttribute("endpoints");
List<?> values = (List<?>) existingEndPoints.getValue();
if (values != null) {
// Check if the provided endpoint exists yet in this config class
Iterator<?> it = values.iterator();
boolean alreadyManaged = false;
while (it.hasNext()) {
ClassAttributeValue existingEndPointAttr = (ClassAttributeValue) it.next();
JavaType existingEndPoint = existingEndPointAttr.getValue();
if (existingEndPoint.getFullyQualifiedTypeName().equals(endpointClass.getFullyQualifiedTypeName())) {
alreadyManaged = true;
}
}
// If endpoint already exists, show an error indicating that this endpoint is already managed
if (alreadyManaged) {
LOGGER.log(Level.INFO, "ERROR: The provided endpoint is already defined in the provided configuration class. " + "Specify some different configuration class.");
return;
} else {
// Update existing annotation with the new endPoint
Iterator<?> iterator = values.iterator();
List<AnnotationAttributeValue<?>> endpoints = new ArrayList<AnnotationAttributeValue<?>>();
while (iterator.hasNext()) {
ClassAttributeValue existingEndPoint = (ClassAttributeValue) iterator.next();
endpoints.add(existingEndPoint);
}
// Create @RooWsEndpoints annotation
ClassAttributeValue newEndpoint = new ClassAttributeValue(new JavaSymbolName("value"), endpointClass);
endpoints.add(newEndpoint);
ArrayAttributeValue<AnnotationAttributeValue<?>> newEndpoints = new ArrayAttributeValue<AnnotationAttributeValue<?>>(new JavaSymbolName("endpoints"), endpoints);
wsEndpointsAnnotation.addAttribute(newEndpoints);
}
}
} else {
// If not exists, add it with the new elements
wsEndpointsAnnotation = new AnnotationMetadataBuilder(new JavaType(RooWsEndpoints.class));
// Generate new list of endpoints
List<AnnotationAttributeValue<?>> endpoints = new ArrayList<AnnotationAttributeValue<?>>();
ClassAttributeValue newEndpoint = new ClassAttributeValue(new JavaSymbolName("value"), endpointClass);
endpoints.add(newEndpoint);
ArrayAttributeValue<AnnotationAttributeValue<?>> newEndpoints = new ArrayAttributeValue<AnnotationAttributeValue<?>>(new JavaSymbolName("endpoints"), endpoints);
wsEndpointsAnnotation.addAttribute(newEndpoints);
// Check if is necessary to include profile attribute
if (StringUtils.isNotEmpty(profile)) {
wsEndpointsAnnotation.addStringAttribute("profile", profile);
}
// Include new @RooWsEndpoints annotation
cidBuilderConfig.addAnnotation(wsEndpointsAnnotation);
}
} else {
// Create the specified configuration class and annotate it with necessary information
final String configClassIdentifier = getPathResolver().getCanonicalPath(configClass.getModule(), Path.SRC_MAIN_JAVA, configClass);
final String mid = PhysicalTypeIdentifier.createIdentifier(configClass, getPathResolver().getPath(configClassIdentifier));
cidBuilderConfig = new ClassOrInterfaceTypeDetailsBuilder(mid, Modifier.PUBLIC, configClass, PhysicalTypeCategory.CLASS);
// Create new @RooWsEndpoints annotation and include the new endpoint
// as endpoints attribute
List<AnnotationAttributeValue<?>> endpoints = new ArrayList<AnnotationAttributeValue<?>>();
ClassAttributeValue endPointAttributeValue = new ClassAttributeValue(new JavaSymbolName("value"), endpointClass);
endpoints.add(endPointAttributeValue);
ArrayAttributeValue<AnnotationAttributeValue<?>> newEndpoints = new ArrayAttributeValue<AnnotationAttributeValue<?>>(new JavaSymbolName("endpoints"), endpoints);
AnnotationMetadataBuilder wsEndpointsAnnotation = new AnnotationMetadataBuilder(new JavaType(RooWsEndpoints.class));
wsEndpointsAnnotation.addAttribute(newEndpoints);
// Include new @RooWsEndpoints annotation
cidBuilderConfig.addAnnotation(wsEndpointsAnnotation);
// doesn't exists yet, because we're generating a new @Configuration class
if (StringUtils.isNotEmpty(profile)) {
wsEndpointsAnnotation.addStringAttribute("profile", profile);
}
}
// Write config class on disk
getTypeManagementService().createOrUpdateTypeOnDisk(cidBuilderConfig.build());
// After create the SEI and the Endpoint, is necessary to annotate related entity with
// some JAX-B annotations if has not been annotated before
/*ClassOrInterfaceTypeDetails entityDetails =
getTypeLocationService().getTypeDetails(relatedEntity);
if (entityDetails != null) {
// Annotate the entity with @RooJaxbEntity. If this entity has a super class or that
// super class has another super class, etc. is necessary to annotate it too.
annotateClassIfNeeded(entityDetails);
// Also, is necessary to annotate @OneToMany, @ManyToOne and @ManyToMany fields detected in
// this class and in the super classes.
annotateRelatedFieldsIfNeeded(entityDetails);
}*/
// Provisional changes to annotate all entities
Set<ClassOrInterfaceTypeDetails> allEntities = getTypeLocationService().findClassesOrInterfaceDetailsWithAnnotation(RooJavaType.ROO_JPA_ENTITY);
for (ClassOrInterfaceTypeDetails entity : allEntities) {
// Annotate the entity with @RooJaxbEntity. If this entity has a super class or that
// super class has another super class, etc. is necessary to annotate it too.
annotateClassIfNeeded(entity);
// Also, is necessary to annotate @OneToMany, @ManyToOne and @ManyToMany fields detected in
// this class and in the super classes.
annotateRelatedFieldsIfNeeded(entity);
}
}
use of org.springframework.roo.classpath.details.annotations.ClassAttributeValue in project spring-roo by spring-projects.
the class ControllerOperationsImpl method getRooControllerAnnotation.
/**
* Method that returns @RooController annotation
*
* @param entity
* Entity over which create the controller
* @param pathPrefix
* Prefix to use in RequestMapping
* @param controllerType
* Indicates the controller type
* @return
*/
private AnnotationMetadataBuilder getRooControllerAnnotation(final JavaType entity, final String pathPrefix, final ControllerType controllerType) {
final List<AnnotationAttributeValue<?>> rooControllerAttributes = new ArrayList<AnnotationAttributeValue<?>>();
rooControllerAttributes.add(new ClassAttributeValue(new JavaSymbolName("entity"), entity));
if (StringUtils.isNotEmpty(pathPrefix)) {
rooControllerAttributes.add(new StringAttributeValue(new JavaSymbolName("pathPrefix"), pathPrefix));
}
rooControllerAttributes.add(new EnumAttributeValue(new JavaSymbolName("type"), new EnumDetails(RooJavaType.ROO_ENUM_CONTROLLER_TYPE, new JavaSymbolName(controllerType.name()))));
return new AnnotationMetadataBuilder(RooJavaType.ROO_CONTROLLER, rooControllerAttributes);
}
use of org.springframework.roo.classpath.details.annotations.ClassAttributeValue in project spring-roo by spring-projects.
the class ControllerOperationsImpl method createLinkFactoryClass.
/**
* Creates a new class which supports its associated controller building
* URL's for its methods
*
* @param controller
* the JavaType of the associated controller
*/
@Override
public void createLinkFactoryClass(JavaType controller) {
// Create name
String name = controller.getSimpleTypeName().concat("LinkFactory");
if (name.contains("Controller")) {
name = name.replace("Controller", "");
}
// Create type
final JavaType linkFactoryJavaType = new JavaType(controller.getPackage().getFullyQualifiedPackageName().concat(".").concat(name), controller.getModule());
// Create identifier
final String linkFactoryPathIdentifier = getPathResolver().getCanonicalPath(linkFactoryJavaType.getModule(), Path.SRC_MAIN_JAVA, linkFactoryJavaType);
final String mid = PhysicalTypeIdentifier.createIdentifier(linkFactoryJavaType, getPathResolver().getPath(linkFactoryPathIdentifier));
// Create builder
final ClassOrInterfaceTypeDetailsBuilder typeBuilder = new ClassOrInterfaceTypeDetailsBuilder(mid, PUBLIC, linkFactoryJavaType, PhysicalTypeCategory.CLASS);
// Add @RooLinkFactory annotation
AnnotationMetadataBuilder annotationBuilder = new AnnotationMetadataBuilder(RooJavaType.ROO_LINK_FACTORY);
annotationBuilder.addAttribute(new ClassAttributeValue(new JavaSymbolName("controller"), controller));
typeBuilder.addAnnotation(annotationBuilder);
// Write changes to disk
getTypeManagementService().createOrUpdateTypeOnDisk(typeBuilder.build());
}
use of org.springframework.roo.classpath.details.annotations.ClassAttributeValue in project spring-roo by spring-projects.
the class RepositoryJpaOperationsImpl method addRepositoryCustom.
/**
* Method that generates RepositoryCustom interface and its implementation
* for an specific entity
*
* @param domainType
* @param repositoryType
* @param repositoryPackage
* @param defaultReturnType
*
* @return JavaType with new RepositoryCustom interface.
*/
private JavaType addRepositoryCustom(JavaType domainType, JavaType repositoryType, JavaPackage repositoryPackage) {
// Getting RepositoryCustom interface JavaTYpe
JavaType interfaceType = new JavaType(repositoryPackage.getFullyQualifiedPackageName().concat(".").concat(repositoryType.getSimpleTypeName()).concat("Custom"), repositoryType.getModule());
// Check if new interface exists yet
final String interfaceIdentifier = getPathResolver().getCanonicalPath(interfaceType.getModule(), Path.SRC_MAIN_JAVA, interfaceType);
if (getFileManager().exists(interfaceIdentifier)) {
// Type already exists - return
return interfaceType;
}
final String interfaceMdId = PhysicalTypeIdentifier.createIdentifier(interfaceType, getPathResolver().getPath(interfaceIdentifier));
final ClassOrInterfaceTypeDetailsBuilder interfaceBuilder = new ClassOrInterfaceTypeDetailsBuilder(interfaceMdId, Modifier.PUBLIC, interfaceType, PhysicalTypeCategory.INTERFACE);
// Generates @RooJpaRepositoryCustom annotation with referenced entity value
final AnnotationMetadataBuilder repositoryCustomAnnotationMetadata = new AnnotationMetadataBuilder(RooJavaType.ROO_REPOSITORY_JPA_CUSTOM);
repositoryCustomAnnotationMetadata.addAttribute(new ClassAttributeValue(new JavaSymbolName("entity"), domainType));
interfaceBuilder.addAnnotation(repositoryCustomAnnotationMetadata);
// Save RepositoryCustom interface and its implementation on disk
getTypeManagementService().createOrUpdateTypeOnDisk(interfaceBuilder.build());
generateRepositoryCustomImpl(interfaceType, repositoryType, domainType);
return interfaceType;
}
use of org.springframework.roo.classpath.details.annotations.ClassAttributeValue in project spring-roo by spring-projects.
the class RepositoryJpaIntegrationTestMetadata method getImportAnnotation.
/**
* Builds and returns `@Import` annotation
*
* @return {@link AnnotationMetadataBuilder}
*/
private AnnotationMetadataBuilder getImportAnnotation() {
AnnotationMetadataBuilder annotationBuilder = new AnnotationMetadataBuilder(SpringJavaType.ANNOTATION_IMPORT);
// Create List of ClassAttributeValue
List<ClassAttributeValue> typesToImport = new ArrayList<ClassAttributeValue>();
typesToImport.add(new ClassAttributeValue(new JavaSymbolName("value"), this.annotationValues.getDodConfigurationClass()));
typesToImport.add(new ClassAttributeValue(new JavaSymbolName("value"), this.jpaDetachableRepositoryClass));
// Convert List to ArrayAttributeValue
ArrayAttributeValue<ClassAttributeValue> importAttr = new ArrayAttributeValue<ClassAttributeValue>(new JavaSymbolName("value"), typesToImport);
// Add annotation attribute
annotationBuilder.addAttribute(importAttr);
return annotationBuilder;
}
Aggregations