From 647ed084601d7d4ef0f095261af658ca2256a247 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 26 Nov 2017 16:32:33 +0100 Subject: [PATCH] Add sonarqube (#37) --- .circleci/config.yml | 66 +++++++++++++------ .codecov.yml | 19 ------ README.md | 3 +- android-sonarqube.gradle | 36 ++++++++++ api/build.gradle | 43 ++++++++++-- .../java/io/github/wulkanowy/api/Cookies.java | 8 +-- .../wulkanowy/api/StudentAndParent.java | 12 ++-- .../github/wulkanowy/api/exams/ExamsWeek.java | 4 +- .../wulkanowy/api/grades/GradesList.java | 7 +- .../wulkanowy/api/grades/SubjectsList.java | 4 +- .../io/github/wulkanowy/api/login/Login.java | 2 +- .../wulkanowy/api/notes/AchievementsList.java | 10 +-- .../github/wulkanowy/api/notes/NotesList.java | 10 +-- .../wulkanowy/api/school/SchoolInfo.java | 4 +- .../wulkanowy/api/school/TeachersInfo.java | 4 +- .../wulkanowy/api/timetable/Timetable.java | 25 +++---- .../wulkanowy/api/user/BasicInformation.java | 21 +++--- .../wulkanowy/api/user/FamilyInformation.java | 4 +- app/build.gradle | 4 +- .../grades/GradesDialogFragment.java | 26 ++++---- .../dashboard/grades/GradesFragment.java | 5 +- .../activity/login/LoginActivity.java | 2 +- .../github/wulkanowy/dao/EntitiesCompare.java | 8 ++- .../io/github/wulkanowy/security/Safety.java | 2 +- .../github/wulkanowy/security/Scrambler.java | 2 +- .../services/VulcanSynchronization.java | 3 +- .../synchronisation/FirstAccountLogin.java | 3 +- .../utilities/AverageCalculator.java | 6 +- .../utilities/ConnectionUtilities.java | 6 +- .../utilities/ConversionVulcanObject.java | 6 +- .../wulkanowy/utilities/DateHelper.java | 6 +- .../wulkanowy/utilities/RootUtilities.java | 7 +- .../wulkanowy/dao/EntitiesCompareTest.java | 2 +- .../utilities/AverageCalculatorTest.java | 2 +- .../utilities/ConnectionUtilitiesTest.java | 2 +- .../utilities/ConversionVulcanObjectTest.java | 2 +- .../wulkanowy/utilities/DateHelperTest.java | 2 +- build.gradle | 11 ++-- jacoco.gradle | 36 ++++++++++ 39 files changed, 277 insertions(+), 148 deletions(-) delete mode 100644 .codecov.yml create mode 100644 android-sonarqube.gradle create mode 100644 jacoco.gradle diff --git a/.circleci/config.yml b/.circleci/config.yml index 557f06808..ea9c7e65e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -30,10 +30,10 @@ jobs: <<: *general_cache_key - run: name: Setup environment - command: ./gradlew --no-daemon --stacktrace dependencies || true + command: ./gradlew dependencies --no-daemon --stacktrace --console=plain -PdisablePreDex || true - run: name: Initial build - command: ./gradlew --no-daemon --stacktrace assembleDebug -PdisablePreDex + command: ./gradlew -x test -x lint build assembleDebug --no-daemon --stacktrace --console=plain -PdisablePreDex - store_artifacts: path: ./app/build/outputs/apk/ destination: apks/ @@ -54,12 +54,16 @@ jobs: <<: *general_cache_key - run: name: Run lint - command: ./gradlew --no-daemon --stacktrace lint + command: ./gradlew lint --no-daemon --stacktrace --console=plain -PdisablePreDex - store_artifacts: path: ./app/build/reports/ destination: lint_reports/app/ - store_test_results: path: ./app/build/reports/ + - persist_to_workspace: + root: *workspace_root + paths: + - "./app/build/reports/lint-results.xml" app-test: <<: *container_config @@ -69,15 +73,10 @@ jobs: <<: *general_cache_key - run: name: Run app tests - command: ./gradlew --no-daemon --stacktrace :app:test + command: ./gradlew :app:test :app:jacocoTestReport --no-daemon --stacktrace --console=plain -PdisablePreDex - run: name: Upload unit code coverage to codecov - command: | - ./gradlew --no-daemon --stacktrace :app:jacocoTestReport - bash <(curl -s https://codecov.io/bash) -F app - - run: - name: Upload code coverage to codacy - command: ./gradlew --no-daemon --stacktrace :app:codacyUpload + command: bash <(curl -s https://codecov.io/bash) -F app - store_artifacts: path: ./app/build/reports/tests/ destination: tests_reports/ @@ -86,6 +85,10 @@ jobs: destination: coverage_reports/ - store_test_results: path: ./app/build/test-results + - persist_to_workspace: + root: *workspace_root + paths: + - "./app/build/jacoco" api-test: <<: *container_config @@ -95,15 +98,10 @@ jobs: <<: *general_cache_key - run: name: Run api tests - command: ./gradlew --no-daemon --stacktrace :api:test + command: ./gradlew :api:test :api:jacocoTestReport --no-daemon --stacktrace --console=plain -PdisablePreDex - run: - name: Upload unit code coverage to codecov - command: | - ./gradlew --no-daemon --stacktrace :api:jacocoTestReport - bash <(curl -s https://codecov.io/bash) -F api - - run: - name: Upload code coverage to codacy - command: ./gradlew --no-daemon --stacktrace :api:codacyUpload + name: Upload code coverage to codecov + command: bash <(curl -s https://codecov.io/bash) -F api - store_artifacts: path: ./api/build/reports/tests/ destination: tests_reports/ @@ -112,6 +110,10 @@ jobs: destination: coverage_reports/ - store_test_results: path: ./api/build/test-results + - persist_to_workspace: + root: *workspace_root + paths: + - "./api/build/jacoco" instrumented: <<: *container_config @@ -137,7 +139,7 @@ jobs: command: ./gradlew clean --no-daemon --stacktrace --console=plain -PdisablePreDex - run: name: Run instrumented tests - command: ./gradlew connectedAndroidTest --no-daemon --stacktrace --console=plain -PdisablePreDex + command: ./gradlew createDebugCoverageReport --no-daemon --stacktrace --console=plain -PdisablePreDex - run: name: Collect logs from emulator command: adb logcat -d > ./app/build/reports/logcat_emulator.txt @@ -149,6 +151,23 @@ jobs: destination: reports - store_test_results: path: ./app/build/outputs/androidTest-results/connected/ + - persist_to_workspace: + root: *workspace_root + paths: + - "./app/build/outputs/code-coverage/connected" + + sonarcube: + <<: *container_config + steps: + - *attach_workspace + - restore_cache: + <<: *general_cache_key + - run: + name: Prepare coverage report + command: ./gradlew jacocoTestReport --no-daemon --stacktrace --console=plain -PdisablePreDex + - run: + name: Run sonarqube runner + command: ./gradlew -x test -x lint sonarqube -Dsonar.host.url=$SONAR_HOST -Dsonar.organization=$SONAR_ORG -Dsonar.login=$SONAR_KEY -Dsonar.branch.name=$CIRCLE_BRANCH --no-daemon --stacktrace --console=plain -PdisablePreDex workflows: version: 2 @@ -168,3 +187,12 @@ workflows: - instrumented: requires: - build + requires: + - build + - sonarcube: + requires: + - build + - lint + - app-test + - api-test + - instrumented diff --git a/.codecov.yml b/.codecov.yml deleted file mode 100644 index 44d53a1f2..000000000 --- a/.codecov.yml +++ /dev/null @@ -1,19 +0,0 @@ -coverage: - range: 60..100 - status: - project: - default: off - unit: - target: 20% - flags: unit - instrumented: - target: 20% - flags: instrumented - -flags: - unit: - paths: - - app/src/main/io/github/wulkanowy - instrumented: - paths: - - app/src/main/io/github/wulkanowy diff --git a/README.md b/README.md index adff0821d..dbe5827fe 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,9 @@ [![Codecov](https://img.shields.io/codecov/c/github/wulkanowy/wulkanowy.svg?style=flat-square)](https://codecov.io/gh/wulkanowy/wulkanowy) [![Dependency Status](https://www.versioneye.com/user/projects/5969ff0b0fb24f004f8c711b/badge.svg?style=flat-square)](https://www.versioneye.com/user/projects/5969ff0b0fb24f004f8c711b) [![CircleCI](https://img.shields.io/circleci/project/github/wulkanowy/wulkanowy.svg?style=flat-square)](https://circleci.com/gh/wulkanowy/wulkanowy) -[![Build Status](https://www.bitrise.io/app/daeff1893f3c8128.svg?token=Hjm1ACamk86JDeVVJHOeqQ&branch=master)](https://www.bitrise.io/app/daeff1893f3c8128) +[![Bitrise](https://img.shields.io/bitrise/daeff1893f3c8128/master.svg?token=Hjm1ACamk86JDeVVJHOeqQ&style=flat-square)](https://www.bitrise.io/app/daeff1893f3c8128) [![BCH compliance](https://bettercodehub.com/edge/badge/wulkanowy/wulkanowy?branch=master)](https://bettercodehub.com/) +[![Bintray](https://img.shields.io/bintray/v/wulkanowy/wulkanowy/api.svg?style=flat-square)](https://bintray.com/wulkanowy/wulkanowy/api) [Pobierz wersjÄ™ rozwojowÄ…](https://bitrise-redirector.herokuapp.com/v0.1/apps/daeff1893f3c8128/builds/master/artifacts/app-debug.apk) diff --git a/android-sonarqube.gradle b/android-sonarqube.gradle new file mode 100644 index 000000000..b9284eeac --- /dev/null +++ b/android-sonarqube.gradle @@ -0,0 +1,36 @@ +apply plugin: 'org.sonarqube' + +sonarqube { + + //noinspection GroovyAssignabilityCheck + properties { + def files = fileTree("${rootProject.projectDir}/api/build/libs/").filter { it.isFile() }.files.name + def libraries = project.android.sdkDirectory.getPath() + "/platforms/android-27/android.jar," + + "${project.rootDir}/api/build/libs/" + files[0] + + property "sonar.projectName", GROUP_ID + ":app" + property "sonar.projectKey", GROUP_ID + ":app" + + property "sonar.sources", "src/main/java" + property "sonar.exclusions", "build/**,**/*.png,*.iml, **/*generated*," + + "src/**/entities/*.java, src/androidTest/**/entities/*.java" + property "sonar.import_unknown_files", true + + // Defines where the java files are + property "sonar.binaries", "build/intermediates/classes/debug" + property "sonar.libraries", libraries + + // Defines where the xml files are + property "sonar.java.binaries", "build/intermediates/classes/debug" + property "sonar.java.libraries", libraries + + // Analyze tests classes + property "sonar.tests", "src/test/java, src/androidTest/java" + property "sonar.java.test.binaries", "build/intermediates/classes/debug" + property "sonar.java.test.libraries", libraries + + property "sonar.java.coveragePlugin", "jacoco" + property "sonar.android.lint.report", "build/reports/lint-results.xml" + property "sonar.jacoco.reportPaths", fileTree(dir: project.projectDir, includes: ['**/*.exec', '**/*.ec']) + } +} diff --git a/api/build.gradle b/api/build.gradle index f82733bfb..70b32dd20 100644 --- a/api/build.gradle +++ b/api/build.gradle @@ -1,6 +1,6 @@ apply plugin: 'java-library' +apply plugin: 'org.sonarqube' apply plugin: 'jacoco' -apply plugin: "io.github.ddimtirov.codacy" apply plugin: 'com.jfrog.bintray' apply plugin: 'com.github.dcendents.android-maven' @@ -8,9 +8,9 @@ sourceCompatibility = "1.7" targetCompatibility = "1.7" ext { - PUBLISH_GROUP_ID = 'io.github.wulkanowy' + PUBLISH_GROUP_ID = GROUP_ID PUBLISH_ARTIFACT_ID = 'api' - PUBLISH_VERSION = '0.1.0' + PUBLISH_VERSION = System.getenv('GIT_TAG') } test { @@ -21,6 +21,12 @@ test { } } +jacocoTestReport { + reports { + xml.enabled true + } +} + dependencies { implementation 'org.jsoup:jsoup:1.10.3' implementation 'org.apache.commons:commons-lang3:3.6' @@ -29,9 +35,18 @@ dependencies { testImplementation 'org.mockito:mockito-core:2.11.0' } +version = PUBLISH_VERSION +group = GROUP_ID + +sonarqube { + properties { + property "sonar.projectName", GROUP_ID + ":api" + property "sonar.projectKey", GROUP_ID + ":wulkanowy-api" + } +} + def siteUrl = 'https://github.com/wulkanowy/wulkanowy' def gitUrl = 'https://github.com/wulkanowy/wulkanowy.git' -version = '0.1.0' bintray { user = System.getenv('BINTRAY_USER') @@ -45,10 +60,11 @@ bintray { vcsUrl = gitUrl labels = ['aar', 'android', 'wulkanowy', 'api'] publicDownloadNumbers = true + publish = true version { - name = '0.1.0' - vcsTag = '0.1.0' + name = PUBLISH_VERSION + vcsTag = PUBLISH_VERSION released = new Date() } } @@ -83,3 +99,18 @@ install { } } } + +task sourcesJar(type: Jar, dependsOn: classes) { + classifier = 'sources' + from sourceSets.main.allSource +} + +task javadocJar(type: Jar, dependsOn: javadoc) { + classifier = 'javadoc' + from javadoc.destinationDir +} + +artifacts { + archives sourcesJar + archives javadocJar +} diff --git a/api/src/main/java/io/github/wulkanowy/api/Cookies.java b/api/src/main/java/io/github/wulkanowy/api/Cookies.java index 2fe49f312..c97d96588 100644 --- a/api/src/main/java/io/github/wulkanowy/api/Cookies.java +++ b/api/src/main/java/io/github/wulkanowy/api/Cookies.java @@ -5,19 +5,19 @@ import java.util.Map; public class Cookies { - private Map cookies = new HashMap<>(); + private Map jar = new HashMap<>(); public Map getItems() { - return cookies; + return jar; } public Cookies setItems(Map items) { - this.cookies = items; + this.jar = items; return this; } public Cookies addItems(Map items) { - this.cookies.putAll(items); + this.jar.putAll(items); return this; } } diff --git a/api/src/main/java/io/github/wulkanowy/api/StudentAndParent.java b/api/src/main/java/io/github/wulkanowy/api/StudentAndParent.java index 09e18fcbd..dea8b8688 100644 --- a/api/src/main/java/io/github/wulkanowy/api/StudentAndParent.java +++ b/api/src/main/java/io/github/wulkanowy/api/StudentAndParent.java @@ -16,7 +16,9 @@ public class StudentAndParent extends Api { private String baseUrl = "https://uonetplus-opiekun.vulcan.net.pl/{symbol}/{ID}/"; - private String gradesPageUrl = baseUrl + "Oceny/Wszystkie"; + private static final String SYMBOL_PLACEHOLDER = "{symbol}"; + + private static final String GRADES_PAGE_URL = "Oceny/Wszystkie"; private String symbol; @@ -33,7 +35,7 @@ public class StudentAndParent extends Api { } public String getGradesPageUrl() { - return gradesPageUrl; + return baseUrl + GRADES_PAGE_URL; } public String getBaseUrl() { @@ -58,11 +60,11 @@ public class StudentAndParent extends Api { public String getSnpPageUrl() throws IOException, NotLoggedInErrorException { if (null != getId()) { - return getBaseUrl().replace("{symbol}", getSymbol()).replace("{ID}", getId()); + return getBaseUrl().replace(SYMBOL_PLACEHOLDER, getSymbol()).replace("{ID}", getId()); } // get url to uonetplus-opiekun.vulcan.net.pl - Document startPage = getPageByUrl(getStartPageUrl().replace("{symbol}", getSymbol())); + Document startPage = getPageByUrl(getStartPageUrl().replace(SYMBOL_PLACEHOLDER, getSymbol())); Element studentTileLink = startPage.select(".panel.linkownia.pracownik.klient > a").first(); if (null == studentTileLink) { @@ -92,7 +94,7 @@ public class StudentAndParent extends Api { public Document getSnPPageDocument(String url) throws IOException { return getPageByUrl(getBaseUrl() - .replace("{symbol}", getSymbol()) + .replace(SYMBOL_PLACEHOLDER, getSymbol()) .replace("{ID}", getId()) + url); } diff --git a/api/src/main/java/io/github/wulkanowy/api/exams/ExamsWeek.java b/api/src/main/java/io/github/wulkanowy/api/exams/ExamsWeek.java index 2c2555764..0cb326fe8 100644 --- a/api/src/main/java/io/github/wulkanowy/api/exams/ExamsWeek.java +++ b/api/src/main/java/io/github/wulkanowy/api/exams/ExamsWeek.java @@ -14,7 +14,7 @@ public class ExamsWeek { private final StudentAndParent snp; - private final String examsPageUrl = "Sprawdziany.mvc/Terminarz?rodzajWidoku=2&data="; + private static final String EXAMS_PAGE_URL = "Sprawdziany.mvc/Terminarz?rodzajWidoku=2&data="; public ExamsWeek(StudentAndParent snp) { this.snp = snp; @@ -25,7 +25,7 @@ public class ExamsWeek { } public Week getWeek(String tick, final boolean onlyNotEmpty) throws IOException { - Document examsPage = snp.getSnPPageDocument(examsPageUrl + tick); + Document examsPage = snp.getSnPPageDocument(EXAMS_PAGE_URL + tick); Elements examsDays = examsPage.select(".mainContainer > div:not(.navigation)"); List days = new ArrayList<>(); diff --git a/api/src/main/java/io/github/wulkanowy/api/grades/GradesList.java b/api/src/main/java/io/github/wulkanowy/api/grades/GradesList.java index 0c5a577a8..123e648ba 100644 --- a/api/src/main/java/io/github/wulkanowy/api/grades/GradesList.java +++ b/api/src/main/java/io/github/wulkanowy/api/grades/GradesList.java @@ -16,13 +16,12 @@ import java.util.regex.Pattern; import io.github.wulkanowy.api.Semester; import io.github.wulkanowy.api.StudentAndParent; -import io.github.wulkanowy.api.login.LoginErrorException; public class GradesList { private StudentAndParent snp = null; - private String gradesPageUrl = "Oceny/Wszystkie?details=2&okres="; + private static final String GRADES_PAGE_URL = "Oceny/Wszystkie?details=2&okres="; private List grades = new ArrayList<>(); @@ -31,10 +30,10 @@ public class GradesList { } public String getGradesPageUrl() { - return gradesPageUrl; + return GRADES_PAGE_URL; } - public List getAll() throws IOException, LoginErrorException, ParseException { + public List getAll() throws IOException, ParseException { return getAll(""); } diff --git a/api/src/main/java/io/github/wulkanowy/api/grades/SubjectsList.java b/api/src/main/java/io/github/wulkanowy/api/grades/SubjectsList.java index 89132eda8..fef666c77 100644 --- a/api/src/main/java/io/github/wulkanowy/api/grades/SubjectsList.java +++ b/api/src/main/java/io/github/wulkanowy/api/grades/SubjectsList.java @@ -14,14 +14,14 @@ public class SubjectsList { private StudentAndParent snp = null; - private String subjectsPageUrl = "Oceny/Wszystkie?details=1"; + private static final String SUBJECTS_PAGE_URL = "Oceny/Wszystkie?details=1"; public SubjectsList(StudentAndParent snp) { this.snp = snp; } public List getAll() throws IOException { - Document subjectPage = snp.getSnPPageDocument(subjectsPageUrl); + Document subjectPage = snp.getSnPPageDocument(SUBJECTS_PAGE_URL); Elements rows = subjectPage.select(".ocenyZwykle-table > tbody > tr"); diff --git a/api/src/main/java/io/github/wulkanowy/api/login/Login.java b/api/src/main/java/io/github/wulkanowy/api/login/Login.java index dbed792c5..70a79fe2e 100644 --- a/api/src/main/java/io/github/wulkanowy/api/login/Login.java +++ b/api/src/main/java/io/github/wulkanowy/api/login/Login.java @@ -90,7 +90,7 @@ public class Login extends Api { Elements els = Jsoup.parse(certificate.replaceAll(":", ""), "", Parser.xmlParser()) .select("[AttributeName=\"UserInstance\"] samlAttributeValue"); - if (0 == els.size()) { + if (els.isEmpty()) { return ""; } diff --git a/api/src/main/java/io/github/wulkanowy/api/notes/AchievementsList.java b/api/src/main/java/io/github/wulkanowy/api/notes/AchievementsList.java index 7c67f25ba..ee41f71cc 100644 --- a/api/src/main/java/io/github/wulkanowy/api/notes/AchievementsList.java +++ b/api/src/main/java/io/github/wulkanowy/api/notes/AchievementsList.java @@ -13,23 +13,23 @@ public class AchievementsList { private StudentAndParent snp = null; - private List achievementsList = new ArrayList<>(); + private List achievements = new ArrayList<>(); - private String notesPageUrl = "UwagiOsiagniecia.mvc/Wszystkie"; + private static final String NOTES_PAGE_URL = "UwagiOsiagniecia.mvc/Wszystkie"; public AchievementsList(StudentAndParent snp) { this.snp = snp; } public List getAllAchievements() throws IOException { - Element pageFragment = snp.getSnPPageDocument(notesPageUrl) + Element pageFragment = snp.getSnPPageDocument(NOTES_PAGE_URL) .select(".mainContainer > div").get(1); Elements items = pageFragment.select("article"); for (Element item : items) { - achievementsList.add(item.text()); + achievements.add(item.text()); } - return achievementsList; + return achievements; } } diff --git a/api/src/main/java/io/github/wulkanowy/api/notes/NotesList.java b/api/src/main/java/io/github/wulkanowy/api/notes/NotesList.java index df24ae907..4ee6bb648 100644 --- a/api/src/main/java/io/github/wulkanowy/api/notes/NotesList.java +++ b/api/src/main/java/io/github/wulkanowy/api/notes/NotesList.java @@ -13,23 +13,23 @@ public class NotesList { private StudentAndParent snp = null; - private List notesList = new ArrayList<>(); + private List notes = new ArrayList<>(); - private String notesPageUrl = "UwagiOsiagniecia.mvc/Wszystkie"; + private static final String NOTES_PAGE_URL = "UwagiOsiagniecia.mvc/Wszystkie"; public NotesList(StudentAndParent snp) { this.snp = snp; } public List getAllNotes() throws IOException { - Element pageFragment = snp.getSnPPageDocument(notesPageUrl) + Element pageFragment = snp.getSnPPageDocument(NOTES_PAGE_URL) .select(".mainContainer > div").get(0); Elements items = pageFragment.select("article"); Elements dates = pageFragment.select("h2"); int index = 0; for (Element item : items) { - notesList.add(new Note() + notes.add(new Note() .setDate(dates.get(index++).text()) .setTeacher(snp.getRowDataChildValue(item, 1)) .setCategory(snp.getRowDataChildValue(item, 2)) @@ -37,6 +37,6 @@ public class NotesList { ); } - return notesList; + return notes; } } diff --git a/api/src/main/java/io/github/wulkanowy/api/school/SchoolInfo.java b/api/src/main/java/io/github/wulkanowy/api/school/SchoolInfo.java index 2013fa171..44bd77033 100644 --- a/api/src/main/java/io/github/wulkanowy/api/school/SchoolInfo.java +++ b/api/src/main/java/io/github/wulkanowy/api/school/SchoolInfo.java @@ -10,14 +10,14 @@ public class SchoolInfo { private StudentAndParent snp = null; - private String schoolPageUrl = "Szkola.mvc/Nauczyciele"; + private static final String SCHOOL_PAGE_URL = "Szkola.mvc/Nauczyciele"; public SchoolInfo(StudentAndParent snp) { this.snp = snp; } public SchoolData getSchoolData() throws IOException { - Element e = snp.getSnPPageDocument(schoolPageUrl) + Element e = snp.getSnPPageDocument(SCHOOL_PAGE_URL) .select(".mainContainer > article").get(0); return new SchoolData() diff --git a/api/src/main/java/io/github/wulkanowy/api/school/TeachersInfo.java b/api/src/main/java/io/github/wulkanowy/api/school/TeachersInfo.java index b56aabc5f..f37b7c543 100644 --- a/api/src/main/java/io/github/wulkanowy/api/school/TeachersInfo.java +++ b/api/src/main/java/io/github/wulkanowy/api/school/TeachersInfo.java @@ -14,14 +14,14 @@ public class TeachersInfo { private StudentAndParent snp = null; - private String schoolPageUrl = "Szkola.mvc/Nauczyciele"; + private static final String SCHOOL_PAGE_URL = "Szkola.mvc/Nauczyciele"; public TeachersInfo(StudentAndParent snp) { this.snp = snp; } public TeachersData getTeachersData() throws IOException { - Document doc = snp.getSnPPageDocument(schoolPageUrl); + Document doc = snp.getSnPPageDocument(SCHOOL_PAGE_URL); Elements rows = doc.select(".mainContainer > table tbody tr"); String description = doc.select(".mainContainer > p").first().text(); diff --git a/api/src/main/java/io/github/wulkanowy/api/timetable/Timetable.java b/api/src/main/java/io/github/wulkanowy/api/timetable/Timetable.java index a00a6e877..87750a672 100644 --- a/api/src/main/java/io/github/wulkanowy/api/timetable/Timetable.java +++ b/api/src/main/java/io/github/wulkanowy/api/timetable/Timetable.java @@ -9,24 +9,23 @@ import java.util.ArrayList; import java.util.List; import io.github.wulkanowy.api.StudentAndParent; -import io.github.wulkanowy.api.login.LoginErrorException; public class Timetable { private StudentAndParent snp; - private String timetablePageUrl = "Lekcja.mvc/PlanLekcji?data="; + private static final String TIMETABLE_PAGE_URL = "Lekcja.mvc/PlanLekcji?data="; public Timetable(StudentAndParent snp) { this.snp = snp; } - public Week getWeekTable() throws IOException, LoginErrorException { + public Week getWeekTable() throws IOException { return getWeekTable(""); } public Week getWeekTable(String tick) throws IOException { - Element table = snp.getSnPPageDocument(timetablePageUrl + tick) + Element table = snp.getSnPPageDocument(TIMETABLE_PAGE_URL + tick) .select(".mainContainer .presentData").first(); Elements tableHeaderCells = table.select("thead th"); @@ -100,14 +99,14 @@ public class Timetable { lesson.setRoom(spans.get(3).text()); } - lesson = getLessonGroupDivisionInfo(lesson, spans); - lesson = getLessonTypeInfo(lesson, spans); - lesson = getLessonDescriptionInfo(lesson, spans); + addGroupDivisionInfo(lesson, spans); + adTypeInfo(lesson, spans); + addDescriptionInfo(lesson, spans); return lesson; } - private Lesson getLessonGroupDivisionInfo(Lesson lesson, Elements e) { + private void addGroupDivisionInfo(Lesson lesson, Elements e) { if ((4 == e.size() && (e.first().attr("class").equals("")) || (5 == e.size() && e.first().hasClass(Lesson.CLASS_NEW_MOVED_IN_OR_CHANGED)))) { lesson.setDivisionIntoGroups(true); @@ -118,11 +117,9 @@ public class Timetable { lesson.setTeacher(e.get(2).text()); lesson.setRoom(e.get(3).text()); } - - return lesson; } - private Lesson getLessonTypeInfo(Lesson lesson, Elements e) { + private void adTypeInfo(Lesson lesson, Elements e) { if (e.first().hasClass(Lesson.CLASS_MOVED_OR_CANCELED)) { lesson.setMovedOrCanceled(true); } else if (e.first().hasClass(Lesson.CLASS_NEW_MOVED_IN_OR_CHANGED)) { @@ -135,17 +132,13 @@ public class Timetable { || e.first().attr("class").equals("")) { lesson.setRealized(true); } - - return lesson; } - private Lesson getLessonDescriptionInfo(Lesson lesson, Elements e) { + private void addDescriptionInfo(Lesson lesson, Elements e) { if ((4 == e.size() || 5 == e.size()) && (e.first().hasClass(Lesson.CLASS_MOVED_OR_CANCELED) || e.first().hasClass(Lesson.CLASS_NEW_MOVED_IN_OR_CHANGED))) { lesson.setDescription(StringUtils.substringBetween(e.last().text(), "(", ")")); } - - return lesson; } } diff --git a/api/src/main/java/io/github/wulkanowy/api/user/BasicInformation.java b/api/src/main/java/io/github/wulkanowy/api/user/BasicInformation.java index 7c93cb866..2a1a01f8d 100644 --- a/api/src/main/java/io/github/wulkanowy/api/user/BasicInformation.java +++ b/api/src/main/java/io/github/wulkanowy/api/user/BasicInformation.java @@ -6,15 +6,16 @@ import org.jsoup.nodes.Element; import java.io.IOException; import io.github.wulkanowy.api.StudentAndParent; -import io.github.wulkanowy.api.login.LoginErrorException; public class BasicInformation { - private static Document studentDataPageDocument; + private Document studentDataPageDocument; private StudentAndParent snp; - private String studentDataPageUrl = "Uczen.mvc/DanePodstawowe"; + private static final String STUDENT_DATA_PAGE_URL = "Uczen.mvc/DanePodstawowe"; + + private static final String CONTENT_QUERY = ".mainContainer > article"; public BasicInformation(StudentAndParent snp) { this.snp = snp; @@ -22,14 +23,14 @@ public class BasicInformation { public Document getStudentDataPageDocument() throws IOException { if (null == studentDataPageDocument) { - studentDataPageDocument = snp.getSnPPageDocument(studentDataPageUrl); + studentDataPageDocument = snp.getSnPPageDocument(STUDENT_DATA_PAGE_URL); } return studentDataPageDocument; } - public PersonalData getPersonalData() throws IOException, LoginErrorException { - Element e = getStudentDataPageDocument().select(".mainContainer > article").get(0); + public PersonalData getPersonalData() throws IOException { + Element e = getStudentDataPageDocument().select(CONTENT_QUERY).get(0); String name = snp.getRowDataChildValue(e, 1); String[] names = name.split(" "); @@ -47,8 +48,8 @@ public class BasicInformation { .setParentsNames(snp.getRowDataChildValue(e, 7)); } - public AddressData getAddressData() throws IOException, LoginErrorException { - Element e = getStudentDataPageDocument().select(".mainContainer > article").get(1); + public AddressData getAddressData() throws IOException { + Element e = getStudentDataPageDocument().select(CONTENT_QUERY).get(1); return new AddressData() .setAddress(snp.getRowDataChildValue(e, 1)) @@ -57,8 +58,8 @@ public class BasicInformation { } - public ContactDetails getContactDetails() throws IOException, LoginErrorException { - Element e = getStudentDataPageDocument().select(".mainContainer > article").get(2); + public ContactDetails getContactDetails() throws IOException { + Element e = getStudentDataPageDocument().select(CONTENT_QUERY).get(2); return new ContactDetails() .setPhoneNumber(snp.getRowDataChildValue(e, 1)) diff --git a/api/src/main/java/io/github/wulkanowy/api/user/FamilyInformation.java b/api/src/main/java/io/github/wulkanowy/api/user/FamilyInformation.java index 0bb8d3c46..214224f8f 100644 --- a/api/src/main/java/io/github/wulkanowy/api/user/FamilyInformation.java +++ b/api/src/main/java/io/github/wulkanowy/api/user/FamilyInformation.java @@ -13,14 +13,14 @@ public class FamilyInformation { private StudentAndParent snp; - private String studentDataPageUrl = "Uczen.mvc/DanePodstawowe"; + private static final String STUDENT_DATA_PAGE_URL = "Uczen.mvc/DanePodstawowe"; public FamilyInformation(StudentAndParent snp) { this.snp = snp; } public List getFamilyMembers() throws IOException { - Elements membersElements = snp.getSnPPageDocument(studentDataPageUrl) + Elements membersElements = snp.getSnPPageDocument(STUDENT_DATA_PAGE_URL) .select(".mainContainer > article:nth-of-type(n+4)"); List familyMembers = new ArrayList<>(); diff --git a/app/build.gradle b/app/build.gradle index 245a48596..9e0cbf11c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.application' -apply plugin: 'jacoco-android' -apply plugin: "io.github.ddimtirov.codacy" apply plugin: 'org.greenrobot.greendao' +apply from: '../jacoco.gradle' +apply from: '../android-sonarqube.gradle' android { compileSdkVersion 27 diff --git a/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradesDialogFragment.java b/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradesDialogFragment.java index e7ba236b0..5c85bd723 100644 --- a/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradesDialogFragment.java +++ b/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradesDialogFragment.java @@ -86,22 +86,20 @@ public class GradesDialogFragment extends DialogFragment { public static int colorHexToColorName(String hexColor) { switch (hexColor) { - case "000000": { + case "000000": return R.string.color_black_text; - } - case "F04C4C": { - return R.string.color_red_text; - } - case "20A4F7": { - return R.string.color_blue_text; - } - case "6ECD07": { - return R.string.color_green_text; - } - default: { - return R.string.noColor_text; - } + case "F04C4C": + return R.string.color_red_text; + + case "20A4F7": + return R.string.color_blue_text; + + case "6ECD07": + return R.string.color_green_text; + + default: + return R.string.noColor_text; } } } diff --git a/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradesFragment.java b/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradesFragment.java index d3d92e69e..b50307f91 100644 --- a/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradesFragment.java +++ b/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradesFragment.java @@ -106,7 +106,7 @@ public class GradesFragment extends Fragment { for (Subject subject : account.getSubjectList()) { List gradeList = subject.getGradeList(); - if (gradeList.size() != 0) { + if (!gradeList.isEmpty()) { SubjectWithGrades subjectWithGrades = new SubjectWithGrades(subject.getName(), gradeList); subjectWithGradesList.add(subjectWithGrades); } @@ -133,11 +133,12 @@ public class GradesFragment extends Fragment { return null; } + @Override protected void onPostExecute(Void result) { super.onPostExecute(result); createExpList(mainView.get(), activity.get()); mainView.get().findViewById(R.id.loadingPanel).setVisibility(View.INVISIBLE); - if (subjectWithGradesList.size() == 0) { + if (subjectWithGradesList.isEmpty()) { mainView.get().findViewById(R.id.fragment_no_grades).setVisibility(View.VISIBLE); } } diff --git a/app/src/main/java/io/github/wulkanowy/activity/login/LoginActivity.java b/app/src/main/java/io/github/wulkanowy/activity/login/LoginActivity.java index cb3638a90..c7063ee1d 100644 --- a/app/src/main/java/io/github/wulkanowy/activity/login/LoginActivity.java +++ b/app/src/main/java/io/github/wulkanowy/activity/login/LoginActivity.java @@ -202,7 +202,7 @@ public class LoginActivity extends Activity { || ev.getAction() == MotionEvent.ACTION_MOVE) && view instanceof EditText && !view.getClass().getName().startsWith("android.webkit.")) { - int coordinators[] = new int[2]; + int[] coordinators = new int[2]; view.getLocationOnScreen(coordinators); float x = ev.getRawX() + view.getLeft() - coordinators[0]; float y = ev.getRawY() + view.getTop() - coordinators[1]; diff --git a/app/src/main/java/io/github/wulkanowy/dao/EntitiesCompare.java b/app/src/main/java/io/github/wulkanowy/dao/EntitiesCompare.java index 50b88eb64..4b815d772 100644 --- a/app/src/main/java/io/github/wulkanowy/dao/EntitiesCompare.java +++ b/app/src/main/java/io/github/wulkanowy/dao/EntitiesCompare.java @@ -7,7 +7,11 @@ import java.util.List; import io.github.wulkanowy.dao.entities.Grade; -public abstract class EntitiesCompare { +public class EntitiesCompare { + + private EntitiesCompare() { + throw new IllegalStateException("Utility class"); + } public static List compareGradeList(List newList, List oldList) { @@ -18,7 +22,7 @@ public abstract class EntitiesCompare { List lastList = new ArrayList<>(); for (Grade grade : addedOrUpdatedGradeList) { - if (oldList.size() != 0) { + if (!oldList.isEmpty()) { grade.setRead(false); grade.setIsNew(true); } diff --git a/app/src/main/java/io/github/wulkanowy/security/Safety.java b/app/src/main/java/io/github/wulkanowy/security/Safety.java index d4969eb7b..1ae36dd67 100644 --- a/app/src/main/java/io/github/wulkanowy/security/Safety.java +++ b/app/src/main/java/io/github/wulkanowy/security/Safety.java @@ -8,7 +8,7 @@ import io.github.wulkanowy.utilities.RootUtilities; public class Safety extends Scrambler { - public String encrypt(String email, String plainText, Context context) throws CryptoException, UnsupportedOperationException { + public String encrypt(String email, String plainText, Context context) throws CryptoException { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { loadKeyStore(); diff --git a/app/src/main/java/io/github/wulkanowy/security/Scrambler.java b/app/src/main/java/io/github/wulkanowy/security/Scrambler.java index 08fae7dd6..7e7ffb8c0 100644 --- a/app/src/main/java/io/github/wulkanowy/security/Scrambler.java +++ b/app/src/main/java/io/github/wulkanowy/security/Scrambler.java @@ -32,7 +32,7 @@ public class Scrambler { private static final String ANDROID_KEYSTORE = "AndroidKeyStore"; - public final static String DEBUG_TAG = "WulkanowySecurity"; + public static final String DEBUG_TAG = "WulkanowySecurity"; private KeyStore keyStore; diff --git a/app/src/main/java/io/github/wulkanowy/services/VulcanSynchronization.java b/app/src/main/java/io/github/wulkanowy/services/VulcanSynchronization.java index fcd0dccd1..27f25ed0b 100644 --- a/app/src/main/java/io/github/wulkanowy/services/VulcanSynchronization.java +++ b/app/src/main/java/io/github/wulkanowy/services/VulcanSynchronization.java @@ -39,8 +39,7 @@ public class VulcanSynchronization { } public void firstLoginSignInStep(Context context, DaoSession daoSession) - throws NotLoggedInErrorException, AccountPermissionException, IOException, CryptoException, - UnsupportedOperationException { + throws NotLoggedInErrorException, AccountPermissionException, IOException, CryptoException { if (firstAccountLogin != null && certificate != null) { loginSession = firstAccountLogin.login(context, daoSession, certificate); } else { diff --git a/app/src/main/java/io/github/wulkanowy/services/synchronisation/FirstAccountLogin.java b/app/src/main/java/io/github/wulkanowy/services/synchronisation/FirstAccountLogin.java index e24300f4a..9df840d55 100644 --- a/app/src/main/java/io/github/wulkanowy/services/synchronisation/FirstAccountLogin.java +++ b/app/src/main/java/io/github/wulkanowy/services/synchronisation/FirstAccountLogin.java @@ -44,8 +44,7 @@ public class FirstAccountLogin { } public LoginSession login(Context context, DaoSession daoSession, String certificate) - throws NotLoggedInErrorException, AccountPermissionException, IOException, CryptoException, - UnsupportedOperationException { + throws NotLoggedInErrorException, AccountPermissionException, IOException, CryptoException{ long userId; diff --git a/app/src/main/java/io/github/wulkanowy/utilities/AverageCalculator.java b/app/src/main/java/io/github/wulkanowy/utilities/AverageCalculator.java index 0eb590a98..9c665fd41 100644 --- a/app/src/main/java/io/github/wulkanowy/utilities/AverageCalculator.java +++ b/app/src/main/java/io/github/wulkanowy/utilities/AverageCalculator.java @@ -4,7 +4,11 @@ import java.util.List; import io.github.wulkanowy.dao.entities.Grade; -public abstract class AverageCalculator { +public class AverageCalculator { + + private AverageCalculator() { + throw new IllegalStateException("Utility class"); + } public static float calculate(List gradeList) { diff --git a/app/src/main/java/io/github/wulkanowy/utilities/ConnectionUtilities.java b/app/src/main/java/io/github/wulkanowy/utilities/ConnectionUtilities.java index fa37bfd35..4701cf5a8 100644 --- a/app/src/main/java/io/github/wulkanowy/utilities/ConnectionUtilities.java +++ b/app/src/main/java/io/github/wulkanowy/utilities/ConnectionUtilities.java @@ -4,7 +4,11 @@ import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; -public abstract class ConnectionUtilities { +public class ConnectionUtilities { + + private ConnectionUtilities() { + throw new IllegalStateException("Utility class"); + } public static boolean isOnline(Context context) { ConnectivityManager connectivityManager = diff --git a/app/src/main/java/io/github/wulkanowy/utilities/ConversionVulcanObject.java b/app/src/main/java/io/github/wulkanowy/utilities/ConversionVulcanObject.java index 72601d051..342b93680 100644 --- a/app/src/main/java/io/github/wulkanowy/utilities/ConversionVulcanObject.java +++ b/app/src/main/java/io/github/wulkanowy/utilities/ConversionVulcanObject.java @@ -7,7 +7,11 @@ import java.util.List; import io.github.wulkanowy.dao.entities.Grade; import io.github.wulkanowy.dao.entities.Subject; -public abstract class ConversionVulcanObject { +public class ConversionVulcanObject { + + private ConversionVulcanObject() { + throw new IllegalStateException("Utility class"); + } public static List subjectsToSubjectEntities(List subjectList) { diff --git a/app/src/main/java/io/github/wulkanowy/utilities/DateHelper.java b/app/src/main/java/io/github/wulkanowy/utilities/DateHelper.java index bb7591293..52c4c22ec 100644 --- a/app/src/main/java/io/github/wulkanowy/utilities/DateHelper.java +++ b/app/src/main/java/io/github/wulkanowy/utilities/DateHelper.java @@ -7,12 +7,16 @@ import java.util.Date; import java.util.Locale; import java.util.TimeZone; -abstract public class DateHelper { +public class DateHelper { private static final long TICKS_AT_EPOCH = 621355968000000000L; private static final long TICKS_PER_MILLISECOND = 10000; + private DateHelper() { + throw new IllegalStateException("Utility class"); + } + public static long getTicks(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); diff --git a/app/src/main/java/io/github/wulkanowy/utilities/RootUtilities.java b/app/src/main/java/io/github/wulkanowy/utilities/RootUtilities.java index d71d51c5d..7bdf162f2 100644 --- a/app/src/main/java/io/github/wulkanowy/utilities/RootUtilities.java +++ b/app/src/main/java/io/github/wulkanowy/utilities/RootUtilities.java @@ -1,11 +1,14 @@ package io.github.wulkanowy.utilities; - import android.os.Build; import java.io.File; -abstract public class RootUtilities { +public class RootUtilities { + + private RootUtilities() { + throw new IllegalStateException("Utility class"); + } public static boolean isRooted() { String buildTags = Build.TAGS; diff --git a/app/src/test/java/io/github/wulkanowy/dao/EntitiesCompareTest.java b/app/src/test/java/io/github/wulkanowy/dao/EntitiesCompareTest.java index 8bac5b5e7..a5e84d7f3 100644 --- a/app/src/test/java/io/github/wulkanowy/dao/EntitiesCompareTest.java +++ b/app/src/test/java/io/github/wulkanowy/dao/EntitiesCompareTest.java @@ -10,7 +10,7 @@ import java.util.List; import io.github.wulkanowy.dao.entities.Grade; -public class EntitiesCompareTest extends EntitiesCompare { +public class EntitiesCompareTest { private List newList = new ArrayList<>(); diff --git a/app/src/test/java/io/github/wulkanowy/utilities/AverageCalculatorTest.java b/app/src/test/java/io/github/wulkanowy/utilities/AverageCalculatorTest.java index c40a8149c..303930cf1 100644 --- a/app/src/test/java/io/github/wulkanowy/utilities/AverageCalculatorTest.java +++ b/app/src/test/java/io/github/wulkanowy/utilities/AverageCalculatorTest.java @@ -8,7 +8,7 @@ import java.util.List; import io.github.wulkanowy.dao.entities.Grade; -public class AverageCalculatorTest extends AverageCalculator { +public class AverageCalculatorTest { @Test public void averageTest() { diff --git a/app/src/test/java/io/github/wulkanowy/utilities/ConnectionUtilitiesTest.java b/app/src/test/java/io/github/wulkanowy/utilities/ConnectionUtilitiesTest.java index 62cc366d9..12decc077 100644 --- a/app/src/test/java/io/github/wulkanowy/utilities/ConnectionUtilitiesTest.java +++ b/app/src/test/java/io/github/wulkanowy/utilities/ConnectionUtilitiesTest.java @@ -10,7 +10,7 @@ import org.junit.Test; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class ConnectionUtilitiesTest extends ConnectionUtilities { +public class ConnectionUtilitiesTest { @Test public void isOnlineTrueTest() { diff --git a/app/src/test/java/io/github/wulkanowy/utilities/ConversionVulcanObjectTest.java b/app/src/test/java/io/github/wulkanowy/utilities/ConversionVulcanObjectTest.java index b74d13d5d..48e8ac8b8 100644 --- a/app/src/test/java/io/github/wulkanowy/utilities/ConversionVulcanObjectTest.java +++ b/app/src/test/java/io/github/wulkanowy/utilities/ConversionVulcanObjectTest.java @@ -9,7 +9,7 @@ import java.util.List; import io.github.wulkanowy.api.grades.Grade; import io.github.wulkanowy.api.grades.Subject; -public class ConversionVulcanObjectTest extends ConversionVulcanObject { +public class ConversionVulcanObjectTest { @Test public void subjectConversionTest() { diff --git a/app/src/test/java/io/github/wulkanowy/utilities/DateHelperTest.java b/app/src/test/java/io/github/wulkanowy/utilities/DateHelperTest.java index d6a99def7..653c5c86f 100644 --- a/app/src/test/java/io/github/wulkanowy/utilities/DateHelperTest.java +++ b/app/src/test/java/io/github/wulkanowy/utilities/DateHelperTest.java @@ -11,7 +11,7 @@ import java.util.Date; import java.util.Locale; import java.util.TimeZone; -public class DateHelperTest extends DateHelper { +public class DateHelperTest { @Test public void getTicksDateObjectTest() throws Exception { diff --git a/build.gradle b/build.gradle index d2ca29587..6fd4d5c7d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,3 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - buildscript { repositories { jcenter() @@ -8,13 +6,12 @@ buildscript { maven { url 'https://maven.google.com' } } dependencies { - classpath 'com.android.tools.build:gradle:3.0.0' + classpath 'com.android.tools.build:gradle:3.0.1' classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files - classpath 'com.dicedmelon.gradle:jacoco-android:0.1.2' - classpath "gradle.plugin.io.github.ddimtirov:codacy-gradle-plugin:0.1.0" + classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.6.1" classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1' } @@ -31,6 +28,10 @@ subprojects { } } +ext { + GROUP_ID = "io.github.wulkanowy" +} + allprojects { repositories { jcenter() diff --git a/jacoco.gradle b/jacoco.gradle new file mode 100644 index 000000000..47a077ca8 --- /dev/null +++ b/jacoco.gradle @@ -0,0 +1,36 @@ +apply plugin: "jacoco" + +jacoco { + toolVersion "0.7.4.201502262128" +} + +// run ./gradlew clean createDebugCoverageReport jacocoTestReport +task jacocoTestReport(type: JacocoReport) { + + group = "Reporting" + description = "Generate Jacoco coverage reports" + + reports { + xml.enabled = true + html.enabled = true + } + + def fileFilter = ["**/R.class", + "**/R\$*.class", + "**/BuildConfig.*", + "**/Manifest*.*", + "android/**/*.*", + "**/Lambda.class", + "**/*Lambda.class", + "**/*Lambda*.class", + "**/*Lambda*.*", + "**/*Builder.*" + ] + + def debugTree = fileTree(dir: "${buildDir}/intermediates/classes/debug", excludes: fileFilter) + def mainSrc = "${project.projectDir}/src/main/java" + + sourceDirectories = files([mainSrc]) + classDirectories = files([debugTree]) + executionData = fileTree(dir: project.projectDir, includes: ["**/*.exec" , "**/*.ec"]) +}