Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in / Register
Toggle navigation
S
spring-boot
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
DEMO
spring-boot
Commits
f8af6c81
Commit
f8af6c81
authored
Jan 17, 2018
by
Stephane Nicoll
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '1.5.x'
parents
ffc99b03
d8b1f169
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
215 additions
and
35 deletions
+215
-35
TypeUtils.java
...pringframework/boot/configurationprocessor/TypeUtils.java
+65
-35
pom.xml
spring-boot-tests/spring-boot-integration-tests/pom.xml
+1
-0
pom.xml
...n-tests/spring-boot-configuration-processor-tests/pom.xml
+42
-0
AnnotatedSample.java
...ssor-tests/src/main/java/com/example/AnnotatedSample.java
+45
-0
ConfigurationProcessorIntegrationTests.java
...ocessor/tests/ConfigurationProcessorIntegrationTests.java
+62
-0
No files found.
spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeUtils.java
View file @
f8af6c81
...
...
@@ -25,8 +25,10 @@ import javax.annotation.processing.ProcessingEnvironment;
import
javax.lang.model.element.Element
;
import
javax.lang.model.element.TypeElement
;
import
javax.lang.model.type.DeclaredType
;
import
javax.lang.model.type.PrimitiveType
;
import
javax.lang.model.type.TypeKind
;
import
javax.lang.model.type.TypeMirror
;
import
javax.lang.model.util.SimpleTypeVisitor8
;
import
javax.lang.model.util.Types
;
/**
...
...
@@ -65,6 +67,8 @@ class TypeUtils {
private
final
ProcessingEnvironment
env
;
private
final
TypeExtractor
typeExtractor
;
private
final
TypeMirror
collectionType
;
private
final
TypeMirror
mapType
;
...
...
@@ -72,6 +76,7 @@ class TypeUtils {
TypeUtils
(
ProcessingEnvironment
env
)
{
this
.
env
=
env
;
Types
types
=
env
.
getTypeUtils
();
this
.
typeExtractor
=
new
TypeExtractor
(
types
);
this
.
collectionType
=
getDeclaredType
(
types
,
Collection
.
class
,
1
);
this
.
mapType
=
getDeclaredType
(
types
,
Map
.
class
,
2
);
}
...
...
@@ -100,20 +105,7 @@ class TypeUtils {
* {@link Class#forName(String)}
*/
public
String
getQualifiedName
(
Element
element
)
{
if
(
element
==
null
)
{
return
null
;
}
TypeElement
enclosingElement
=
getEnclosingTypeElement
(
element
.
asType
());
if
(
enclosingElement
!=
null
)
{
return
getQualifiedName
(
enclosingElement
)
+
"$"
+
((
DeclaredType
)
element
.
asType
()).
asElement
().
getSimpleName
()
.
toString
();
}
if
(
element
instanceof
TypeElement
)
{
return
((
TypeElement
)
element
).
getQualifiedName
().
toString
();
}
throw
new
IllegalStateException
(
"Could not extract qualified name from "
+
element
);
return
this
.
typeExtractor
.
getQualifiedName
(
element
);
}
/**
...
...
@@ -126,27 +118,7 @@ class TypeUtils {
if
(
type
==
null
)
{
return
null
;
}
Class
<?>
wrapper
=
getWrapperFor
(
type
);
if
(
wrapper
!=
null
)
{
return
wrapper
.
getName
();
}
TypeElement
enclosingElement
=
getEnclosingTypeElement
(
type
);
if
(
enclosingElement
!=
null
)
{
return
getQualifiedName
(
enclosingElement
)
+
"$"
+
((
DeclaredType
)
type
).
asElement
().
getSimpleName
().
toString
();
}
return
type
.
toString
();
}
private
TypeElement
getEnclosingTypeElement
(
TypeMirror
type
)
{
if
(
type
instanceof
DeclaredType
)
{
DeclaredType
declaredType
=
(
DeclaredType
)
type
;
Element
enclosingElement
=
declaredType
.
asElement
().
getEnclosingElement
();
if
(
enclosingElement
!=
null
&&
enclosingElement
instanceof
TypeElement
)
{
return
(
TypeElement
)
enclosingElement
;
}
}
return
null
;
return
type
.
accept
(
this
.
typeExtractor
,
null
);
}
public
boolean
isCollectionOrMap
(
TypeMirror
type
)
{
...
...
@@ -194,4 +166,62 @@ class TypeUtils {
return
WRAPPER_TO_PRIMITIVE
.
get
(
type
.
toString
());
}
/**
* A visitor that extracts the full qualified name of a type, including generic
* information.
*/
private
static
class
TypeExtractor
extends
SimpleTypeVisitor8
<
String
,
Void
>
{
private
final
Types
types
;
TypeExtractor
(
Types
types
)
{
this
.
types
=
types
;
}
@Override
public
String
visitDeclared
(
DeclaredType
type
,
Void
none
)
{
TypeElement
enclosingElement
=
getEnclosingTypeElement
(
type
);
if
(
enclosingElement
!=
null
)
{
return
getQualifiedName
(
enclosingElement
)
+
"$"
+
type
.
asElement
().
getSimpleName
().
toString
();
}
return
type
.
toString
();
}
@Override
public
String
visitPrimitive
(
PrimitiveType
t
,
Void
none
)
{
return
this
.
types
.
boxedClass
(
t
).
getQualifiedName
().
toString
();
}
public
String
getQualifiedName
(
Element
element
)
{
if
(
element
==
null
)
{
return
null
;
}
TypeElement
enclosingElement
=
getEnclosingTypeElement
(
element
.
asType
());
if
(
enclosingElement
!=
null
)
{
return
getQualifiedName
(
enclosingElement
)
+
"$"
+
((
DeclaredType
)
element
.
asType
()).
asElement
().
getSimpleName
()
.
toString
();
}
if
(
element
instanceof
TypeElement
)
{
return
((
TypeElement
)
element
).
getQualifiedName
().
toString
();
}
throw
new
IllegalStateException
(
"Could not extract qualified name from "
+
element
);
}
private
TypeElement
getEnclosingTypeElement
(
TypeMirror
type
)
{
if
(
type
instanceof
DeclaredType
)
{
DeclaredType
declaredType
=
(
DeclaredType
)
type
;
Element
enclosingElement
=
declaredType
.
asElement
().
getEnclosingElement
();
if
(
enclosingElement
!=
null
&&
enclosingElement
instanceof
TypeElement
)
{
return
(
TypeElement
)
enclosingElement
;
}
}
return
null
;
}
}
}
spring-boot-tests/spring-boot-integration-tests/pom.xml
View file @
f8af6c81
...
...
@@ -16,6 +16,7 @@
<java.version>
1.8
</java.version>
</properties>
<modules>
<module>
spring-boot-configuration-processor-tests
</module>
<module>
spring-boot-devtools-tests
</module>
<module>
spring-boot-server-tests
</module>
<module>
spring-boot-launch-script-tests
</module>
...
...
spring-boot-tests/spring-boot-integration-tests/spring-boot-configuration-processor-tests/pom.xml
0 → 100644
View file @
f8af6c81
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<parent>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-integration-tests
</artifactId>
<version>
${revision}
</version>
</parent>
<artifactId>
spring-boot-configuration-processor-tests
</artifactId>
<name>
Spring Boot Configuration Processor Tests
</name>
<description>
${project.name}
</description>
<properties>
<main.basedir>
${basedir}/../../..
</main.basedir>
</properties>
<dependencies>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-configuration-metadata
</artifactId>
</dependency>
<dependency>
<groupId>
javax.validation
</groupId>
<artifactId>
validation-api
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-configuration-processor
</artifactId>
<optional>
true
</optional>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-test
</artifactId>
<scope>
test
</scope>
</dependency>
</dependencies>
</project>
spring-boot-tests/spring-boot-integration-tests/spring-boot-configuration-processor-tests/src/main/java/com/example/AnnotatedSample.java
0 → 100644
View file @
f8af6c81
/*
* Copyright 2012-2018 the original author or authors.
*
* 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
.
example
;
import
javax.validation.Valid
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
/**
* Test that a valid type is generated if an annotation is present.
*
* @author Stephane Nicoll
*/
@ConfigurationProperties
(
"annotated"
)
public
class
AnnotatedSample
{
/**
* A valid name.
*/
private
String
name
;
@Valid
public
String
getName
()
{
return
this
.
name
;
}
public
void
setName
(
String
name
)
{
this
.
name
=
name
;
}
}
spring-boot-tests/spring-boot-integration-tests/spring-boot-configuration-processor-tests/src/test/java/org/springframework/boot/configurationprocessor/tests/ConfigurationProcessorIntegrationTests.java
0 → 100644
View file @
f8af6c81
/*
* Copyright 2012-2018 the original author or authors.
*
* 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
org
.
springframework
.
boot
.
configurationprocessor
.
tests
;
import
java.io.IOException
;
import
org.junit.BeforeClass
;
import
org.junit.Test
;
import
org.springframework.boot.configurationmetadata.ConfigurationMetadataProperty
;
import
org.springframework.boot.configurationmetadata.ConfigurationMetadataRepository
;
import
org.springframework.boot.configurationmetadata.ConfigurationMetadataRepositoryJsonBuilder
;
import
org.springframework.core.io.ClassPathResource
;
import
org.springframework.core.io.Resource
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
/**
* Integration tests for the configuration metadata annotation processor.
*
* @author Stephane Nicoll
*/
public
class
ConfigurationProcessorIntegrationTests
{
private
static
ConfigurationMetadataRepository
repository
;
@BeforeClass
public
static
void
readMetadata
()
throws
IOException
{
Resource
resource
=
new
ClassPathResource
(
"META-INF/spring-configuration-metadata.json"
);
assertThat
(
resource
.
exists
()).
isTrue
();
// Make sure the right file is detected
assertThat
(
resource
.
getURL
().
toString
()).
contains
(
"spring-boot-configuration-processor-tests"
);
repository
=
ConfigurationMetadataRepositoryJsonBuilder
.
create
(
resource
.
getInputStream
()).
build
();
}
@Test
public
void
extractTypeFromAnnotatedGetter
()
{
ConfigurationMetadataProperty
property
=
repository
.
getAllProperties
().
get
(
"annotated.name"
);
assertThat
(
property
).
isNotNull
();
assertThat
(
property
.
getType
()).
isEqualTo
(
"java.lang.String"
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment