Skip to content
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
4 changes: 2 additions & 2 deletions .github/workflows/maven-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ jobs:
with:
token: ${{ secrets.GITHUB_TOKEN || secrets.TOKEN}}
fetch-depth: 0
- name: Set up JDK 17
- name: Set up JDK 21
uses: actions/setup-java@v3
with:
java-version: '17'
java-version: '21'
distribution: 'temurin'
cache: maven
- name: Build with Maven
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/maven.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ jobs:
with:
token: ${{ secrets.TOKEN}}
fetch-depth: 0
- name: Set up JDK 17
- name: Set up JDK 21
uses: actions/setup-java@v3
with:
java-version: '17'
java-version: '21'
distribution: 'temurin'
cache: maven
- name: Build with Maven
Expand Down
9 changes: 5 additions & 4 deletions dynamic-relations/src/main/java/at/drm/dao/RelationDao.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
package at.drm.dao;

import at.drm.model.RelationIdentity;
import at.drm.model.RelationLink;
import java.util.List;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.NoRepositoryBean;

import java.util.List;

@NoRepositoryBean
public interface RelationDao<DRM extends RelationLink, L extends Long> extends CrudRepository<DRM, L> {

RelationLink findBySourceObjectAndTargetIdAndTargetType(Object sourceObject, Long targetId, String targetType);
RelationLink findBySourceObjectAndTargetIdAndTargetType(RelationIdentity sourceObject, Long targetId,
String targetType);

List<RelationLink> findBySourceObject(Object sourceObject);
List<RelationLink> findBySourceObject(RelationIdentity sourceObject);

List<RelationLink> findByTargetIdAndTargetType(Long targetId, String targetType);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,41 @@
import at.drm.model.RelationLink;
import at.drm.model.RelationMetaData;
import com.google.auto.service.AutoService;
import com.squareup.javapoet.*;
import jakarta.persistence.*;

import javax.annotation.processing.*;
import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.CodeBlock;
import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeName;
import com.squareup.javapoet.TypeSpec;
import com.squareup.javapoet.TypeVariableName;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import jakarta.persistence.UniqueConstraint;
import java.io.IOException;
import java.util.LinkedHashSet;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Filer;
import javax.annotation.processing.Messager;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.Processor;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.MirroredTypeException;
import javax.lang.model.type.TypeMirror;
import javax.tools.Diagnostic;
import java.io.IOException;
import java.util.LinkedHashSet;
import java.util.Set;

@AutoService(Processor.class)
public class ReleationProcessor extends AbstractProcessor {
Expand All @@ -40,15 +61,15 @@ public Set<String> getSupportedAnnotationTypes() {
Set<String> annotations = new LinkedHashSet<>();
annotations.add(Relation.class.getCanonicalName());
processingEnv.getMessager()
.printMessage(Diagnostic.Kind.NOTE, "getSupportedAnnotationTypes: "
+ annotations);
.printMessage(Diagnostic.Kind.NOTE, "getSupportedAnnotationTypes: "
+ annotations);
return annotations;
}

@Override
public SourceVersion getSupportedSourceVersion() {
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "getSupportedSourceVersion");
return SourceVersion.RELEASE_17;
return SourceVersion.RELEASE_21;
}

@Override
Expand All @@ -68,7 +89,7 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
private RelationMetaData createEntityMetaData(Element relationElement) {
Relation relationAnnotation = relationElement.getAnnotation(Relation.class);
String elementPackage = processingEnv.getElementUtils()
.getPackageOf(relationElement).getQualifiedName().toString();
.getPackageOf(relationElement).getQualifiedName().toString();
TypeName sourceObjectName = getSourceObjectTypeName(relationAnnotation);
String sourceObjectWithoutPackages = sourceObjectName.toString().replace(elementPackage + ".", "");
String generatedEntityName = sourceObjectWithoutPackages + "Relation";
Expand All @@ -80,13 +101,14 @@ private void createDynamicRelationDao(RelationMetaData entityMetaData) {
String generatedName = entityMetaData.generatedName();
ClassName entityClassName = ClassName.get(packageName, generatedName);
TypeName longTypeName = TypeVariableName.get(Long.class);
TypeSpec relationDao = TypeSpec.interfaceBuilder(entityMetaData.generatedName().replace("Relation", "RelationDao"))
.addModifiers(Modifier.PUBLIC)
.addSuperinterface(
ParameterizedTypeName.get(ClassName.get(RelationDao.class), entityClassName, longTypeName))
.build();
TypeSpec relationDao = TypeSpec.interfaceBuilder(
entityMetaData.generatedName().replace("Relation", "RelationDao"))
.addModifiers(Modifier.PUBLIC)
.addSuperinterface(
ParameterizedTypeName.get(ClassName.get(RelationDao.class), entityClassName, longTypeName))
.build();
JavaFile javaFileDao = JavaFile.builder(packageName, relationDao)
.build();
.build();
createJavaClass(javaFileDao);
}

Expand Down Expand Up @@ -152,26 +174,26 @@ private void createDynamicRelationEntity(RelationMetaData entityMetaData) {
.build())
.build();
JavaFile entityJavaFile = JavaFile.builder(packageName, relationEntity)
.build();
.build();
createJavaClass(entityJavaFile);
}

private static FieldSpec createTargetTypeField() {
return FieldSpec.builder(String.class, "targetType", Modifier.PRIVATE)
.addAnnotation(AnnotationSpec.builder(Column.class)
.addMember("name", "$S", "target_type")
.addMember("nullable", "$L", false)
.build())
.build();
.addAnnotation(AnnotationSpec.builder(Column.class)
.addMember("name", "$S", "target_type")
.addMember("nullable", "$L", false)
.build())
.build();
}

private static FieldSpec createTargetIdField() {
return FieldSpec.builder(Long.class, "targetId", Modifier.PRIVATE)
.addAnnotation(AnnotationSpec.builder(Column.class)
.addMember("name", "$S", "target_id")
.addMember("nullable", "$L", false)
.build())
.build();
.addAnnotation(AnnotationSpec.builder(Column.class)
.addMember("name", "$S", "target_id")
.addMember("nullable", "$L", false)
.build())
.build();
}

private TypeName getSourceObjectTypeName(Relation annotation) {
Expand All @@ -182,48 +204,48 @@ private TypeName getSourceObjectTypeName(Relation annotation) {

private FieldSpec createSourceObjectField(TypeName typeName) {
return FieldSpec.builder(typeName, "sourceObject", Modifier.PRIVATE)
.addAnnotation(ManyToOne.class)
.addAnnotation(createJoinColumnAnnotaion())
.build();
.addAnnotation(ManyToOne.class)
.addAnnotation(createJoinColumnAnnotaion())
.build();
}

private FieldSpec createIdAnnotation() {
return FieldSpec.builder(Long.class, "id", Modifier.PRIVATE)
.addAnnotation(Id.class)
.addAnnotation(createGeneratedValueAnnotation())
.build();
.addAnnotation(Id.class)
.addAnnotation(createGeneratedValueAnnotation())
.build();
}

private AnnotationSpec createJoinColumnAnnotaion() {
return AnnotationSpec.builder(JoinColumn.class)
.addMember("name", "$S", "source_object")
.build();
.addMember("name", "$S", "source_object")
.build();
}

private AnnotationSpec createGeneratedValueAnnotation() {
return AnnotationSpec.builder(GeneratedValue.class)
.addMember("strategy", "$T.$L", GenerationType.class, GenerationType.IDENTITY.name())
.build();
.addMember("strategy", "$T.$L", GenerationType.class, GenerationType.IDENTITY.name())
.build();
}

private AnnotationSpec createTableAnnotation(String generatedName) {
return AnnotationSpec.builder(Table.class)
.addMember("name", "$S", generatedName)
.addMember("uniqueConstraints", CodeBlock.builder()
.add("{ @$T(name = " + "\"unique_$L\", columnNames = " +
"{ \"target_id\", \"target_type\",\"source_object\" })}",
UniqueConstraint.class, generatedName)
.build())
.build();
.addMember("name", "$S", generatedName)
.addMember("uniqueConstraints", CodeBlock.builder()
.add("{ @$T(name = " + "\"unique_$L\", columnNames = " +
"{ \"target_id\", \"target_type\",\"source_object\" })}",
UniqueConstraint.class, generatedName)
.build())
.build();
}

private void createJavaClass(JavaFile javaFile) {
try {
javaFile.writeTo(filer);
} catch (IOException e) {
processingEnv.getMessager()
.printMessage(Diagnostic.Kind.ERROR, "ERROR ON write file: " +
e.getMessage());
.printMessage(Diagnostic.Kind.ERROR, "ERROR ON write file: " +
e.getMessage());
}
}

Expand Down
30 changes: 15 additions & 15 deletions dynamic-relations/src/main/java/at/drm/service/RelationService.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,14 @@
import at.drm.factory.RelationDaoFactory;
import at.drm.model.RelationIdentity;
import at.drm.model.RelationLink;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.core.ResolvableType;
import org.springframework.stereotype.Service;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Service
public class RelationService {

Expand All @@ -28,7 +26,7 @@ public RelationLink createRelation(@NonNull Object sourceObject, @NonNull Relati
Long targetId = targetObect.getId();
String targetType = targetObect.getType();
RelationDao<RelationLink, Long> daoFromSourceObject =
relationDaoFactory.getDaoFromSourceObjectClass(sourceObject.getClass());
relationDaoFactory.getDaoFromSourceObjectClass(sourceObject.getClass());
RelationLink relationLink = createRelationModelFromGenericParameter(daoFromSourceObject);
relationLink.setSourceObject(sourceObject);
relationLink.setTargetId(targetId);
Expand All @@ -38,36 +36,38 @@ public RelationLink createRelation(@NonNull Object sourceObject, @NonNull Relati

public void deleteRelation(RelationLink relationLink) {
RelationDao<RelationLink, Long> daoFromSourceObjectClass =
relationDaoFactory.getDaoFromSourceObjectClass(relationLink.getSourceObject().getClass());
relationDaoFactory.getDaoFromSourceObjectClass(relationLink.getSourceObject().getClass());
daoFromSourceObjectClass.delete(relationLink);
}

public RelationLink findRelationBySourceObjectAndRelationIdentity(@NonNull Object sourceObject, @NonNull RelationIdentity targetObect) {
public RelationLink findRelationBySourceObjectAndRelationIdentity(@NonNull RelationIdentity sourceObject,
@NonNull RelationIdentity targetObect) {
RelationDao<RelationLink, Long> daoFromSourceObject =
relationDaoFactory.getDaoFromSourceObjectClass(sourceObject.getClass());
relationDaoFactory.getDaoFromSourceObjectClass(sourceObject.getClass());
RelationLink relationLink = daoFromSourceObject.
findBySourceObjectAndTargetIdAndTargetType(sourceObject, targetObect.getId(), targetObect.getType());
findBySourceObjectAndTargetIdAndTargetType(sourceObject, targetObect.getId(), targetObect.getType());
return relationLink;
}

public List<RelationLink> findRelationBySourceObject(@NonNull Object sourceObject) {
public List<RelationLink> findRelationBySourceObject(@NonNull RelationIdentity sourceObject) {
RelationDao<RelationLink, Long> daoFromSourceObject =
relationDaoFactory.getDaoFromSourceObjectClass(sourceObject.getClass());
relationDaoFactory.getDaoFromSourceObjectClass(sourceObject.getClass());
List<RelationLink> relationLinks = daoFromSourceObject.findBySourceObject(sourceObject);
return relationLinks;
}

public Set<RelationLink> findRelationByTargetRelationIdentity(@NonNull RelationIdentity targetObect) {
Set<RelationDao> allDaos = relationDaoFactory.getAllDaos();
Set<RelationLink> relations = new HashSet<>();
allDaos.forEach(dao -> relations.addAll(dao.findByTargetIdAndTargetType(targetObect.getId(), targetObect.getType())));
allDaos.forEach(
dao -> relations.addAll(dao.findByTargetIdAndTargetType(targetObect.getId(), targetObect.getType())));
return relations;
}

private static RelationLink createRelationModelFromGenericParameter(RelationDao<RelationLink,
Long> daoFromSourceObjectClass) {
Long> daoFromSourceObjectClass) {
ResolvableType resolvableType = ResolvableType.forClass(daoFromSourceObjectClass.getClass())
.as(RelationDao.class);
.as(RelationDao.class);
ResolvableType generic = resolvableType.getGeneric(0);
Class<?> resolve = generic.resolve();
return (RelationLink) BeanUtils.instantiateClass(resolve);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ void getSupportedSourceVersion() {
Mockito.when(processingEnvironment.getMessager()).thenReturn(messager);
releationProcessorUnderTest.init(processingEnvironment);
SourceVersion supportedSourceVersion = releationProcessorUnderTest.getSupportedSourceVersion();
assertThat(supportedSourceVersion).isEqualTo(SourceVersion.RELEASE_17);
assertThat(supportedSourceVersion).isEqualTo(SourceVersion.RELEASE_21);
}

@Test
Expand Down
5 changes: 2 additions & 3 deletions jacoco-report/pom.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?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">
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">
<parent>
<groupId>io.github.Mom0aut</groupId>
<artifactId>jdr</artifactId>
Expand All @@ -15,7 +15,6 @@
<code.coverage.project.folder>${basedir}/../</code.coverage.project.folder>
<code.coverage.overall.data.folder>${basedir}/../target/aggregate.exec</code.coverage.overall.data.folder>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jacoco-maven-plugin.version>0.8.8</jacoco-maven-plugin.version>
</properties>

<dependencies>
Expand Down
Loading