Skip to content

Commit ca37c88

Browse files
Merge pull request #17 from Wilson-Emmanuel/export
Added Excel export features and fixed bugs
2 parents 42d916c + c61b382 commit ca37c88

20 files changed

+667
-71
lines changed

src/main/java/com/softwarelab/dataextractor/StageInitializer.java

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.softwarelab.dataextractor;
22

3+
import com.softwarelab.dataextractor.core.utilities.NotificationUtil;
34
import com.softwarelab.dataextractor.ui.view_controller.MainController;
45
import javafx.fxml.FXMLLoader;
56
import javafx.scene.Parent;
@@ -37,6 +38,7 @@ public class StageInitializer implements ApplicationListener<GitJavaDataExtracto
3738
@Override
3839
public void onApplicationEvent(GitJavaDataExtractorUIStarter.StageReadyEvent stageReadyEvent) {
3940

41+
setDefaultExceptionHandler();
4042
try{
4143
FXMLLoader fxmlLoader = new FXMLLoader(mainResource.getURL());
4244
fxmlLoader.setController(mainController);
@@ -60,12 +62,27 @@ public void onApplicationEvent(GitJavaDataExtractorUIStarter.StageReadyEvent sta
6062
mainStage.centerOnScreen();
6163
mainStage.show();
6264
}catch (Exception ex){
63-
ex.printStackTrace();
65+
//ex.printStackTrace();
6466
Alert alert = new Alert(Alert.AlertType.ERROR);
6567
alert.setTitle("Application Error");
6668
alert.setContentText("An error occurred while starting the application. Please try again " +
6769
"or contact the developer.");
6870
alert.show();
6971
}
7072
}
73+
/*
74+
Global Exception Handler
75+
*/
76+
private void setDefaultExceptionHandler() {
77+
Thread.setDefaultUncaughtExceptionHandler( (thread, throwable) ->{
78+
throwable.printStackTrace();
79+
NotificationUtil.inputError("Error: "+throwable.getMessage());
80+
});
81+
/*
82+
For current thread
83+
Thread.currentThread().setUncaughtExceptionHandler((thread, throwable) -> {
84+
System.out.println("Handler caught exception: "+throwable.getMessage());
85+
});
86+
*/
87+
}
7188
}

src/main/java/com/softwarelab/dataextractor/core/persistence/models/dtos/FileModel.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import lombok.Data;
55

66
import java.util.Collections;
7+
import java.util.Map;
78
import java.util.Set;
89

910
/**
@@ -17,5 +18,5 @@ public class FileModel {
1718
private String nameUrl;
1819
private String packageName;
1920
@Builder.Default
20-
private Set<String> libraries = Collections.emptySet();
21+
private Map<String,Boolean> libraries = Collections.emptyMap();
2122
}

src/main/java/com/softwarelab/dataextractor/core/persistence/repositories/CommitRepository.java

+10
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@
22

33
import com.softwarelab.dataextractor.core.persistence.entities.CommitEntity;
44
import com.softwarelab.dataextractor.core.persistence.entities.ProjectEntity;
5+
import org.springframework.data.domain.Page;
6+
import org.springframework.data.domain.Pageable;
57
import org.springframework.data.jpa.repository.JpaRepository;
8+
import org.springframework.data.jpa.repository.Query;
9+
import org.springframework.data.repository.query.Param;
610
import org.springframework.stereotype.Repository;
711

12+
import java.util.List;
813
import java.util.Optional;
914

1015
/**
@@ -17,5 +22,10 @@ public interface CommitRepository extends JpaRepository<CommitEntity,Long> {
1722
Optional<CommitEntity> findByCommitId(String commitId);
1823
boolean existsByCommitId(String commitId);
1924
boolean existsByCommitIdAndProjectAndDeveloperName(String commitId, ProjectEntity project, String developerName);
25+
Page<CommitEntity> findAllByProject(ProjectEntity project, Pageable pageable);
2026

27+
@Query("SELECT DISTINCT c.developerName FROM CommitEntity c WHERE c.project = :project")
28+
List<String> getDistinctDevelopers(@Param("project") ProjectEntity project);
29+
30+
List<CommitEntity> findAllByDeveloperNameAndProject(String developerName, ProjectEntity project);
2131
}
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package com.softwarelab.dataextractor.core.persistence.repositories;
22

3+
import com.softwarelab.dataextractor.core.persistence.entities.CommitEntity;
34
import com.softwarelab.dataextractor.core.persistence.entities.LibraryEntity;
45
import org.springframework.data.jpa.repository.JpaRepository;
56

7+
import java.util.List;
8+
69
/**
710
* Created by Wilson
811
* on Tue, 25/05/2021.
912
*/
1013
public interface LibraryRepository extends JpaRepository<LibraryEntity,Long> {
14+
List<LibraryEntity> findAllByCommit(CommitEntity commitEntity);
1115
}

