All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jdroid.gradle.android.task.PrefixVerificationTask.groovy Maven / Gradle / Ivy

package com.jdroid.gradle.android.task
import org.gradle.api.DefaultTask
import org.gradle.api.GradleException
import org.gradle.api.plugins.JavaBasePlugin
import org.gradle.api.tasks.TaskAction

import java.util.regex.Matcher
import java.util.regex.Pattern

public class PrefixVerificationTask extends DefaultTask {

	public PrefixVerificationTask() {
		group = JavaBasePlugin.VERIFICATION_GROUP
	}

	@TaskAction
	public void doExecute() {
		String prefix = project.jdroid.getStringProp('RESOURCE_PREFIX')

		if (prefix != null) {

			Set dirsToVerify = []
			project.android.sourceSets.each {
				dirsToVerify.addAll(it.res.srcDirs)
			}

			// Verify the res files prefix

			List dirPrefixesToVerify = ["drawable", "layout", "menu", "xml", "raw", "anim"]
			List filePrefixErrors = []

			dirsToVerify.each { File res ->
				res.listFiles().each {
					dirPrefixesToVerify.each { String dirPrefixToVerify ->
						if (it.isDirectory() && it.name.startsWith(dirPrefixToVerify)) {
							verifyFilePrefix(it, prefix, filePrefixErrors)
						}
					}
				}
			}

			if (!filePrefixErrors.isEmpty()) {
				println "The following files should start with the prefix: " + prefix
				filePrefixErrors.each {
					println " - " + it
				}
			}

			// Verify the values res names

			List valuesResNamesPrefixErrors = []

			dirsToVerify.each { File res ->

				res.listFiles().each {
					if (it.isDirectory() && it.name.startsWith("values")) {
						verifyValuesResNamePrefix(it, prefix, valuesResNamesPrefixErrors);
					}
				}
			}

			if (!valuesResNamesPrefixErrors.isEmpty()) {
				println "The following values res names should start with the prefix: " + prefix
				valuesResNamesPrefixErrors.each {
					println " - " + it
				}
			}

			if (!filePrefixErrors.isEmpty() || !valuesResNamesPrefixErrors.isEmpty()) {
				throw new GradleException("Prefix verification failed")
			}
		}
	}

	protected void verifyFilePrefix(File dirFile, String prefix, List errors) {
		List extensionsToVerify = [".xml", ".png"]
		dirFile.listFiles().each { File file ->
			String extension = file.name.replace(file.name.replaceFirst(~/\.[^\.]+$/, ''), "")
			if (!file.isDirectory() && extensionsToVerify.contains(extension) && !file.getName().startsWith(prefix)) {
				errors.add(file.absolutePath)
			}
		}
	}

	protected void verifyValuesResNamePrefix(File dirFile, String prefix, List errors) {
		List filesToIgnore = project.jdroid.getStringListProp('RESOURCE_FILES_TO_SKIP_PREFIX_VALIDATION', [])
		dirFile.listFiles().each { File file ->
			if (!filesToIgnore.contains(file.getName())) {
				file.eachLine { String line ->
					String name = getName(line)
					if (name != null && !name.toLowerCase().startsWith(prefix)) {
						errors.add(file.absolutePath + " -> " + name)
					}
				}
			}
		}
	}

	public static String getName(String line) {

		// TODO Verify the attr elements that are outside of a declare-styleable

		List elementsToVerify = ["string", "plurals", "color", "dimen", "declare-styleable", "style", "bool"]
		String key = null;
		for(String each : elementsToVerify) {
			if (line.trim().matches('^<\\s*' + each + '\\s.*name="[^"]*".*>$')) {
				Matcher matcher = Pattern.compile('name="([^"]*)".*>$').matcher(line.trim());
				matcher.find();
				key = matcher.group(1)
				break;
			}
		}
		return key;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy