Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support spring-data 3.0 (test only) #7376

Merged
merged 2 commits into from
Jan 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ dependencies {

testInstrumentation(project(":instrumentation:apache-httpasyncclient-4.1:javaagent"))
testInstrumentation(project(":instrumentation:netty:netty-4.1:javaagent"))
testInstrumentation(project(":instrumentation:spring:spring-data-1.8:javaagent"))
testInstrumentation(project(":instrumentation:spring:spring-data:spring-data-1.8:javaagent"))

testImplementation(project(":instrumentation:elasticsearch:elasticsearch-transport-common:testing"))
testImplementation("org.apache.logging.log4j:log4j-core:2.11.0")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,24 +27,27 @@ dependencies {
library("org.springframework.data:spring-data-commons:1.8.0.RELEASE")
compileOnly("org.springframework:spring-aop:1.2")

testImplementation("org.spockframework:spock-spring")
testLibrary("org.springframework:spring-test:3.0.0.RELEASE")
testInstrumentation(project(":instrumentation:jdbc:javaagent"))

testImplementation(project(":instrumentation:spring:spring-data:spring-data-common:testing"))

testLibrary("org.hibernate:hibernate-entitymanager:4.3.0.Final")
testLibrary("org.springframework.data:spring-data-jpa:1.8.0.RELEASE")
testLibrary("org.springframework:spring-test:3.0.0.RELEASE")

// JPA dependencies
testInstrumentation(project(":instrumentation:jdbc:javaagent"))
testImplementation("com.mysema.querydsl:querydsl-jpa:3.7.4")
testImplementation("org.hsqldb:hsqldb:2.0.0")
testLibrary("org.hibernate:hibernate-entitymanager:4.3.0.Final")

latestDepTestLibrary("org.springframework:spring-test:5.+")
// limit to spring 5; spring 6 is tested in its separate module
latestDepTestLibrary("org.hibernate:hibernate-entitymanager:5.+")
latestDepTestLibrary("org.springframework.data:spring-data-commons:2.+")
latestDepTestLibrary("org.springframework.data:spring-data-jpa:2.+")
latestDepTestLibrary("org.springframework:spring-test:5.+")
}

tasks.withType<Test>().configureEach {
// required on jdk17
jvmArgs("--add-opens=java.base/java.lang.invoke=ALL-UNNAMED")
jvmArgs("-XX:+IgnoreUnrecognizedVMOptions")
tasks {
test {
jvmArgs("--add-opens=java.base/java.lang.invoke=ALL-UNNAMED")
jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED")
jvmArgs("-XX:+IgnoreUnrecognizedVMOptions")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

import org.springframework.context.annotation.AnnotationConfigApplicationContext
import spring.jpa.JpaCustomer
import spring.jpa.JpaCustomerRepository
import spring.jpa.JpaPersistenceConfig

class SpringJpaTest extends AbstractSpringJpaTest<JpaCustomer, JpaCustomerRepository> {

JpaCustomer newCustomer(String firstName, String lastName) {
return new JpaCustomer(firstName, lastName)
}

Long id(JpaCustomer customer) {
return customer.id
}

void setFirstName(JpaCustomer customer, String firstName) {
customer.firstName = firstName
}

Class<JpaCustomerRepository> repositoryClass() {
return JpaCustomerRepository
}

JpaCustomerRepository repository() {
def context = new AnnotationConfigApplicationContext(JpaPersistenceConfig)
def repo = context.getBean(JpaCustomerRepository)

// when Spring JPA sets up, it issues metadata queries -- clear those traces
clearExportedData()

return repo
}

List<JpaCustomer> findByLastName(JpaCustomerRepository repository, String lastName) {
return repository.findByLastName(lastName)
}

List<JpaCustomer> findSpecialCustomers(JpaCustomerRepository repository) {
return repository.findSpecialCustomers()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
plugins {
id("otel.javaagent-testing")
}

dependencies {
testInstrumentation(project(":instrumentation:jdbc:javaagent"))
testInstrumentation(project(":instrumentation:spring:spring-core-2.0:javaagent"))
testInstrumentation(project(":instrumentation:spring:spring-data:spring-data-1.8:javaagent"))

testImplementation(project(":instrumentation:spring:spring-data:spring-data-common:testing"))

testLibrary("org.hibernate.orm:hibernate-core:6.0.0.Final")
testLibrary("org.springframework.data:spring-data-commons:3.0.0")
testLibrary("org.springframework.data:spring-data-jpa:3.0.0")
testLibrary("org.springframework:spring-test:6.0.0")

testImplementation("org.hsqldb:hsqldb:2.0.0")
}

otelJava {
minJavaVersionSupported.set(JavaVersion.VERSION_17)
}

tasks {
test {
jvmArgs("--add-opens=java.base/java.lang.invoke=ALL-UNNAMED")
jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED")
jvmArgs("-XX:+IgnoreUnrecognizedVMOptions")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

import org.springframework.context.ConfigurableApplicationContext
import org.springframework.context.annotation.AnnotationConfigApplicationContext
import spring.jpa.JpaCustomer
import spring.jpa.JpaCustomerRepository
import spring.jpa.JpaPersistenceConfig

class SpringJpaTest extends AbstractSpringJpaTest<JpaCustomer, JpaCustomerRepository> {

ConfigurableApplicationContext context
JpaCustomerRepository repository

def setup() {
context = new AnnotationConfigApplicationContext(JpaPersistenceConfig)
repository = context.getBean(JpaCustomerRepository)

// when Spring JPA sets up, it issues metadata queries -- clear those traces
clearExportedData()
}

def cleanup() {
context.close()
}

JpaCustomer newCustomer(String firstName, String lastName) {
return new JpaCustomer(firstName, lastName)
}

Long id(JpaCustomer customer) {
return customer.id
}

void setFirstName(JpaCustomer customer, String firstName) {
customer.firstName = firstName
}

Class<JpaCustomerRepository> repositoryClass() {
return JpaCustomerRepository
}

JpaCustomerRepository repository() {
return repository
}

List<JpaCustomer> findByLastName(JpaCustomerRepository repository, String lastName) {
return repository.findByLastName(lastName)
}

List<JpaCustomer> findSpecialCustomers(JpaCustomerRepository repository) {
return repository.findSpecialCustomers()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package spring.jpa;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import java.util.Objects;
import javax.annotation.Nullable;

@Entity
public class JpaCustomer {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private String firstName;
private String lastName;

protected JpaCustomer() {}

public JpaCustomer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

@Override
public String toString() {
return String.format("Customer[id=%d, firstName='%s', lastName='%s']", id, firstName, lastName);
}

@Override
public boolean equals(@Nullable Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof JpaCustomer)) {
return false;
}
JpaCustomer other = (JpaCustomer) obj;
return Objects.equals(id, other.id)
&& Objects.equals(firstName, other.firstName)
&& Objects.equals(lastName, other.lastName);
}

@Override
public int hashCode() {
return Objects.hash(id, firstName, lastName);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package spring.jpa;

import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;

public interface JpaCustomerRepository
extends JpaRepository<JpaCustomer, Long>, JpaCustomerRepositoryCustom {
List<JpaCustomer> findByLastName(String lastName);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package spring.jpa;

import java.util.List;

public interface JpaCustomerRepositoryCustom {
List<JpaCustomer> findSpecialCustomers();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package spring.jpa;

import jakarta.persistence.EntityManager;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;

public class JpaCustomerRepositoryImpl implements JpaCustomerRepositoryCustom {
@Autowired private EntityManager entityManager;

@Override
public List<JpaCustomer> findSpecialCustomers() {
return entityManager.createQuery("from JpaCustomer", JpaCustomer.class).getResultList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package spring.jpa;

import java.util.Collections;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

@EnableJpaRepositories(basePackages = "spring.jpa")
public class JpaPersistenceConfig {

@Bean
public PlatformTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setDatabase(Database.HSQL);
vendorAdapter.setGenerateDdl(true);
vendorAdapter.setShowSql(true);

LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan("spring.jpa");
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaPropertyMap(Collections.singletonMap("hibernate.hbm2ddl.auto", "create"));
return em;
}

@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
dataSource.setUrl("jdbc:hsqldb:mem:test");
dataSource.setUsername("sa");
dataSource.setPassword("1");
return dataSource;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
plugins {
id("otel.java-conventions")
}

dependencies {
implementation(project(":testing-common"))

compileOnly("org.hibernate:hibernate-core:4.3.0.Final")
compileOnly("org.springframework.data:spring-data-commons:1.8.0.RELEASE")
compileOnly("org.springframework.data:spring-data-jpa:1.8.0.RELEASE")
compileOnly("org.springframework:spring-test:3.0.0.RELEASE")
}
Loading