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

New function to extract metrics of a Java Repository #71

Open
wants to merge 34 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
454ac1c
Estrutura inicial para gerar as metricas e configuração do mavem para…
Feb 23, 2014
8fc2420
Initial Structure to save metrics
Feb 23, 2014
c99c9fa
Merge branch 'ast' of https://github.com/bss3/groundhog into ast
Feb 24, 2014
bf00d7c
Basic structure to store metrics finished
Feb 24, 2014
170dbc3
First integrate round with groundhog and proced code to parse AST and…
Feb 27, 2014
b517dbf
Implementation of the GroundhogASTVisitor finished, metrics collector…
Feb 27, 2014
dd67ea8
Some fixes in VG complexit metric
Mar 4, 2014
f1cf7b6
Some updates and fixes to the Cyclomatic Complexity calculation
tuliolages Mar 4, 2014
40109d4
Fix nested block depth bug that interprets an superior block as an su…
Mar 4, 2014
f2cd951
Merge branch 'ast_suja' of https://github.com/bss3/groundhog into ast…
Mar 4, 2014
8aaa285
MetricsCollector bug fix
tuliolages Mar 4, 2014
7b74af2
Merge branch 'ast_suja' of github.com:bss3/groundhog into ast_suja
tuliolages Mar 4, 2014
48a9c68
Fix problem with NBD visit to calculate depth only for methods
Mar 4, 2014
7eb1d3c
Fix bug with NBL, add more functions to Util class and show remain fi…
Mar 5, 2014
2e2ad56
Merge branch 'ast_suja' of https://github.com/bss3/groundhog into ast…
Mar 5, 2014
e1fc1e5
Fixes of method count calculation
tuliolages Mar 5, 2014
fab2f6c
Finish structure to collect metrics
Mar 5, 2014
3d1b651
Initial preparation to store things on the database
tuliolages Mar 5, 2014
e654bf8
Merge branch 'ast_suja' of github.com:bss3/groundhog into ast_suja
tuliolages Mar 5, 2014
e198246
Adding annotations for java files, packages, projects and statisticst…
tuliolages Mar 5, 2014
1a37bd8
Mapper, new save method added
Mar 5, 2014
b012bc8
mongoDB storare for metrics completed
Mar 6, 2014
abfd382
Fix pom.xml warnigns for missing version of plugins
Mar 6, 2014
7e6bc44
Small fix on dependence version
Mar 6, 2014
3317a93
Add suport to java metrics extractor, to be used from line command
Mar 6, 2014
889a544
Adding five tests to the project
tuliolages Mar 6, 2014
4351355
Merge branch 'ast_suja' of github.com:bss3/groundhog into ast_suja
tuliolages Mar 6, 2014
14a41aa
remove dead code
Mar 6, 2014
07697f0
Merge remote-tracking branch 'upstream/master' into ast_suja_merging
Mar 6, 2014
2d0862e
Adding project used to testing
tuliolages Mar 6, 2014
74d801a
Correction of some tests.
tuliolages Mar 6, 2014
d1c4237
Merge branch 'ast_suja' of github.com:bss3/groundhog into ast_suja
tuliolages Mar 6, 2014
fd2d1bf
Fix dependence version problem
Mar 6, 2014
e7ddc75
Merge branch 'ast_suja' into ast_suja_merging
Mar 6, 2014
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
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,3 @@ bin
*.log

*.jar
metrics/
36 changes: 19 additions & 17 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.6</version>
<version>1.7.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
Expand Down Expand Up @@ -175,25 +175,25 @@
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.gitective</groupId>
<artifactId>gitective-core</artifactId>
<version>0.9.9</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.11.3</version>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.11.3</version>
</dependency>
<dependency>
<groupId>org.mongodb.morphia</groupId>
<artifactId>morphia</artifactId>
<version>0.105</version>
<groupId>org.mongodb.morphia</groupId>
<artifactId>morphia</artifactId>
<version>0.105</version>
</dependency>
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<version>1.42</version>
</dependency>
<groupId>org.eclipse.jdt</groupId>
<artifactId>org.eclipse.jdt.core</artifactId>
<version>3.7.1</version>
</dependency>
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<version>1.40</version>
</dependency>
</dependencies>

<build>
Expand Down Expand Up @@ -247,6 +247,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
Expand All @@ -260,6 +261,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
<executions>
<execution>
<id>attach-javadocs</id>
Expand Down Expand Up @@ -287,7 +289,7 @@
</goals>
</execution>
</executions>
</plugin>
</plugin>
</plugins>
</build>
</project>
31 changes: 24 additions & 7 deletions src/java/main/br/ufpe/cin/groundhog/database/GroundhogDB.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.Morphia;
import org.mongodb.morphia.Key;

