This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit 01fc08c0a1fb72d4b6205a53ec5ad350a61445df Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Aug 31 16:31:05 2016 +0200 improve files scanning to detect validators → detect more things --- .../application-swing-validation_en_GB.properties | 16 +++ .../application-swing-validation_es_ES.properties | 16 +++ .../application-swing-validation_fr_FR.properties | 16 +++ .../checkapi/GenerateI18nValidatorFieldsMojo.java | 99 +++------------ .../checkapi/GenerateValidatorMojoSupport.java | 103 ++++++++++++++++ .../checkapi/GenerateValidatorsDescriptorMojo.java | 93 ++------------ .../plugins/checkapi/ValidatorCacheRequest.java | 2 - .../maven/plugins/checkapi/ValidatorsCache.java | 136 ++++++++++++++++----- 8 files changed, 286 insertions(+), 195 deletions(-) diff --git a/application-swing-validation/src/main/resources/i18n/application-swing-validation_en_GB.properties b/application-swing-validation/src/main/resources/i18n/application-swing-validation_en_GB.properties index abb0bf9..bafba3e 100644 --- a/application-swing-validation/src/main/resources/i18n/application-swing-validation_en_GB.properties +++ b/application-swing-validation/src/main/resources/i18n/application-swing-validation_en_GB.properties @@ -3,9 +3,14 @@ observe.common.activitySeine=Activity observe.common.baitHaulingStatus=Bait hauling status observe.common.baitSettingStatus=Bait setting status observe.common.baitType=Bait type +observe.common.baitsComposition=Baits composition +observe.common.baitsCompositionProportionSum=Baits composition proportion sum observe.common.basket=Basket observe.common.basketsPerSectionCount=Basket per section count observe.common.branchline=Branchline +observe.common.branchlineLength=Branchline length +observe.common.branchlinesComposition=Branchlines composition +observe.common.branchlinesCompositionProportionSum=Branchlines composition proportion sum observe.common.branchlinesPerBasketCount=Branchlines per basket count observe.common.brandName=Brand name observe.common.capacity=Capacity @@ -46,6 +51,10 @@ observe.common.fishingStart=Fishing start observe.common.flagCountry=Flag country observe.common.fleetCountry=Fleet country observe.common.floatingObjectEmpty=Floating object empty +observe.common.floatline1Length=floatline 1 length +observe.common.floatline2Length=floatline 2 length +observe.common.floatlinesComposition=floatlines composition +observe.common.floatlinesCompositionProportionSum=floatlines composition proportion sum observe.common.formsUrl=Forms url observe.common.fpaZone=Fpa zone observe.common.gaugeLabel=Gauge label @@ -68,6 +77,8 @@ observe.common.hookOffset=Hook offset observe.common.hookPosition=Hook position observe.common.hookSize=Hook size observe.common.hookType=Hook type +observe.common.hooksComposition=hooks composition +observe.common.hooksCompositionProportionSum=hooks composition proportion sum observe.common.individualSize=Individual size observe.common.individualWeight=Individual weight observe.common.iso2Code=Iso 2 code @@ -131,6 +142,7 @@ observe.common.sensorType=Sensor type observe.common.settingEndLatitude=Setting end latitude observe.common.settingEndLongitude=Setting end longitude observe.common.settingEndTimeStamp=Setting end timeStamp +observe.common.settingIdentifier=Setting identifier observe.common.settingShape=Setting shape observe.common.settingStartLatitude=Setting start latitude observe.common.settingStartLongitude=Setting start longitude @@ -153,6 +165,7 @@ observe.common.stomacFullness=Stomac fullness observe.common.supportVesselName=Support vessel name observe.common.surroundingActivity=Surrounding activity observe.common.swivelWeight=Swivel weight +observe.common.targetCatch=Target catch observe.common.time=Time observe.common.timeBetweenHooks=Time between hooks observe.common.topType=Top type @@ -161,6 +174,7 @@ observe.common.totalCount=Count observe.common.totalHooksCount=Total hooks count observe.common.totalSectionsCount=Total section count observe.common.totalWeight=Total weight +observe.common.tracelineLength=Traceline length observe.common.tracelineType=Traceline type observe.common.transmittingBuoyOperation=Transmitting buoy operation observe.common.transmittingBuoyType=Transmitting buoy type @@ -174,7 +188,9 @@ observe.common.vesselSpeed=Vessel spped observe.common.vesselType=Vessel type observe.common.waveHeight=Wave weight observe.common.weight=Weight +observe.common.weightCategory=Weight category observe.common.weightLengthFormula=Weight length formula +observe.common.well=Well observe.common.wind=Wind observe.common.wormsId=Worms id observe.common.yearService=Year service diff --git a/application-swing-validation/src/main/resources/i18n/application-swing-validation_es_ES.properties b/application-swing-validation/src/main/resources/i18n/application-swing-validation_es_ES.properties index 90cf79c..a42f520 100644 --- a/application-swing-validation/src/main/resources/i18n/application-swing-validation_es_ES.properties +++ b/application-swing-validation/src/main/resources/i18n/application-swing-validation_es_ES.properties @@ -3,9 +3,14 @@ observe.common.activitySeine=Actividad observe.common.baitHaulingStatus=Estatuto del cebo en el arrastre observe.common.baitSettingStatus=Estatuto del cebo en la calada observe.common.baitType=Tipo de cebo +observe.common.baitsComposition=Cebo +observe.common.baitsCompositionProportionSum=Suma de los proporciónes de cebo (%) observe.common.basket=Cesta observe.common.basketsPerSectionCount=Número de cestas por sección observe.common.branchline=Arponcillo +observe.common.branchlineLength=Arponcillo (m) +observe.common.branchlinesComposition=Arponcillos +observe.common.branchlinesCompositionProportionSum=Suma de los proporciónes de arponcillos (%) observe.common.branchlinesPerBasketCount=Número de anzuelos por cesta observe.common.brandName=Marca observe.common.capacity=Capacidad de transporte @@ -46,6 +51,10 @@ observe.common.fishingStart=Inicio de pesca observe.common.flagCountry=Badera observe.common.fleetCountry=País observe.common.floatingObjectEmpty=Objeto flotante vacía +observe.common.floatline1Length=Orinque 1 (m) +observe.common.floatline2Length=Orinque 2 (m) +observe.common.floatlinesComposition=Orinques +observe.common.floatlinesCompositionProportionSum=Suma de los proporciónes de los orinques (%) observe.common.formsUrl=URL de los formularios observe.common.fpaZone=Zona FPA observe.common.gaugeLabel=Texto «Capacidad» @@ -68,6 +77,8 @@ observe.common.hookOffset=Offset anzuelo (°) observe.common.hookPosition=Posición del anzuelo observe.common.hookSize=Tamaño observe.common.hookType=Tipo de anzuelo +observe.common.hooksComposition=Anzuelos +observe.common.hooksCompositionProportionSum=Suma de los proporciónes de anzuelos (%) observe.common.individualSize=Tamaño (cm) observe.common.individualWeight=Peso (kg) observe.common.iso2Code=Código ISO-2 @@ -131,6 +142,7 @@ observe.common.sensorType=Tipo de sensor observe.common.settingEndLatitude=Calada latitude observe.common.settingEndLongitude=Calada longitud observe.common.settingEndTimeStamp=Timestamp de fin +observe.common.settingIdentifier=Identificador Calada observe.common.settingShape=Forma de la calada observe.common.settingStartLatitude=Calada latitude observe.common.settingStartLongitude=Calada longitud @@ -153,6 +165,7 @@ observe.common.stomacFullness=Nivel de llenado del estomago observe.common.supportVesselName=Nombre del supply observe.common.surroundingActivity=Actividad circundante observe.common.swivelWeight=Peso de el destorcedor (kg) +observe.common.targetCatch=Captura de atún observe.common.time=Hora observe.common.timeBetweenHooks=Temps entre anzuelos (s) observe.common.topType=Tipo parte superior @@ -161,6 +174,7 @@ observe.common.totalCount=Número estimado observe.common.totalHooksCount=Número total d'arponcillos observe.common.totalSectionsCount=Número total de secciones observe.common.totalWeight=Peso +observe.common.tracelineLength=Parte baja (m) observe.common.tracelineType=Tipo bajo de línea observe.common.transmittingBuoyOperation=Operación baliza observe.common.transmittingBuoyType=Tipo de baliza @@ -174,7 +188,9 @@ observe.common.vesselSpeed=Velocidad del barco (nd) observe.common.vesselType=Tipo de pesquería observe.common.waveHeight=Texto descriptivo de «altura media de la ola» observe.common.weight=Peso (en t) +observe.common.weightCategory=Categoría de peso observe.common.weightLengthFormula=Relación de tallas +observe.common.well=Tanque observe.common.wind=Viento Beaufort observe.common.wormsId=Worms observe.common.yearService=año de entrada en servicio diff --git a/application-swing-validation/src/main/resources/i18n/application-swing-validation_fr_FR.properties b/application-swing-validation/src/main/resources/i18n/application-swing-validation_fr_FR.properties index 351fa5a..915935c 100644 --- a/application-swing-validation/src/main/resources/i18n/application-swing-validation_fr_FR.properties +++ b/application-swing-validation/src/main/resources/i18n/application-swing-validation_fr_FR.properties @@ -3,9 +3,14 @@ observe.common.activitySeine=Activité observe.common.baitHaulingStatus=Statut appât au virage observe.common.baitSettingStatus=Statut appât au filage observe.common.baitType=Type d'appât +observe.common.baitsComposition=Appâts +observe.common.baitsCompositionProportionSum=Somme des proportions d'appâts (%) observe.common.basket=Panier observe.common.basketsPerSectionCount=Nombre de panier par section observe.common.branchline=Avançon +observe.common.branchlineLength=Longueur Avançon (m) +observe.common.branchlinesComposition=Avançons +observe.common.branchlinesCompositionProportionSum=Somme des proportions d'avançons (%) observe.common.branchlinesPerBasketCount=Nombre d'hameçons par panier observe.common.brandName=Marque observe.common.capacity=Capacité transport (m³) @@ -46,6 +51,10 @@ observe.common.fishingStart=Début pêche observe.common.flagCountry=Pavillon observe.common.fleetCountry=Flotte observe.common.floatingObjectEmpty=Objet flottant vide +observe.common.floatline1Length=Orin 1 (m) +observe.common.floatline2Length=Orin 2 (m) +observe.common.floatlinesComposition=Orins +observe.common.floatlinesCompositionProportionSum=Somme des proportions d'orins (%) observe.common.formsUrl=URL des formulaires observe.common.fpaZone=Zone FPA observe.common.gaugeLabel=Libellé jauge @@ -68,6 +77,8 @@ observe.common.hookOffset=Offset hameçon (°) observe.common.hookPosition=Position de l'hameçon observe.common.hookSize=Taille d'hameçon observe.common.hookType=Type d'hameçon +observe.common.hooksComposition=Hameçons +observe.common.hooksCompositionProportionSum=Somme des proportions d'hameçons (%) observe.common.individualSize=Taille (cm) observe.common.individualWeight=Poids (kg) observe.common.iso2Code=code ISO-2 @@ -131,6 +142,7 @@ observe.common.sensorType=Type observe.common.settingEndLatitude=Latitude de fin de filage observe.common.settingEndLongitude=Longitude de fin de filage observe.common.settingEndTimeStamp=Horodatage fin +observe.common.settingIdentifier=Identifiant Filage observe.common.settingShape=Forme du filage observe.common.settingStartLatitude=Latitude de début de filage observe.common.settingStartLongitude=\=Longitude de début de filage @@ -153,6 +165,7 @@ observe.common.stomacFullness=État de l'estomac observe.common.supportVesselName=Nom supply observe.common.surroundingActivity=Activité environnante observe.common.swivelWeight=Poids de l'émerillon (kg) +observe.common.targetCatch=Capture cible observe.common.time=Heure observe.common.timeBetweenHooks=Temps entre hameçons (s) observe.common.topType=Type @@ -161,6 +174,7 @@ observe.common.totalCount=Nombre estimé observe.common.totalHooksCount=Nombre total d'avançons observe.common.totalSectionsCount=Nombre total de sections observe.common.totalWeight=Poids total +observe.common.tracelineLength=Partie basse (m) observe.common.tracelineType=Type bas de ligne observe.common.transmittingBuoyOperation=Opération balise observe.common.transmittingBuoyType=Type de balise @@ -174,7 +188,9 @@ observe.common.vesselSpeed=Vitesse bateau (nd) observe.common.vesselType=Type de pêcherie observe.common.waveHeight=Libellé Hauteur moyenne vagues observe.common.weight=Poids (en t) +observe.common.weightCategory=Catégorie de poids observe.common.weightLengthFormula=Relation Taille +observe.common.well=Cuve observe.common.wind=Vent Beaufort observe.common.wormsId=Worms observe.common.yearService=Année de mise en service diff --git a/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/GenerateI18nValidatorFieldsMojo.java b/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/GenerateI18nValidatorFieldsMojo.java index a06aea4..64d4e29 100644 --- a/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/GenerateI18nValidatorFieldsMojo.java +++ b/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/GenerateI18nValidatorFieldsMojo.java @@ -4,18 +4,14 @@ import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; -import org.apache.maven.project.MavenProject; -import org.nuiton.plugin.AbstractPlugin; import org.nuiton.plugin.PluginHelper; import java.io.BufferedWriter; import java.io.File; -import java.net.MalformedURLException; -import java.net.URLClassLoader; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Set; @@ -30,16 +26,7 @@ import java.util.TreeSet; * @since 5.0 */ @Mojo(name = "generate-i18n-validator-fields", defaultPhase = LifecyclePhase.GENERATE_RESOURCES, requiresDependencyResolution = ResolutionScope.COMPILE) -class GenerateI18nValidatorFieldsMojo extends AbstractPlugin implements ValidatorCacheRequest { - - @Parameter(defaultValue = "${project}", required = true, readonly = true) - private MavenProject project; - - @Parameter(defaultValue = "${project.basedir}/src/main/resources", required = true) - private File sourceRoot; - - @Parameter(defaultValue = "${project.basedir}/src/main/validators/validators.xml", required = true) - private File validatorsFile; +class GenerateI18nValidatorFieldsMojo extends GenerateValidatorMojoSupport { /** * Un flag pour activer le mode verbeux. @@ -58,54 +45,33 @@ class GenerateI18nValidatorFieldsMojo extends AbstractPlugin implements Validato private boolean skip; /** - * Encoding a utiliser pour lire et ecrire les fichiers. - * - * @since 1.0.0 - */ - @Parameter(property = "i18n.encoding", defaultValue = "${project.build.sourceEncoding}", required = true) - protected String encoding; - - /** * To set the package fully qualified name of the generated class. * * By default, will use groupId.artifactId (with {@code -} replaced by {@code .}). */ - @Parameter(property = "i18n.packageName") + @Parameter(property = "generateI18nValidatorFields.packageName") private String packageName; /** * Name of the generated class. */ - @Parameter(property = "i18n.className", defaultValue = "I18nValidatorHelper", required = true) + @Parameter(property = "generateI18nValidatorFields.className", defaultValue = "I18nValidatorHelper", required = true) private String className; /** * Prefix to add to generated i18n keys. */ - @Parameter(property = "i18n.prefix") + @Parameter(property = "generateI18nValidatorFields.prefix") private String prefix; + /** * The root directory where to generated. */ - @Parameter(property = "i18n.outputDirectory", defaultValue = "${basedir}/target/generated-sources/java", required = true) + @Parameter(property = "generateI18nValidatorFields.outputDirectory", defaultValue = "${basedir}/target/generated-sources/java", required = true) private File outputDirectory; - @Parameter(property = "generateI18nValidatorFields.contexts", required = true) - private String[] contexts; - - private Path outputFile; - - private Collection<ValidatorsCache.ValidatorInfo> validators; - @Override - protected void init() throws Exception { - - if (skip) { - return; - } - if (getLog().isDebugEnabled()) { - setVerbose(true); - } + protected Path createOutputFile() throws IOException { if (packageName == null) { @@ -116,33 +82,22 @@ class GenerateI18nValidatorFieldsMojo extends AbstractPlugin implements Validato Files.createDirectories(directory); - outputFile = directory.resolve(className + ".java"); - - validators = ValidatorsCache.get().getValidators(this); + return directory.resolve(className + ".java"); } @Override - protected boolean checkSkip() { - if (skip) { - getLog().info("Skipping goal (skip flag is on)."); - return false; - } - if (validators.isEmpty()) { - getLog().info("Skipping goal (no validator detected)."); - return false; - } - - return super.checkSkip(); + protected boolean isSkip() { + return skip; } @Override public void doAction() throws Exception { if (isVerbose()) { - getLog().info("project = " + project); + getLog().info("project = " + getProject()); } - getLog().info("Generate to " + outputFile); + getLog().info("Generate to " + getOutputFile()); List<String> compileSourceRoots = getProject().getCompileSourceRoots(); @@ -154,13 +109,13 @@ class GenerateI18nValidatorFieldsMojo extends AbstractPlugin implements Validato } Set<String> fields = new TreeSet<>(); - for (ValidatorsCache.ValidatorInfo validator : validators) { + for (ValidatorsCache.ValidatorInfo validator : getValidators()) { fields.addAll(validator.getFields()); } getLog().info(fields.size() + " field(s) detected."); - try (BufferedWriter writer = Files.newBufferedWriter(outputFile, StandardCharsets.UTF_8)) { + try (BufferedWriter writer = Files.newBufferedWriter(getOutputFile(), StandardCharsets.UTF_8)) { writer.write("// Generated by " + getClass().getName() + " at " + new Date() + "\n"); writer.write("package " + packageName + ";\n"); @@ -187,37 +142,13 @@ class GenerateI18nValidatorFieldsMojo extends AbstractPlugin implements Validato @Override - public MavenProject getProject() { - return project; - } - - @Override public boolean isVerbose() { return verbose; } @Override - public String[] getContexts() { - return contexts; - } - - @Override - public URLClassLoader getUrlClassLoader() throws MalformedURLException { - return initClassLoader(project, validatorsFile.getParentFile(), true, false, true, true, false); - } - - @Override - public void setProject(MavenProject project) { - this.project = project; - } - - @Override public void setVerbose(boolean verbose) { this.verbose = verbose; } - @Override - public Path getSourceRootPath() { - return sourceRoot.toPath(); - } } diff --git a/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/GenerateValidatorMojoSupport.java b/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/GenerateValidatorMojoSupport.java new file mode 100644 index 0000000..ba3212e --- /dev/null +++ b/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/GenerateValidatorMojoSupport.java @@ -0,0 +1,103 @@ +package fr.ird.observe.maven.plugins.checkapi; + +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.project.MavenProject; +import org.nuiton.plugin.AbstractPlugin; + +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URLClassLoader; +import java.nio.file.Path; +import java.util.Collection; + +/** + * Created on 31/08/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public abstract class GenerateValidatorMojoSupport extends AbstractPlugin implements ValidatorCacheRequest { + + @Parameter(defaultValue = "${project}", required = true, readonly = true) + private MavenProject project; + + @Parameter(defaultValue = "${project.basedir}/src/main/resources", required = true) + private File sourceRoot; + + @Parameter(defaultValue = "${project.basedir}/src/main/validators/validators.xml", required = true) + private File validatorsFile; + + private Path outputFile; + + private Collection<ValidatorsCache.ValidatorInfo> validators; + + @Override + protected void init() throws Exception { + + if (isSkip()) { + return; + } + if (getLog().isDebugEnabled()) { + setVerbose(true); + } + + outputFile = createOutputFile(); + + validators = ValidatorsCache.get().getValidators(this); + + } + + @Override + protected boolean checkSkip() { + if (isSkip()) { + getLog().info("Skipping goal (skip flag is on)."); + return false; + } + if (validators.isEmpty()) { + getLog().info("Skipping goal (no validator detected)."); + return false; + } + + return super.checkSkip(); + } + + protected abstract Path createOutputFile() throws IOException; + + protected abstract boolean isSkip(); + + @Override + public MavenProject getProject() { + return project; + } + + public File getSourceRoot() { + return sourceRoot; + } + + public File getValidatorsFile() { + return validatorsFile; + } + + public Path getOutputFile() { + return outputFile; + } + + public Collection<ValidatorsCache.ValidatorInfo> getValidators() { + return validators; + } + + @Override + public Path getSourceRootPath() { + return getSourceRoot().toPath(); + } + + @Override + public void setProject(MavenProject project) { + this.project = project; + } + + @Override + public URLClassLoader getUrlClassLoader() throws MalformedURLException { + return initClassLoader(project, validatorsFile.getParentFile(), true, false, true, true, false); + } +} diff --git a/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/GenerateValidatorsDescriptorMojo.java b/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/GenerateValidatorsDescriptorMojo.java index 0d7015a..d0ebcc0 100644 --- a/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/GenerateValidatorsDescriptorMojo.java +++ b/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/GenerateValidatorsDescriptorMojo.java @@ -8,17 +8,13 @@ import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; -import org.apache.maven.project.MavenProject; -import org.nuiton.plugin.AbstractPlugin; import java.io.File; -import java.net.MalformedURLException; -import java.net.URLClassLoader; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.Set; import java.util.TreeSet; @@ -32,22 +28,13 @@ import java.util.TreeSet; * @since 5.0 */ @Mojo(name = "generate-validators-descriptor", defaultPhase = LifecyclePhase.GENERATE_RESOURCES, requiresDependencyResolution = ResolutionScope.COMPILE) -class GenerateValidatorsDescriptorMojo extends AbstractPlugin implements ValidatorCacheRequest { - - @Parameter(defaultValue = "${project}", required = true, readonly = true) - private MavenProject project; - - @Parameter(defaultValue = "${project.basedir}/src/main/resources", required = true) - private File sourceRoot; - - @Parameter(defaultValue = "${project.basedir}/src/main/resources/validators.xml", required = true) - private File validatorsFile; +class GenerateValidatorsDescriptorMojo extends GenerateValidatorMojoSupport { /** * The root directory where to generated. */ @Parameter(property = "generateValidatorsDescriptor.outputFile", defaultValue = "${project.build.outputDirectory}/META-INF/validators/${project.artifactId}.json", required = true) - private File outputFile; + private File outputFile = null; /** * Un flag pour activer le mode verbeux. @@ -55,7 +42,7 @@ class GenerateValidatorsDescriptorMojo extends AbstractPlugin implements Validat * @since 1.0.0 */ @Parameter(property = "generateValidatorsDescriptor.verbose", defaultValue = "${maven.verbose}") - private boolean verbose; + private boolean verbose = false; /** * A flag to skip the goal. @@ -63,67 +50,38 @@ class GenerateValidatorsDescriptorMojo extends AbstractPlugin implements Validat * @since 1.0.0 */ @Parameter(property = "generateValidatorsDescriptor.skip", defaultValue = "false") - private boolean skip; - - /** - * Encoding a utiliser pour lire et ecrire les fichiers. - * - * @since 1.0.0 - */ - @Parameter(property = "generateValidatorsDescriptor.encoding", defaultValue = "${project.build.sourceEncoding}", required = true) - protected String encoding; - - @Parameter(property = "generateValidatorsDescriptor.contexts", required = true) - private String[] contexts; - - private Collection<ValidatorsCache.ValidatorInfo> validators; + private boolean skip = false; @Override - protected void init() throws Exception { - - if (skip) { - return; - } - if (getLog().isDebugEnabled()) { - setVerbose(true); - } + protected Path createOutputFile() throws IOException { Files.createDirectories(outputFile.getParentFile().toPath()); + return outputFile.toPath(); - validators = ValidatorsCache.get().getValidators(this); } @Override - protected boolean checkSkip() { - if (skip) { - getLog().info("Skipping goal (skip flag is on)."); - return false; - } - if (validators.isEmpty()) { - getLog().info("Skipping goal (no validator detected)."); - return false; - } - - return super.checkSkip(); + protected boolean isSkip() { + return skip; } @Override public void doAction() throws Exception { if (isVerbose()) { - getLog().info("project = " + project); + getLog().info("project = " + getProject()); } - getLog().info("Generate to " + outputFile); + getLog().info("Generate to " + getOutputFile()); Set<String> fields = new TreeSet<>(); - for (ValidatorsCache.ValidatorInfo validator : validators) { + for (ValidatorsCache.ValidatorInfo validator : getValidators()) { fields.addAll(validator.getFields()); } getLog().info(fields.size() + " field(s) detected."); - ArrayList<ValidatorsCache.ValidatorInfo> validatorList = new ArrayList<>(validators); + ArrayList<ValidatorsCache.ValidatorInfo> validatorList = new ArrayList<>(getValidators()); Collections.sort(validatorList, (o1, o2) -> o1.getType().getName().compareToIgnoreCase(o2.getType().getName())); @@ -145,39 +103,14 @@ class GenerateValidatorsDescriptorMojo extends AbstractPlugin implements Validat } - - @Override - public MavenProject getProject() { - return project; - } - @Override public boolean isVerbose() { return verbose; } @Override - public String[] getContexts() { - return contexts; - } - - @Override - public URLClassLoader getUrlClassLoader() throws MalformedURLException { - return initClassLoader(project, validatorsFile.getParentFile(), true, false, true, true, false); - } - - @Override - public void setProject(MavenProject project) { - this.project = project; - } - - @Override public void setVerbose(boolean verbose) { this.verbose = verbose; } - @Override - public Path getSourceRootPath() { - return sourceRoot.toPath(); - } } diff --git a/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/ValidatorCacheRequest.java b/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/ValidatorCacheRequest.java index 8ca27f7..ad9826c 100644 --- a/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/ValidatorCacheRequest.java +++ b/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/ValidatorCacheRequest.java @@ -19,7 +19,5 @@ public interface ValidatorCacheRequest { boolean isVerbose(); - String[] getContexts(); - URLClassLoader getUrlClassLoader() throws MalformedURLException; } diff --git a/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/ValidatorsCache.java b/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/ValidatorsCache.java index f505deb..03700f3 100644 --- a/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/ValidatorsCache.java +++ b/maven-plugin/src/main/java/fr/ird/observe/maven/plugins/checkapi/ValidatorsCache.java @@ -12,10 +12,13 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; -import java.util.Arrays; import java.util.Collection; +import java.util.EnumSet; import java.util.LinkedHashSet; +import java.util.Objects; import java.util.Set; +import java.util.StringTokenizer; +import java.util.stream.Collectors; /** * Created on 31/08/16. @@ -68,40 +71,41 @@ public class ValidatorsCache { Log log = request.getLog(); boolean verbose = request.isVerbose(); Path sourceRootPath = request.getSourceRootPath(); - String[] contexts = request.getContexts(); - String key = sourceRootPath.toFile().getAbsolutePath() + "#" + String.join("-", (CharSequence[]) contexts); + String key = sourceRootPath.toFile().getAbsolutePath(); if (!validators.containsKey(key)) { - log.info("Loading validators " + Arrays.toString(contexts) + " from " + sourceRootPath); + log.info("Loading validators from " + sourceRootPath); ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); try { - Thread.currentThread().setContextClassLoader(request.getUrlClassLoader()); - Set<Class<?>> types = new PathSimpleFileVisitor(log, sourceRootPath, verbose).walk(); - - NuitonValidatorScope[] scopes = NuitonValidatorScope.values(); + PathSimpleFileVisitorResult result = new PathSimpleFileVisitor(log, sourceRootPath, verbose).walk(); - for (String context : contexts) { + NuitonValidatorScope[] scopes = result.getEffectiveScopes(); - for (Class<?> type : types) { + for (ValidatorDescriptor descritptor : result.descritptors) { - SimpleBeanValidator<?> validator = SimpleBeanValidator.newValidator(type, context, scopes); + String typeName = descritptor.getTypeName(); + String context = descritptor.getContext(); - for (NuitonValidatorScope scope : validator.getEffectiveScopes()) { + Class<?> type = Class.forName(typeName); - Set<String> effectiveFields = validator.getEffectiveFields(scope); - ValidatorInfo validatorInfo = new ValidatorInfo(type, context, scope, effectiveFields); - validators.put(key, validatorInfo); - } + SimpleBeanValidator<?> validator = SimpleBeanValidator.newValidator(type, context, scopes); + for (NuitonValidatorScope scope : validator.getEffectiveScopes()) { + Set<String> effectiveFields = validator.getEffectiveFields(scope); + ValidatorInfo validatorInfo = new ValidatorInfo(type, context, scope, effectiveFields); + validators.put(key, validatorInfo); } + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); } finally { Thread.currentThread().setContextClassLoader(contextClassLoader); @@ -112,9 +116,69 @@ public class ValidatorsCache { return validators.get(key); } + + private static class PathSimpleFileVisitorResult { + + private final Set<ValidatorDescriptor> descritptors; + + private PathSimpleFileVisitorResult(Set<ValidatorDescriptor> descritptors) { + this.descritptors = descritptors; + } + + + public NuitonValidatorScope[] getEffectiveScopes() { + + EnumSet<NuitonValidatorScope> result = EnumSet.noneOf(NuitonValidatorScope.class); + result.addAll(descritptors.stream().map(ValidatorDescriptor::getScope).collect(Collectors.toList())); + return result.toArray(new NuitonValidatorScope[result.size()]); + } + + } + + private static class ValidatorDescriptor { + + private final String typeName; + private final String context; + private final NuitonValidatorScope scope; + + private ValidatorDescriptor(String typeName, String context, NuitonValidatorScope scope) { + this.typeName = typeName; + this.context = context; + this.scope = scope; + } + + public String getTypeName() { + return typeName; + } + + public String getContext() { + return context; + } + + public NuitonValidatorScope getScope() { + return scope; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ValidatorDescriptor that = (ValidatorDescriptor) o; + return Objects.equals(getTypeName(), that.getTypeName()) && + Objects.equals(getContext(), that.getContext()) && + getScope() == that.getScope(); + } + + @Override + public int hashCode() { + return Objects.hash(getTypeName(), getContext(), getScope()); + } + } + private static class PathSimpleFileVisitor extends SimpleFileVisitor<Path> { - private final Set<Class<?>> types = new LinkedHashSet<>(); + private final Set<ValidatorDescriptor> descritptors = new LinkedHashSet<>(); + private final Set<String> scopes = new LinkedHashSet<>(); private final Log log; private final Path sourceRootPath; private final boolean verbose; @@ -126,14 +190,18 @@ public class ValidatorsCache { this.log = log; this.sourceRootPath = sourceRootPath; this.verbose = verbose; + + for (NuitonValidatorScope scope : NuitonValidatorScope.values()) { + scopes.add(scope.name().toLowerCase()); + } } - public Set<Class<?>> walk() throws IOException { + public PathSimpleFileVisitorResult walk() throws IOException { Files.walkFileTree(sourceRootPath, this); - log.info(types.size() + " type(s) detected."); - return types; + log.info(descritptors.size() + " type(s) detected."); + return new PathSimpleFileVisitorResult(descritptors); } @Override @@ -165,17 +233,27 @@ public class ValidatorsCache { if (name.endsWith("-validation.xml")) { int i = name.indexOf('-'); String typeName = packageName + "." + name.substring(0, i); - try { - Class<?> type = Class.forName(typeName); + String rest = name.substring(i); + LinkedHashSet<String> contexts = new LinkedHashSet<>(); + StringTokenizer tok = new StringTokenizer(rest, "-"); + NuitonValidatorScope scope = null; + while (tok.hasMoreTokens()) { + + String token = tok.nextToken(); + if (scopes.contains(token)) { + scope = NuitonValidatorScope.valueOf(token.toUpperCase()); + break; + } + contexts.add(token); + } + String context = String.join("-", contexts); + ValidatorDescriptor descritptor = new ValidatorDescriptor(typeName, context, scope); - boolean add = types.add(type); - if (add) { - if (verbose) { - log.info("Register " + typeName); - } + boolean add = descritptors.add(descritptor); + if (add) { + if (verbose) { + log.info("Register " + typeName); } - } catch (ClassNotFoundException e) { - throw new IllegalStateException("Can't find class: " + typeName); } } return FileVisitResult.CONTINUE; -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.