src/main/java/com/softwarelab/dataextractor/core/persistence/repositories/ProjectRepository.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* Created by Wilson
1010
* on Tue, 25/05/2021.
1111
*/
12-
public interface ProjectRepository extends JpaRepository<ProjectEntity,Integer> {
12+
public interface ProjectRepository extends JpaRepository<ProjectEntity,Long> {
1313
boolean existsByRemoteUrl(String remoteUrl);
1414

1515
Optional<ProjectEntity> findByRemoteUrl(String remoteUrl);

src/main/java/com/softwarelab/dataextractor/core/services/CommitServiceImpl.java

+90-4
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,22 @@
33
import com.softwarelab.dataextractor.core.persistence.entities.CommitEntity;
44
import com.softwarelab.dataextractor.core.persistence.entities.LibraryEntity;
55
import com.softwarelab.dataextractor.core.persistence.entities.ProjectEntity;
6+
import com.softwarelab.dataextractor.core.persistence.models.PagedData;
67
import com.softwarelab.dataextractor.core.persistence.models.dtos.CommitModel;
78
import com.softwarelab.dataextractor.core.persistence.repositories.CommitRepository;
89
import com.softwarelab.dataextractor.core.persistence.repositories.LibraryRepository;
10+
import com.softwarelab.dataextractor.core.persistence.repositories.ProjectRepository;
911
import com.softwarelab.dataextractor.core.services.usecases.CommitService;
1012
import com.softwarelab.dataextractor.core.utilities.DateTimeUtil;
1113
import lombok.AccessLevel;
1214
import lombok.AllArgsConstructor;
1315
import lombok.experimental.FieldDefaults;
16+
import org.springframework.data.domain.Page;
17+
import org.springframework.data.domain.PageRequest;
18+
import org.springframework.data.domain.Pageable;
1419
import org.springframework.stereotype.Service;
1520

16-
import java.util.ArrayList;
17-
import java.util.List;
21+
import java.util.*;
1822
import java.util.stream.Collectors;
1923

2024
/**
@@ -28,6 +32,7 @@ public class CommitServiceImpl implements CommitService {
2832

2933
CommitRepository commitRepository;
3034
LibraryRepository libraryRepository;
35+
ProjectRepository projectRepository;
3136

3237
@Override
3338
public CommitEntity saveCommit(CommitModel commitModel,ProjectEntity projectEntity) {
@@ -54,12 +59,93 @@ public void saveCommitAll(List<CommitModel> commitModels, ProjectEntity projectE
5459

5560
final CommitEntity commitEntity = saveCommit(commitModel,projectEntity);
5661

57-
libs.addAll(commitModel.getLibraries().stream()
62+
Map<String,Boolean> devLibs = getDeveloperLibs(commitModel.getDeveloperName(),projectEntity);
63+
64+
//exclude all libs the dev already have
65+
libs.addAll(commitModel.getLibraries()
66+
.stream()
67+
.filter(lib-> devLibs.getOrDefault(lib,true))
5868
.map(lib->LibraryEntity.builder()
5969
.commit(commitEntity)
6070
.library(lib)
6171
.build()).collect(Collectors.toList()));
6272
}
63-
libraryRepository.saveAll(libs);
73+
if(!libs.isEmpty())
74+
libraryRepository.saveAll(libs);
75+
}
76+
77+
@Override
78+
public PagedData<CommitModel> getCommits(Long projectId, int page, int size) {
79+
Optional<ProjectEntity> optionalProjectEntity = projectRepository.findById(projectId);
80+
if(optionalProjectEntity.isEmpty()){
81+
return new PagedData<>(Collections.emptyList(),0,0);
82+
}
83+
Pageable pageable = PageRequest.of(page,size);
84+
Page<CommitEntity> commitEntityPage = commitRepository.findAllByProject(optionalProjectEntity.get(),pageable);
85+
List<CommitModel> commitModels = commitEntityPage.stream().map(this::convertEntityToModel).collect(Collectors.toList());
86+
return new PagedData<>(commitModels,commitEntityPage.getTotalElements(),commitEntityPage.getTotalPages());
87+
}
88+
89+
@Override
90+
public List<String> getDevelopers(Long projectId) {
91+
var optionalProjectEntity = projectRepository.findById(projectId);
92+
if(optionalProjectEntity.isEmpty())
93+
return Collections.emptyList();
94+
95+
return commitRepository.getDistinctDevelopers(optionalProjectEntity.get());
96+
}
97+
98+
private Map<String,Boolean> getDeveloperLibs(String developerName, ProjectEntity project){
99+
Map<String,Boolean> res = new HashMap<>();
100+
List<CommitEntity> commitEntityList = commitRepository.findAllByDeveloperNameAndProject(developerName, project);
101+
for(CommitEntity commitEntity: commitEntityList) {
102+
List<LibraryEntity> libraryEntities = libraryRepository.findAllByCommit(commitEntity);
103+
for (LibraryEntity lib : libraryEntities) {
104+
res.put(lib.getLibrary(),false);
105+
}
106+
}
107+
return res;
64108
}
109+
110+
@Override
111+
public Optional<String> getDeveloperLibraries(String developerName, Long projectId) {
112+
var optionalProjectEntity = projectRepository.findById(projectId);
113+
if(optionalProjectEntity.isEmpty())
114+
return Optional.empty();
115+
116+
StringBuilder sb = null;
117+
List<CommitEntity> commitEntityList = commitRepository.findAllByDeveloperNameAndProject(developerName,optionalProjectEntity.get());
118+
for(CommitEntity commitEntity: commitEntityList){
119+
List<LibraryEntity> libraryEntities = libraryRepository.findAllByCommit(commitEntity);
120+
for(LibraryEntity lib: libraryEntities){
121+
if(sb == null){
122+
sb = new StringBuilder();
123+
sb.append(lib.getLibrary());
124+
}else{
125+
sb.append(",");
126+
sb.append(lib.getLibrary());
127+
}
128+
}
129+
}
130+
if(sb == null)return Optional.empty();
131+
return Optional.of(sb.toString());
132+
}
133+
134+
private CommitModel convertEntityToModel(CommitEntity commitEntity){
135+
return CommitModel.builder()
136+
.commitId(commitEntity.getCommitId())
137+
.commitDate(DateTimeUtil.isoDateTime(commitEntity.getCommitDate()))
138+
.developerEmail(commitEntity.getDeveloperEmail())
139+
.developerName(commitEntity.getDeveloperName())
140+
.fileUrl(commitEntity.getFileUrl())
141+
.libraries(getLibraries(commitEntity))
142+
.build();
143+
}
144+
145+
private Set<String> getLibraries(CommitEntity commitEntity){
146+
return libraryRepository.findAllByCommit(commitEntity).stream().map(LibraryEntity::getLibrary)
147+
.collect(Collectors.toSet());
148+
}
149+
150+
65151
}

src/main/java/com/softwarelab/dataextractor/core/services/ProjectServiceImpl.java

+16
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
import lombok.experimental.FieldDefaults;
1010
import org.springframework.stereotype.Service;
1111

12+
import java.util.List;
1213
import java.util.Optional;
14+
import java.util.stream.Collectors;
1315

1416
/**
1517
* Created by Wilson
@@ -39,4 +41,18 @@ public ProjectEntity saveProject(ProjectModel model) {
3941
public boolean existsByRemoteUrl(String remoteUrl) {
4042
return projectRepository.existsByRemoteUrl(remoteUrl);
4143
}
44+
45+
@Override
46+
public List<ProjectModel> getAllProjects() {
47+
return projectRepository.findAll().stream().map(this::convertEntityToModel)
48+
.collect(Collectors.toList());
49+
}
50+
private ProjectModel convertEntityToModel(ProjectEntity projectEntity){
51+
return ProjectModel.builder()
52+
.id(projectEntity.getId())
53+
.name(projectEntity.getName())
54+
.remoteUrl(projectEntity.getRemoteUrl())
55+
.localPath(projectEntity.getLocalPath())
56+
.build();
57+
}
4258
}

src/main/java/com/softwarelab/dataextractor/core/services/usecases/CommitService.java

+5
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import com.softwarelab.dataextractor.core.persistence.entities.CommitEntity;
44
import com.softwarelab.dataextractor.core.persistence.entities.ProjectEntity;
5+
import com.softwarelab.dataextractor.core.persistence.models.PagedData;
56
import com.softwarelab.dataextractor.core.persistence.models.dtos.CommitModel;
67

78
import java.util.List;
9+
import java.util.Optional;
810

911
/**
1012
* Created by Wilson
@@ -13,4 +15,7 @@
1315
public interface CommitService {
1416
CommitEntity saveCommit(CommitModel commitModel, ProjectEntity projectEntity);
1517
void saveCommitAll(List<CommitModel> commitModels, ProjectEntity projectEntity);
18+
PagedData<CommitModel> getCommits(Long projectId, int page, int size);
19+
List<String> getDevelopers(Long projectId);
20+
Optional<String> getDeveloperLibraries(String developerName, Long projectId);
1621
}

src/main/java/com/softwarelab/dataextractor/core/services/usecases/ProjectService.java

+3
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@
33
import com.softwarelab.dataextractor.core.persistence.entities.ProjectEntity;
44
import com.softwarelab.dataextractor.core.persistence.models.dtos.ProjectModel;
55

6+
import java.util.List;
7+
68
/**
79
* Created by Wilson
810
* on Wed, 26/05/2021.
911
*/
1012
public interface ProjectService {
1113
ProjectEntity saveProject(ProjectModel model);
1214
boolean existsByRemoteUrl(String remoteUrl);
15+
List<ProjectModel> getAllProjects();
1316
}

src/main/java/com/softwarelab/dataextractor/core/utilities/DateTimeUtil.java

+6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.softwarelab.dataextractor.core.utilities;
22

33
import java.time.Instant;
4+
import java.time.LocalDateTime;
45
import java.time.ZoneId;
56
import java.time.ZonedDateTime;
7+
import java.time.format.DateTimeFormatter;
68

79
/**
810
* Created by Wilson
@@ -15,6 +17,10 @@ public static String getDateTime(Instant instant){
1517
//ZonedDateTime zd3 = now.atZone(ZoneId.systemDefault());
1618
return zd2.toString();
1719
}
20+
public static String isoDateTime(Instant instant){
21+
if(instant == null)return "";
22+
return LocalDateTime.ofInstant(instant,ZoneId.of("Asia/Tokyo")).format(DateTimeFormatter.ISO_DATE_TIME);
23+
}
1824
public static Instant getInstantTime(String isoTime){
1925
return Instant.parse(isoTime);
2026
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.softwarelab.dataextractor.core.utilities;
2+
3+
import java.io.File;
4+
5+
/**
6+
* Created by Wilson
7+
* on Tue, 08/06/2021.
8+
*/
9+
public class GeneralUtil {
10+
public static String getProgramPath(){
11+
File defaultLoc = new File(System.getProperty("user.home"),"Data_Extractor");
12+
boolean created = defaultLoc.exists();
13+
if(!created){
14+
created = defaultLoc.mkdir();
15+
}
16+
return created?defaultLoc.getPath():System.getProperty("user.home");
17+
}
18+
}

0 commit comments

Comments
 (0)