import br.ufpe.cin.groundhog.GitHubEntity;

Expand All @@ -17,14 +18,17 @@
*
*/
public class GroundhogDB {
private final String dbName;
private final MongoClient mongo;
private final Datastore datastore;

private String dbName;
private MongoClient mongo;
private Datastore datastore;
private Morphia mapper;

public GroundhogDB(String host, String dbName) throws UnknownHostException {
this.dbName = dbName;
this.mongo = new MongoClient(host);
this.datastore = new Morphia().createDatastore(this.mongo, dbName);
this.mapper = new Morphia();
this.datastore = this.mapper.createDatastore(this.mongo, dbName);
}

public GroundhogDB(MongoClient mongo, String dbName) throws UnknownHostException {
Expand All @@ -41,8 +45,8 @@ public static void query(GitHubEntity entity, String params) {
* Receives a GitHub entity object and persists it to the database
* @param entity, a {@link Object} representing one of the many GitHub entities covered by Groundhog
*/
public void save(Object entity) {
this.datastore.save(entity);
public <T> Key<T> save(T entity) {
return this.datastore.save(entity);
}

public String getDbName() {
Expand All @@ -56,4 +60,17 @@ public MongoClient getMongo() {
public Datastore getDatastore() {
return this.datastore;
}
}

public void setDatastore(Datastore datastore) {
this.datastore = datastore;
}

public Morphia getMapper() {
return mapper;
}

public void setMapper(Morphia mapper) {
this.mapper = mapper;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,21 @@ public List<Commit> extractCommits(File project) {
return null;
}

public List<RevCommit> getCommitList(File project) {
CommitListFilter list = new CommitListFilter();

String path = project.getAbsolutePath() + "/.git";
CommitFinder finder = new CommitFinder(path);

finder.setFilter(list).find();
//
// for (RevCommit rev : list.getCommits()){
// System.out.println(rev.getName() + " " + rev.getAuthorIdent().getName() + " " + rev.getShortMessage());
// }
//
return list.getCommits();
}

/**
* A method that returns the number of commits that contain files with a given file extension
* Example usage:
Expand Down
148 changes: 90 additions & 58 deletions src/java/main/br/ufpe/cin/groundhog/main/CmdMain.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static java.lang.String.format;

import java.io.File;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
Expand All @@ -28,8 +29,14 @@
import br.ufpe.cin.groundhog.crawler.CrawlGoogleCode;
import br.ufpe.cin.groundhog.crawler.CrawlSourceForge;
import br.ufpe.cin.groundhog.crawler.ForgeCrawler;
import br.ufpe.cin.groundhog.database.GroundhogDB;
import br.ufpe.cin.groundhog.http.HttpModule;
import br.ufpe.cin.groundhog.http.Requests;
import br.ufpe.cin.groundhog.metrics.JavaProject;
import br.ufpe.cin.groundhog.metrics.exception.InvalidJavaFileException;
import br.ufpe.cin.groundhog.metrics.exception.InvalidJavaProjectPathException;
import br.ufpe.cin.groundhog.metrics.exception.InvalidSourceRootCodePathException;
import br.ufpe.cin.groundhog.metrics.exception.InvalidTestSourcePathException;
import br.ufpe.cin.groundhog.parser.java.JavaParser;
import br.ufpe.cin.groundhog.parser.java.MutableInt;
import br.ufpe.cin.groundhog.parser.java.NotAJavaProjectException;
Expand Down Expand Up @@ -171,7 +178,7 @@ public File downloadAndCheckoutProject(Project project,

File repositoryFolder = repositoryFolderFuture.get();
logger.info(format("Project %s was downloaded", name));

logger.info(format("Project has %d forks", project.getForksCount()));

logger.info(format("Checking out project %s to %s...", name, datetimeStr));
Expand Down Expand Up @@ -237,74 +244,99 @@ public void analyzeProject(Project project, File projectFolder,
@Override
public void run(JsonInputFile input) {
try {
final File destinationFolder = input.getDest();
final File metricsFolder = input.getOut();

logger.info("Creating temp folders...");
createTempFolders(destinationFolder, metricsFolder);

final Date datetime = input.getDatetime();
final int nProjects = input.getNprojects();
final String username = input.getSearch().getUsername();

// Search for projects
logger.info("Searching for projects... " + input.getSearch().getProjects());
ForgeSearch search = defineForgeSearch(input.getForge());
ForgeCrawler crawler = defineForgeCrawler(input.getForge(), destinationFolder);

String term = input.getSearch().getProjects().get(0);

List<Project> allProjects = null;
if(username != null && !username.isEmpty()) {
allProjects = search.getProjects(term, username, 1);
} else {
allProjects = search.getProjects(term, 1,-1);
}

//TODO the getProjects method already limits the number of searched projects
List<Project> projects = new ArrayList<Project>();
for (int i = 0; i < nProjects; i++) {
if (i < allProjects.size()) {
projects.add(allProjects.get(i));
//Java Metrics
if(input.getDBName()!= null || input.getJavaProjectSourceRootPath() != null || input.getJavaProjectSourceRootTestPath() != null){

final GroundhogDB ghdb = new GroundhogDB("127.0.0.1", input.getDBName());
ghdb.getMapper().mapPackage("br.ufpe.cin.groundhog.metrics");

JavaProject project = new JavaProject(input.getJavaProjectPath());
try {
project.generateStructure(input.getJavaProjectSourceRootPath(), input.getJavaProjectSourceRootTestPath());
} catch (Exception e) {
logger.error("The struture of passed Java project can't be reconstructed!\nPlease check your parameters");
e.printStackTrace();
}

project.generateMetrics(
input.getJavaProjectSourceRootTestPath() != null ? true: false,
ghdb);

}else{

final File destinationFolder = input.getDest();
final File metricsFolder = input.getOut();

logger.info("Creating temp folders...");
createTempFolders(destinationFolder, metricsFolder);

final Date datetime = input.getDatetime();
final int nProjects = input.getNprojects();
final String username = input.getSearch().getUsername();

// Search for projects
logger.info("Searching for projects... " + input.getSearch().getProjects());
ForgeSearch search = defineForgeSearch(input.getForge());
ForgeCrawler crawler = defineForgeCrawler(input.getForge(), destinationFolder);

String term = input.getSearch().getProjects().get(0);

List<Project> allProjects = null;
if(username != null && !username.isEmpty()) {
allProjects = search.getProjects(term, username, 1);
} else {
allProjects = search.getProjects(term, 1,-1);
}
}

// Download and analyze projects
logger.info("Downloading and processing projects...");
ExecutorService ex = Executors.newFixedThreadPool(JsonInputFile.getMaxThreads());
List<Future<File>> downloadFutures = crawler.asyncDownloadProjects(projects);
List<Future<?>> analysisFutures = new ArrayList<Future<?>>();

for (int i = 0; i < downloadFutures.size(); i++) {
final Project project = projects.get(i);
final Future<File> repositoryFolderFuture = downloadFutures.get(i);
final Formater metricsFormat = input.getOutputformat();

analysisFutures.add(ex.submit(new Runnable() {
@Override
public void run() {
File checkedOutRepository = downloadAndCheckoutProject(project, datetime, repositoryFolderFuture);
//TODO the getProjects method already limits the number of searched projects
List<Project> projects = new ArrayList<Project>();
for (int i = 0; i < nProjects; i++) {
if (i < allProjects.size()) {
projects.add(allProjects.get(i));
}
}

if (checkedOutRepository != null) {
analyzeProject(project, checkedOutRepository, datetime, metricsFolder, metricsFormat);
// Download and analyze projects
logger.info("Downloading and processing projects...");
ExecutorService ex = Executors.newFixedThreadPool(JsonInputFile.getMaxThreads());
List<Future<File>> downloadFutures = crawler.asyncDownloadProjects(projects);
List<Future<?>> analysisFutures = new ArrayList<Future<?>>();

for (int i = 0; i < downloadFutures.size(); i++) {
final Project project = projects.get(i);
final Future<File> repositoryFolderFuture = downloadFutures.get(i);
final Formater metricsFormat = input.getOutputformat();

analysisFutures.add(ex.submit(new Runnable() {
@Override
public void run() {
File checkedOutRepository = downloadAndCheckoutProject(project, datetime, repositoryFolderFuture);

if (checkedOutRepository != null) {
analyzeProject(project, checkedOutRepository, datetime, metricsFolder, metricsFormat);
}
}
}
}));
}
}));
}

ex.shutdown();
for (int i = 0; i < analysisFutures.size(); i++) {
try {
analysisFutures.get(i).get();
} catch (InterruptedException | ExecutionException e) {
logger.error(format("Error while analyzing project %s", projects.get(i).getName()), e);
ex.shutdown();
for (int i = 0; i < analysisFutures.size(); i++) {
try {
analysisFutures.get(i).get();
} catch (InterruptedException | ExecutionException e) {
logger.error(format("Error while analyzing project %s", projects.get(i).getName()), e);
}
}
logger.info("All projects were downloaded and analyzed!");
}
logger.info("All projects were downloaded and analyzed!");


} catch (GroundhogException e) {
e.printStackTrace();
logger.error(e.getMessage());
} catch (UnknownHostException e1) {
e1.printStackTrace();
logger.error("Fail to acess MongoDB database, please check if its installed and running");
}
}

Expand Down
Loading