Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 96b19535 by Tony Chemit at 2021-01-27T11:54:24+01:00 fix tag value by adding a basic space after tag value section - - - - - 0c798c03 by Tony Chemit at 2021-01-27T11:55:03+01:00 remove bad tag value usage - - - - - 26b984f7 by Tony Chemit at 2021-01-27T11:55:28+01:00 add tag values in toolkit store (and remove unused one) - - - - - 035bef8f by Tony Chemit at 2021-01-27T11:56:42+01:00 * introduce tag values extractor and use it on dto model * need now to remove any tag value from models files - - - - - 26 changed files: - + models/dto-definition/.mvn/models-dto - models/dto-definition/pom.xml - models/dto-definition/src/main/models/Observe-01-referential-common.model - models/dto-definition/src/main/models/Observe-30-data-ll-observation.model - + models/dto-definition/src/main/models/Observe/dto/attribute/mayNotNull.properties - + models/dto-definition/src/main/models/Observe/dto/attribute/notNull.properties - + models/dto-definition/src/main/models/Observe/dto/attribute/ordered.properties - + models/dto-definition/src/main/models/Observe/dto/attribute/positiveNumber.properties - + models/dto-definition/src/main/models/Observe/dto/attribute/strictlyPositiveNumber.properties - + models/dto-definition/src/main/models/Observe/dto/attribute/unique.properties - + models/dto-definition/src/main/models/Observe/dto/class/comparator.properties - + models/dto-definition/src/main/models/Observe/dto/class/constants.properties - + models/dto-definition/src/main/models/Observe/dto/class/form.properties - + models/dto-definition/src/main/models/Observe/dto/class/mainDto.properties - + models/dto-definition/src/main/models/Observe/dto/class/navigationEntryPoint.properties - + models/dto-definition/src/main/models/Observe/dto/class/navigationParent.properties - + models/dto-definition/src/main/models/Observe/dto/class/references.properties - + models/dto-definition/src/main/models/Observe/dto/class/skip.properties - + models/dto-definition/src/main/models/Observe/dto/tagValues.list - models/persistence/src/main/models/Observe-25-data-ps-common.model - toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/DtoMetaTransformer.java - + toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/ExtractTagValues.java - + toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/LoadTagValues.java - toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/ObserveTagValues.java - toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/dto/BusinessProjectTransformer.java - toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/dto/NavigationModelHelper.java Changes: ===================================== models/dto-definition/.mvn/models-dto ===================================== ===================================== models/dto-definition/pom.xml ===================================== @@ -33,6 +33,12 @@ <name>ObServe Models :: Dto definition</name> <description>ObServe Models Dto definition module</description> + <properties> + <eugene.templates>fr.ird.observe.toolkit.templates.ExtractTagValues</eugene.templates> + <eugene.defaultPackage>fr.ird.observe.dto</eugene.defaultPackage> + <eugene.useI18n>false</eugene.useI18n> + </properties> + <build> <resources> ===================================== models/dto-definition/src/main/models/Observe-01-referential-common.model ===================================== @@ -94,7 +94,7 @@ dataEntryOperator + {*:1} boolean dataSource + {*:1} boolean country {*:0..1} referential.common.CountryReference | notNull -referential.common.Program > referential.I18nReferential >> WithStartEndDate | references=code,label,uri,gearType,gearTypePrefix,tripCount,startDate,endDate NavigationEntryPoint +referential.common.Program > referential.I18nReferential >> WithStartEndDate | references=code,label,uri,gearType,gearTypePrefix,tripCount,startDate,endDate navigationEntryPoint nonTargetObservation + {*:1} int targetDiscardsObservation + {*:1} int samplesObservation + {*:1} int ===================================== models/dto-definition/src/main/models/Observe-30-data-ll-observation.model ===================================== @@ -172,7 +172,7 @@ settingShape {*:1} referential.ll.common.SettingShapeReference lineType {*:0..1} referential.ll.common.LineTypeReference lightsticksType {*:0..1} referential.ll.common.LightsticksTypeReference lightsticksColor {*:0..1} referential.ll.common.LightsticksColorReference -otherSets {*} data.ll.observation.SetStub | mainDto=skip +otherSets {*} data.ll.observation.SetStub data.ll.observation.SetCatch > data.Container >> data.ll.observation.LonglinePositionContainerAware catches {*} data.ll.observation.Catch | ordered ===================================== models/dto-definition/src/main/models/Observe/dto/attribute/mayNotNull.properties ===================================== @@ -0,0 +1,60 @@ +data.ll.common.Trip.attribute.captain=true +data.ll.common.Trip.attribute.departureHarbour=true +data.ll.common.Trip.attribute.landingHarbour=true +data.ll.common.Trip.attribute.species=true +data.ll.common.TripGearUseFeatures.attribute.gearUseFeatures=true +data.ll.landing.Landing.attribute.processingCompany=true +data.ll.logbook.Activity.attribute.endTimeStamp=true +data.ll.logbook.Activity.attribute.fpaZone=true +data.ll.logbook.Activity.attribute.latitude=true +data.ll.logbook.Activity.attribute.longitude=true +data.ll.logbook.Activity.attribute.quadrant=true +data.ll.logbook.Activity.attribute.relatedObservedActivity=true +data.ll.logbook.Activity.attribute.seaSurfaceTemperature=true +data.ll.logbook.Set.attribute.basketsPerSectionCount=true +data.ll.logbook.Set.attribute.branchlinesPerBasketCount=true +data.ll.logbook.Set.attribute.haulingBreaks=true +data.ll.logbook.Set.attribute.lightsticksPerBasketCount=true +data.ll.observation.Activity.attribute.fpaZone=true +data.ll.observation.Activity.attribute.seaSurfaceTemperature=true +data.ll.observation.Branchline.attribute.topType=true +data.ll.observation.Branchline.attribute.tracelineType=true +data.ll.observation.Encounter.attribute.count=true +data.ll.observation.Encounter.attribute.distance=true +data.ll.observation.Encounter.attribute.species=true +data.ll.observation.SensorUsed.attribute.sensorSerialNo=true +data.ll.observation.Set.attribute.haulingBreaks=true +data.ps.common.Trip.attribute.captain=true +data.ps.common.Trip.attribute.dataEntryOperator=true +data.ps.common.Trip.attribute.landingHarbour=true +data.ps.common.TripGearUseFeatures.attribute.gearUseFeatures=true +data.ps.observation.Activity.attribute.observedSystemDistance=true +data.ps.observation.Activity.attribute.seaSurfaceTemperature=true +data.ps.observation.Activity.attribute.surroundingActivity=true +data.ps.observation.Activity.attribute.wind=true +data.ps.observation.NonTargetLength.attribute.speciesFate=true +data.ps.observation.Set.attribute.currentDirection=true +data.ps.observation.TransmittingBuoy.attribute.code=true +referential.Referential.attribute.uri=true +referential.common.FpaZone.attribute.endDate=true +referential.common.FpaZone.attribute.startDate=true +referential.common.Harbour.attribute.latitude=true +referential.common.Harbour.attribute.locode=true +referential.common.Harbour.attribute.longitude=true +referential.common.Harbour.attribute.quadrant=true +referential.common.LengthFormulaSupport.attribute.endDate=true +referential.common.LengthFormulaSupport.attribute.startDate=true +referential.common.Organism.attribute.description=true +referential.common.Program.attribute.endDate=true +referential.common.Program.attribute.startDate=true +referential.common.ShipOwner.attribute.endDate=true +referential.common.ShipOwner.attribute.startDate=true +referential.common.Species.attribute.faoCode=true +referential.common.Species.attribute.ocean=true +referential.common.Species.attribute.wormsId=true +referential.common.SpeciesList.attribute.species=true +referential.common.Vessel.attribute.changeDate=true +referential.ps.common.ObjectMaterial.attribute.legacyCode=true +referential.ps.common.ObjectMaterial.attribute.objectMaterialType=true +referential.ps.common.ObjectMaterial.attribute.parent=true +referential.ps.common.ObjectMaterial.attribute.standardCode=true ===================================== models/dto-definition/src/main/models/Observe/dto/attribute/notNull.properties ===================================== @@ -0,0 +1,155 @@ +data.ContainerChildWithProportion.attribute.proportion=true +data.ll.common.GearUseFeatures.attribute.gear=true +data.ll.common.GearUseFeatures.attribute.number=true +data.ll.common.Trip.attribute.endDate=true +data.ll.common.Trip.attribute.ocean=true +data.ll.common.Trip.attribute.startDate=true +data.ll.common.Trip.attribute.tripType=true +data.ll.common.Trip.attribute.vessel=true +data.ll.landing.Landing.attribute.harbour=true +data.ll.landing.LandingPart.attribute.species=true +data.ll.landing.LandingPart.attribute.weight=true +data.ll.logbook.Activity.attribute.startTimeStamp=true +data.ll.logbook.Activity.attribute.vesselActivity=true +data.ll.logbook.ActivitySample.attribute.timeStamp=true +data.ll.logbook.BaitsComposition.attribute.baitType=true +data.ll.logbook.BranchlinesComposition.attribute.length=true +data.ll.logbook.BranchlinesComposition.attribute.topType=true +data.ll.logbook.BranchlinesComposition.attribute.tracelineType=true +data.ll.logbook.Catch.attribute.catchFate=true +data.ll.logbook.Catch.attribute.species=true +data.ll.logbook.FloatlinesComposition.attribute.length=true +data.ll.logbook.FloatlinesComposition.attribute.lineType=true +data.ll.logbook.HooksComposition.attribute.hookType=true +data.ll.logbook.Sample.attribute.timeStamp=true +data.ll.logbook.SamplePart.attribute.count=true +data.ll.logbook.SamplePart.attribute.species=true +data.ll.logbook.Set.attribute.haulingEndTimeStamp=true +data.ll.logbook.Set.attribute.haulingStartTimeStamp=true +data.ll.logbook.Set.attribute.settingEndTimeStamp=true +data.ll.logbook.Set.attribute.settingStartLatitude=true +data.ll.logbook.Set.attribute.settingStartLongitude=true +data.ll.logbook.Set.attribute.settingStartQuadrant=true +data.ll.logbook.Set.attribute.settingStartTimeStamp=true +data.ll.logbook.Set.attribute.totalSectionsCount=true +data.ll.observation.Activity.attribute.latitude=true +data.ll.observation.Activity.attribute.longitude=true +data.ll.observation.Activity.attribute.quadrant=true +data.ll.observation.Activity.attribute.vesselActivity=true +data.ll.observation.BaitsComposition.attribute.baitType=true +data.ll.observation.Basket.attribute.settingIdentifier=true +data.ll.observation.Branchline.attribute.settingIdentifier=true +data.ll.observation.BranchlinesComposition.attribute.length=true +data.ll.observation.BranchlinesComposition.attribute.topType=true +data.ll.observation.BranchlinesComposition.attribute.tracelineType=true +data.ll.observation.Catch.attribute.catchFate=true +data.ll.observation.Catch.attribute.species=true +data.ll.observation.Encounter.attribute.encounterType=true +data.ll.observation.FloatlinesComposition.attribute.length=true +data.ll.observation.FloatlinesComposition.attribute.lineType=true +data.ll.observation.HooksComposition.attribute.hookType=true +data.ll.observation.Section.attribute.settingIdentifier=true +data.ll.observation.SensorUsed.attribute.sensorType=true +data.ll.observation.Set.attribute.basketsPerSectionCount=true +data.ll.observation.Set.attribute.branchlinesPerBasketCount=true +data.ll.observation.Set.attribute.haulingDirectionSameAsSetting=true +data.ll.observation.Set.attribute.haulingEndLatitude=true +data.ll.observation.Set.attribute.haulingEndLongitude=true +data.ll.observation.Set.attribute.haulingEndQuadrant=true +data.ll.observation.Set.attribute.haulingEndTimeStamp=true +data.ll.observation.Set.attribute.haulingStartLatitude=true +data.ll.observation.Set.attribute.haulingStartLongitude=true +data.ll.observation.Set.attribute.haulingStartQuadrant=true +data.ll.observation.Set.attribute.haulingStartTimeStamp=true +data.ll.observation.Set.attribute.settingEndLatitude=true +data.ll.observation.Set.attribute.settingEndLongitude=true +data.ll.observation.Set.attribute.settingEndQuadrant=true +data.ll.observation.Set.attribute.settingEndTimeStamp=true +data.ll.observation.Set.attribute.settingStartLatitude=true +data.ll.observation.Set.attribute.settingStartLongitude=true +data.ll.observation.Set.attribute.settingStartQuadrant=true +data.ll.observation.Set.attribute.settingStartTimeStamp=true +data.ll.observation.Set.attribute.settingVesselSpeed=true +data.ll.observation.Set.attribute.totalSectionsCount=true +data.ps.common.GearUseFeatures.attribute.gear=true +data.ps.common.GearUseFeatures.attribute.number=true +data.ps.common.Trip.attribute.departureHarbour=true +data.ps.common.Trip.attribute.endDate=true +data.ps.common.Trip.attribute.observer=true +data.ps.common.Trip.attribute.ocean=true +data.ps.common.Trip.attribute.startDate=true +data.ps.common.Trip.attribute.vessel=true +data.ps.observation.Activity.attribute.latitude=true +data.ps.observation.Activity.attribute.longitude=true +data.ps.observation.Activity.attribute.observedSystem=true +data.ps.observation.Activity.attribute.quadrant=true +data.ps.observation.Activity.attribute.time=true +data.ps.observation.Activity.attribute.vesselActivity=true +data.ps.observation.DiscardedTargetCatch.attribute.catchWeight=true +data.ps.observation.DiscardedTargetCatch.attribute.species=true +data.ps.observation.DiscardedTargetCatch.attribute.weightCategory=true +data.ps.observation.FloatingObject.attribute.objectOperation=true +data.ps.observation.KeptTargetCatch.attribute.catchWeight=true +data.ps.observation.KeptTargetCatch.attribute.species=true +data.ps.observation.KeptTargetCatch.attribute.weightCategory=true +data.ps.observation.NonTargetCatch.attribute.species=true +data.ps.observation.NonTargetCatch.attribute.speciesFate=true +data.ps.observation.NonTargetCatchRelease.attribute.count=true +data.ps.observation.NonTargetCatchRelease.attribute.sex=true +data.ps.observation.NonTargetCatchRelease.attribute.species=true +data.ps.observation.NonTargetCatchRelease.attribute.speciesGroupReleaseMode=true +data.ps.observation.NonTargetCatchRelease.attribute.status=true +data.ps.observation.NonTargetLength.attribute.count=true +data.ps.observation.NonTargetLength.attribute.sex=true +data.ps.observation.NonTargetLength.attribute.sizeMeasureType=true +data.ps.observation.NonTargetLength.attribute.species=true +data.ps.observation.ObjectObservedSpecies.attribute.count=true +data.ps.observation.ObjectObservedSpecies.attribute.species=true +data.ps.observation.ObjectObservedSpecies.attribute.speciesStatus=true +data.ps.observation.ObjectSchoolEstimate.attribute.species=true +data.ps.observation.ObjectSchoolEstimate.attribute.totalWeight=true +data.ps.observation.Route.attribute.date=true +data.ps.observation.SchoolEstimate.attribute.species=true +data.ps.observation.TargetLength.attribute.count=true +data.ps.observation.TargetLength.attribute.sizeMeasureType=true +data.ps.observation.TargetLength.attribute.species=true +data.ps.observation.TransmittingBuoy.attribute.transmittingBuoyOperation=true +data.ps.observation.TransmittingBuoy.attribute.transmittingBuoyType=true +referential.I18nReferential.attribute.label1=true +referential.I18nReferential.attribute.label2=true +referential.I18nReferential.attribute.label3=true +referential.common.Country.attribute.iso2Code=true +referential.common.Country.attribute.iso3Code=true +referential.common.Harbour.attribute.country=true +referential.common.LengthFormulaSupport.attribute.coefficients=true +referential.common.LengthFormulaSupport.attribute.ocean=true +referential.common.LengthFormulaSupport.attribute.sex=true +referential.common.LengthFormulaSupport.attribute.species=true +referential.common.LengthLengthParameter.attribute.inputOutputFormula=true +referential.common.LengthLengthParameter.attribute.inputSizeMeasureType=true +referential.common.LengthLengthParameter.attribute.outputInputFormula=true +referential.common.LengthLengthParameter.attribute.outputSizeMeasureType=true +referential.common.LengthWeightParameter.attribute.lengthWeightFormula=true +referential.common.LengthWeightParameter.attribute.sizeMeasureType=true +referential.common.LengthWeightParameter.attribute.weightLengthFormula=true +referential.common.Organism.attribute.country=true +referential.common.Person.attribute.country=true +referential.common.Person.attribute.firstName=true +referential.common.Person.attribute.lastName=true +referential.common.Program.attribute.gearType=true +referential.common.Program.attribute.organism=true +referential.common.ShipOwner.attribute.label=true +referential.common.Species.attribute.scientificLabel=true +referential.common.Species.attribute.speciesGroup=true +referential.common.Vessel.attribute.flagCountry=true +referential.common.Vessel.attribute.fleetCountry=true +referential.common.Vessel.attribute.vesselSizeCategory=true +referential.common.Vessel.attribute.vesselType=true +referential.common.VesselSizeCategory.attribute.capacityLabel=true +referential.common.VesselSizeCategory.attribute.gaugeLabel=true +referential.common.Wind.attribute.speedRange=true +referential.common.Wind.attribute.waveHeight=true +referential.ll.observation.SensorBrand.attribute.brandName=true +referential.ps.common.ObjectOperation.attribute.whenArriving=true +referential.ps.common.ObjectOperation.attribute.whenLeaving=true +referential.ps.observation.WeightCategory.attribute.species=true ===================================== models/dto-definition/src/main/models/Observe/dto/attribute/ordered.properties ===================================== @@ -0,0 +1,27 @@ +data.TripMap.attribute.points=true +data.ll.common.GearUseFeatures.attribute.gearUseFeaturesMeasurement=true +data.ll.common.Trip.attribute.activityObs=true +data.ll.common.TripGearUseFeatures.attribute.gearUseFeatures=true +data.ll.logbook.ActivitySample.attribute.samplePart=true +data.ll.logbook.Sample.attribute.samplePart=true +data.ll.logbook.SetCatch.attribute.catches=true +data.ll.observation.Basket.attribute.branchline=true +data.ll.observation.Section.attribute.basket=true +data.ll.observation.SetCatch.attribute.catches=true +data.ll.observation.SetDetailComposition.attribute.section=true +data.ps.common.GearUseFeatures.attribute.gearUseFeaturesMeasurement=true +data.ps.common.Trip.attribute.route=true +data.ps.common.TripGearUseFeatures.attribute.gearUseFeatures=true +data.ps.observation.DiscardedTargetSample.attribute.targetLength=true +data.ps.observation.KeptTargetSample.attribute.targetLength=true +data.ps.observation.NonTargetSample.attribute.nonTargetLength=true +data.ps.observation.Route.attribute.activity=true +data.ps.observation.SetDiscardedTargetCatch.attribute.targetCatch=true +data.ps.observation.SetKeptTargetCatch.attribute.targetCatch=true +data.ps.observation.SetNonTargetCatch.attribute.nonTargetCatch=true +data.ps.observation.SetNonTargetCatchRelease.attribute.nonTargetCatchRelease=true +data.ps.observation.TargetSample.attribute.targetLength=true +referential.common.Gear.attribute.gearCharacteristic=true +referential.common.Species.attribute.ocean=true +referential.common.SpeciesGroup.attribute.speciesGroupReleaseMode=true +referential.common.SpeciesList.attribute.species=true ===================================== models/dto-definition/src/main/models/Observe/dto/attribute/positiveNumber.properties ===================================== @@ -0,0 +1,118 @@ +data.ContainerChildWithProportion.attribute.proportion=true +data.ll.common.GearUseFeatures.attribute.number=true +data.ll.logbook.Activity.attribute.currentDirection=true +data.ll.logbook.Activity.attribute.currentSpeed=true +data.ll.logbook.Activity.attribute.windDirection=true +data.ll.logbook.BaitsComposition.attribute.individualSize=true +data.ll.logbook.BaitsComposition.attribute.individualWeight=true +data.ll.logbook.BranchlinesComposition.attribute.length=true +data.ll.logbook.BranchlinesComposition.attribute.tracelineLength=true +data.ll.logbook.Catch.attribute.beatDiameter=true +data.ll.logbook.Catch.attribute.count=true +data.ll.logbook.Catch.attribute.countDepredated=true +data.ll.logbook.Catch.attribute.totalWeight=true +data.ll.logbook.FloatlinesComposition.attribute.length=true +data.ll.logbook.HooksComposition.attribute.hookOffset=true +data.ll.logbook.SamplePart.attribute.count=true +data.ll.logbook.SamplePart.attribute.length=true +data.ll.logbook.SamplePart.attribute.weight=true +data.ll.logbook.Set.attribute.basketLineLength=true +data.ll.logbook.Set.attribute.basketsPerSectionCount=true +data.ll.logbook.Set.attribute.branchlinesPerBasketCount=true +data.ll.logbook.Set.attribute.lengthBetweenBranchlines=true +data.ll.logbook.Set.attribute.lightsticksPerBasketCount=true +data.ll.logbook.Set.attribute.maxDepthTargeted=true +data.ll.logbook.Set.attribute.number=true +data.ll.logbook.Set.attribute.shooterSpeed=true +data.ll.logbook.Set.attribute.snapWeight=true +data.ll.logbook.Set.attribute.swivelWeight=true +data.ll.logbook.Set.attribute.timeBetweenHooks=true +data.ll.logbook.Set.attribute.totalBasketsCount=true +data.ll.logbook.Set.attribute.totalHooksCount=true +data.ll.logbook.Set.attribute.totalLightsticksCount=true +data.ll.logbook.Set.attribute.totalLineLength=true +data.ll.logbook.Set.attribute.totalSectionsCount=true +data.ll.observation.BaitsComposition.attribute.individualSize=true +data.ll.observation.BaitsComposition.attribute.individualWeight=true +data.ll.observation.Basket.attribute.floatline1Length=true +data.ll.observation.Basket.attribute.floatline2Length=true +data.ll.observation.Basket.attribute.haulingIdentifier=true +data.ll.observation.Basket.attribute.settingIdentifier=true +data.ll.observation.Branchline.attribute.branchlineLength=true +data.ll.observation.Branchline.attribute.haulingIdentifier=true +data.ll.observation.Branchline.attribute.hookOffset=true +data.ll.observation.Branchline.attribute.settingIdentifier=true +data.ll.observation.Branchline.attribute.snapWeight=true +data.ll.observation.Branchline.attribute.swivelWeight=true +data.ll.observation.Branchline.attribute.timeSinceContact=true +data.ll.observation.Branchline.attribute.tracelineLength=true +data.ll.observation.BranchlinesComposition.attribute.length=true +data.ll.observation.BranchlinesComposition.attribute.tracelineLength=true +data.ll.observation.Catch.attribute.beatDiameter=true +data.ll.observation.Catch.attribute.count=true +data.ll.observation.Catch.attribute.gonadeWeight=true +data.ll.observation.Catch.attribute.totalWeight=true +data.ll.observation.Encounter.attribute.count=true +data.ll.observation.Encounter.attribute.distance=true +data.ll.observation.FloatlinesComposition.attribute.length=true +data.ll.observation.HooksComposition.attribute.hookOffset=true +data.ll.observation.Section.attribute.haulingIdentifier=true +data.ll.observation.Section.attribute.settingIdentifier=true +data.ll.observation.Set.attribute.branchlinesPerBasketCount=true +data.ll.observation.Set.attribute.haulingBreaks=true +data.ll.observation.Set.attribute.maxDepthTargeted=true +data.ll.observation.Set.attribute.number=true +data.ll.observation.Set.attribute.shooterSpeed=true +data.ll.observation.Set.attribute.snapWeight=true +data.ll.observation.Set.attribute.swivelWeight=true +data.ll.observation.Set.attribute.timeBetweenHooks=true +data.ll.observation.Set.attribute.totalBasketsCount=true +data.ll.observation.Set.attribute.totalHooksCount=true +data.ll.observation.Set.attribute.totalSectionsCount=true +data.ll.observation.SetDetailComposition.attribute.basketsPerSectionCount=true +data.ll.observation.SetDetailComposition.attribute.branchlinesPerBasketCount=true +data.ll.observation.SetDetailComposition.attribute.totalSectionsCount=true +data.ll.observation.SizeMeasure.attribute.size=true +data.ll.observation.Tdr.attribute.fishingEndDepth=true +data.ll.observation.Tdr.attribute.fishingStartDepth=true +data.ll.observation.Tdr.attribute.floatline1Length=true +data.ll.observation.Tdr.attribute.floatline2Length=true +data.ll.observation.Tdr.attribute.maxFishingDepth=true +data.ll.observation.Tdr.attribute.meanDeploymentDepth=true +data.ll.observation.Tdr.attribute.meanFishingDepth=true +data.ll.observation.Tdr.attribute.medianDeploymentDepth=true +data.ll.observation.Tdr.attribute.medianFishingDepth=true +data.ll.observation.Tdr.attribute.minFishingDepth=true +data.ll.observation.WeightMeasure.attribute.weight=true +data.ps.common.GearUseFeatures.attribute.number=true +data.ps.observation.Activity.attribute.observedSystemDistance=true +data.ps.observation.Activity.attribute.vesselSpeed=true +data.ps.observation.DiscardedTargetCatch.attribute.catchWeight=true +data.ps.observation.KeptTargetCatch.attribute.catchWeight=true +data.ps.observation.NonTargetCatch.attribute.catchWeight=true +data.ps.observation.NonTargetCatch.attribute.meanLength=true +data.ps.observation.NonTargetCatch.attribute.meanWeight=true +data.ps.observation.NonTargetCatch.attribute.totalCount=true +data.ps.observation.NonTargetCatchRelease.attribute.length=true +data.ps.observation.NonTargetLength.attribute.count=true +data.ps.observation.NonTargetLength.attribute.length=true +data.ps.observation.NonTargetLength.attribute.weight=true +data.ps.observation.ObjectObservedSpecies.attribute.count=true +data.ps.observation.ObjectSchoolEstimate.attribute.totalWeight=true +data.ps.observation.Route.attribute.endLogValue=true +data.ps.observation.Route.attribute.startLogValue=true +data.ps.observation.SchoolEstimate.attribute.meanWeight=true +data.ps.observation.SchoolEstimate.attribute.totalWeight=true +data.ps.observation.Set.attribute.currentDirection=true +data.ps.observation.Set.attribute.currentMeasureDepth=true +data.ps.observation.Set.attribute.currentSpeed=true +data.ps.observation.Set.attribute.maxGearDepth=true +data.ps.observation.Set.attribute.schoolMeanDepth=true +data.ps.observation.Set.attribute.schoolThickness=true +data.ps.observation.Set.attribute.schoolTopDepth=true +data.ps.observation.TargetLength.attribute.count=true +data.ps.observation.TargetLength.attribute.length=true +data.ps.observation.TargetLength.attribute.weight=true +referential.common.Species.attribute.minLength=true +referential.common.Species.attribute.minWeight=true +referential.common.Vessel.attribute.yearService=true ===================================== models/dto-definition/src/main/models/Observe/dto/attribute/strictlyPositiveNumber.properties ===================================== @@ -0,0 +1,15 @@ +data.ll.logbook.Activity.attribute.seaSurfaceTemperature=true +data.ll.logbook.Catch.attribute.depredatedProportion=true +data.ll.observation.Activity.attribute.seaSurfaceTemperature=true +data.ll.observation.Set.attribute.basketsPerSectionCount=true +data.ps.observation.Activity.attribute.seaSurfaceTemperature=true +data.ps.observation.NonTargetCatchRelease.attribute.count=true +referential.common.LengthWeightParameter.attribute.meanLength=true +referential.common.LengthWeightParameter.attribute.meanWeight=true +referential.common.Species.attribute.maxLength=true +referential.common.Species.attribute.maxWeight=true +referential.common.Vessel.attribute.capacity=true +referential.common.Vessel.attribute.keelCode=true +referential.common.Vessel.attribute.length=true +referential.common.Vessel.attribute.power=true +referential.common.Vessel.attribute.searchMaximum=true ===================================== models/dto-definition/src/main/models/Observe/dto/attribute/unique.properties ===================================== @@ -0,0 +1,25 @@ +data.TripMap.attribute.points=true +data.ll.common.Trip.attribute.activityObs=true +data.ll.logbook.Activity.attribute.catchSpeciesIds=true +data.ll.logbook.SetStub.attribute.activity=true +data.ll.observation.Basket.attribute.branchline=true +data.ll.observation.Section.attribute.basket=true +data.ll.observation.SetDetailComposition.attribute.section=true +data.ll.observation.SetStub.attribute.activity=true +data.ps.common.Trip.attribute.route=true +data.ps.observation.Activity.attribute.nonTargetCatchSpecies=true +data.ps.observation.DiscardedTargetSample.attribute.availableSpeciesIds=true +data.ps.observation.KeptTargetSample.attribute.availableSpeciesIds=true +data.ps.observation.NonTargetSample.attribute.availableSpeciesFateIds=true +data.ps.observation.NonTargetSample.attribute.availableSpeciesIds=true +data.ps.observation.Route.attribute.activity=true +data.ps.observation.SetNonTargetCatchRelease.attribute.availableSpeciesIds=true +data.ps.observation.TargetSample.attribute.availableSpeciesIds=true +referential.Referential.attribute.code=true +referential.Referential.attribute.homeId=true +referential.Referential.attribute.uri=true +referential.common.Country.attribute.iso2Code=true +referential.common.Country.attribute.iso3Code=true +referential.common.Species.attribute.faoCode=true +referential.common.Species.attribute.scientificLabel=true +referential.common.Species.attribute.wormsId=true ===================================== models/dto-definition/src/main/models/Observe/dto/class/comparator.properties ===================================== @@ -0,0 +1,9 @@ +data.ll.common.Trip.class=startDate +data.ll.landing.Landing.class=startDate +data.ll.logbook.Activity.class=startTimeStamp +data.ll.logbook.ActivitySample.class=timeStamp +data.ll.logbook.Sample.class=timeStamp +data.ll.observation.Activity.class=timeStamp +data.ps.common.Trip.class=startDate +data.ps.observation.Activity.class=time +data.ps.observation.Route.class=date ===================================== models/dto-definition/src/main/models/Observe/dto/class/constants.properties ===================================== @@ -0,0 +1,2 @@ +data.ps.observation.Set.class=targetSampleCapture,endSetDate,endPursingDate,endSetTime,endPursingTime +data.ps.observation.TargetLength.class=totalWeight ===================================== models/dto-definition/src/main/models/Observe/dto/class/form.properties ===================================== @@ -0,0 +1,4 @@ +data.ps.observation.DiscardedTargetSample.class=TargetLength +data.ps.observation.KeptTargetSample.class=TargetLength +data.ps.observation.NonTargetSample.class=NonTargetLength +data.ps.observation.TargetSample.class=TargetLength ===================================== models/dto-definition/src/main/models/Observe/dto/class/mainDto.properties ===================================== @@ -0,0 +1,15 @@ +data.ll.logbook.ActivitySample.class=Sample +data.ll.logbook.ActivityStub.class=Activity +data.ll.logbook.SetGlobalComposition.class=Set +data.ll.logbook.SetStub.class=Set +data.ll.observation.ActivityStub.class=Activity +data.ll.observation.SetDetailComposition.class=Set +data.ll.observation.SetGlobalComposition.class=Set +data.ll.observation.SetStub.class=Set +data.ll.observation.TripActivityStub.class=Activity +data.ps.observation.ActivityStub.class=Activity +data.ps.observation.DiscardedTargetCatch.class=TargetCatch +data.ps.observation.DiscardedTargetSample.class=TargetSample +data.ps.observation.KeptTargetCatch.class=TargetCatch +data.ps.observation.KeptTargetSample.class=TargetSample +data.ps.observation.RouteStub.class=Route ===================================== models/dto-definition/src/main/models/Observe/dto/class/navigationEntryPoint.properties ===================================== @@ -0,0 +1 @@ +referential.common.Program.class=true ===================================== models/dto-definition/src/main/models/Observe/dto/class/navigationParent.properties ===================================== @@ -0,0 +1,13 @@ +data.ll.common.Trip.class=referential.common.Program +data.ll.landing.Landing.class=data.ll.common.Trip +data.ll.logbook.Activity.class=data.ll.common.Trip +data.ll.logbook.ActivitySample.class=data.ll.logbook.Activity +data.ll.logbook.Sample.class=data.ll.common.Trip +data.ll.logbook.Set.class=data.ll.logbook.Activity +data.ll.observation.Activity.class=data.ll.common.Trip +data.ll.observation.Set.class=data.ll.observation.Activity +data.ps.common.Trip.class=referential.common.Program +data.ps.observation.Activity.class=data.ps.observation.Route +data.ps.observation.FloatingObject.class=data.ps.observation.Activity +data.ps.observation.Route.class=data.ps.common.Trip +data.ps.observation.Set.class=data.ps.observation.Activity ===================================== models/dto-definition/src/main/models/Observe/dto/class/references.properties ===================================== @@ -0,0 +1,72 @@ +data.ll.common.GearUseFeatures.class=gearLabel,number,usedInTrip +data.ll.common.GearUseFeaturesMeasurement.class=measurementValue,gearCharacteristicLabel +data.ll.common.Trip.class=startDate,endDate,program,tripTypeId,observationsActivityCount,logbookActivityCount,landingSize,sampleSize,vessel,observerLabel,observationsAvailability,logbookAvailability +data.ll.landing.Landing.class=startDate,harbourLabel,vesselLabel +data.ll.landing.LandingPart.class=speciesLabel,categoryMin,categoryMax,weight +data.ll.logbook.Activity.class=startTimeStamp,endTimeStamp,latitude,longitude,vesselActivity,set,activitySample,relatedObservedActivity +data.ll.logbook.ActivitySample.class=timeStamp,latitude,longitude +data.ll.logbook.BaitsComposition.class=proportion,baitTypeLabel,baitSettingStatusLabel,individualSize,individualWeight +data.ll.logbook.BranchlinesComposition.class=proportion,topTypeLabel,tracelineTypeLabel,length +data.ll.logbook.Catch.class=homeId +data.ll.logbook.FloatlinesComposition.class=proportion,lineTypeLabel,length +data.ll.logbook.HooksComposition.class=proportion,hookTypeLabel,hookSizeLabel,hookOffset +data.ll.logbook.Sample.class=timeStamp,latitude,longitude +data.ll.logbook.SamplePart.class=speciesLabel,length,weight +data.ll.logbook.Set.class=homeId +data.ll.observation.Activity.class=timeStamp,latitude,longitude,vesselActivity,set +data.ll.observation.BaitsComposition.class=proportion,baitTypeLabel,baitSettingStatusLabel,individualSize,individualWeight +data.ll.observation.Basket.class=settingIdentifier,haulingIdentifier,parentId +data.ll.observation.Branchline.class=settingIdentifier,haulingIdentifier,parentId +data.ll.observation.BranchlinesComposition.class=proportion,topTypeLabel,tracelineTypeLabel,length +data.ll.observation.Catch.class=homeId +data.ll.observation.Encounter.class=encounterTypeLabel,speciesLabel +data.ll.observation.FloatlinesComposition.class=proportion,lineTypeLabel,length +data.ll.observation.HooksComposition.class=proportion,hookTypeLabel,hookSizeLabel,hookOffset +data.ll.observation.Section.class=settingIdentifier,haulingIdentifier,parentId +data.ll.observation.SensorUsed.class=sensorTypeLabel +data.ll.observation.Set.class=homeId +data.ll.observation.SizeMeasure.class=sizeMeasureTypeLabel,size +data.ll.observation.Tdr.class=homeId +data.ll.observation.WeightMeasure.class=weightMeasureTypeLabel,weight +data.ps.common.GearUseFeatures.class=gearLabel,number,usedInTrip +data.ps.common.GearUseFeaturesMeasurement.class=measurementValue,gearCharacteristicLabel +data.ps.common.Trip.class=startDate,endDate,program,routeSize,vessel,observerLabel +data.ps.observation.Activity.class=time,latitude,longitude,vesselActivity,set +data.ps.observation.DiscardedTargetCatch.class=speciesLabel,catchWeight +data.ps.observation.DiscardedTargetSample.class=homeId,nature,discarded +data.ps.observation.FloatingObject.class=objectOperationLabel +data.ps.observation.FloatingObjectPart.class=objectMaterialId,objectMaterialLabel,whenArriving,whenLeaving +data.ps.observation.KeptTargetCatch.class=speciesLabel,well,catchWeight +data.ps.observation.KeptTargetSample.class=homeId,nature,discarded +data.ps.observation.NonTargetCatch.class=speciesLabel,speciesFateLabel +data.ps.observation.NonTargetCatchRelease.class=speciesLabel,speciesGroupReleaseModeLabel,statusLabel,conformityLabel,releasingTimeLabel,length +data.ps.observation.NonTargetLength.class=speciesLabel,length,sexLabel +data.ps.observation.NonTargetSample.class=homeId +data.ps.observation.ObjectObservedSpecies.class=speciesLabel,speciesStatusLabel,count +data.ps.observation.ObjectSchoolEstimate.class=speciesLabel,totalWeight +data.ps.observation.Route.class=date,comment,activitySize +data.ps.observation.SchoolEstimate.class=speciesLabel,meanWeight,totalWeight +data.ps.observation.Set.class=comment,discardedTargetSampleEnabled,keptTargetSampleEnabled,nonTargetSampleEnabled,setNonTargetCatchReleaseEnabled +data.ps.observation.TargetCatch.class=well +data.ps.observation.TargetLength.class=speciesLabel,length,count +data.ps.observation.TargetSample.class=homeId,nature,discarded +data.ps.observation.TransmittingBuoy.class=code,comment,transmittingBuoyTypeLabel,transmittingBuoyOperationLabel +referential.common.Country.class=code,label,uri,iso2Code,iso3Code +referential.common.FpaZone.class=code,label,uri,startDate,endDate +referential.common.GearCharacteristic.class=code,label,uri,gearCharacteristicType,unit +referential.common.Harbour.class=code,label,uri,locode +referential.common.LengthLengthParameter.class=uri,oceanLabel,sexLabel,species,startDate,endDate,inputSizeMeasureType,outputSizeMeasureType,inputOutputFormula,outputInputFormula +referential.common.LengthWeightParameter.class=uri,oceanLabel,sexLabel,species,startDate,endDate,lengthWeightFormula,weightLengthFormula,sizeMeasureType +referential.common.Person.class=firstName,lastName,uri,captain,observer,dataEntryOperator,dataSource +referential.common.Program.class=code,label,uri,gearType,gearTypePrefix,tripCount,startDate,endDate +referential.common.ShipOwner.class=code,label,uri,startDate,endDate +referential.common.Species.class=label,uri,faoCode,scientificLabel,sizeMeasureTypeId,weightMeasureTypeId,speciesGroupId,wormsId,faoCode +referential.common.Vessel.class=code,label,uri,vesselTypeId +referential.common.VesselSizeCategory.class=code,uri,gaugeLabel,capacityLabel +referential.common.Wind.class=code,label,uri,speedRange +referential.ll.observation.SensorBrand.class=code,uri,brandName +referential.ps.common.ObjectMaterial.class=code,label,uri,parentId,objectMaterialTypeId,validation,biodegradable,nonEntangling +referential.ps.common.ObjectOperation.class=code,label,uri,whenArriving,whenLeaving +referential.ps.common.SpeciesFate.class=code,label,uri,discard +referential.ps.common.VesselActivity.class=code,label,uri,allowFad +referential.ps.observation.WeightCategory.class=code,label,uri,speciesId ===================================== models/dto-definition/src/main/models/Observe/dto/class/skip.properties ===================================== @@ -0,0 +1,14 @@ +Id.class=true +data.Container.class=true +data.ContainerChild.class=true +data.ContainerChildWithDataFile.class=true +data.ContainerChildWithProportion.class=true +data.Data.class=true +data.DataFile.class=true +data.Editable.class=true +data.Openable.class=true +data.Simple.class=true +data.TripMap.class=true +referential.I18nReferential.class=true +referential.Referential.class=true +result.SaveResult.class=true ===================================== models/dto-definition/src/main/models/Observe/dto/tagValues.list ===================================== @@ -0,0 +1,14 @@ +attribute.tagvalue.mayNotNull +attribute.tagvalue.notNull +attribute.tagvalue.ordered +attribute.tagvalue.positiveNumber +attribute.tagvalue.strictlyPositiveNumber +attribute.tagvalue.unique +class.tagvalue.comparator +class.tagvalue.constants +class.tagvalue.form +class.tagvalue.mainDto +class.tagvalue.navigationEntryPoint +class.tagvalue.navigationParent +class.tagvalue.references +class.tagvalue.skip ===================================== models/persistence/src/main/models/Observe-25-data-ps-common.model ===================================== @@ -1,4 +1,4 @@ -package fr.ird.observe.entities.data.ps.common| entity dbSchema=ps_common +package fr.ird.observe.entities.data.ps.common | entity dbSchema=ps_common data.ps.common.GearUseFeatures > data.DataEntity | entity comment + {*:1} String | length=8192 ===================================== toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/DtoMetaTransformer.java ===================================== @@ -24,6 +24,7 @@ package fr.ird.observe.toolkit.templates; import com.google.common.collect.ImmutableSet; import fr.ird.observe.dto.data.ContainerDto; +import io.ultreia.java4all.util.SortedProperties; import org.nuiton.eugene.AbstractMetaTransformer; import org.nuiton.eugene.EugeneCoreTagValues; import org.nuiton.eugene.LogProxy; @@ -31,6 +32,7 @@ import org.nuiton.eugene.Template; import org.nuiton.eugene.java.BeanTransformerContext; import org.nuiton.eugene.java.BeanTransformerTagValues; import org.nuiton.eugene.java.EugeneJavaTagValues; +import org.nuiton.eugene.models.extension.io.ModelExtensionReader; import org.nuiton.eugene.models.object.ObjectModel; import org.nuiton.eugene.models.object.ObjectModelAttribute; import org.nuiton.eugene.models.object.ObjectModelClass; @@ -40,14 +42,12 @@ import org.nuiton.eugene.models.object.xml.ObjectModelAttributeImpl; import java.io.BufferedWriter; import java.io.File; import java.io.IOException; -import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.nio.file.Path; import java.util.Comparator; import java.util.LinkedList; import java.util.List; -import java.util.Map; import java.util.Objects; -import java.util.TreeMap; /** * Created on 24/01/2021. @@ -67,20 +67,38 @@ public abstract class DtoMetaTransformer extends AbstractMetaTransformer<ObjectM @Override protected boolean validateModel(ObjectModel model) { - - // Get all non abstract beans - BeanTransformerContext all = new BeanTransformerContext(model, new EugeneCoreTagValues(), new EugeneJavaTagValues(), new BeanTransformerTagValues(), false, false, t -> true, getLog()); + String packageName = getConfiguration().getProperty(PROP_DEFAULT_PACKAGE); BeanTransformerContext allWithAbstract = new BeanTransformerContext(model, new EugeneCoreTagValues(), new EugeneJavaTagValues(), new BeanTransformerTagValues(), true, false, t -> true, getLog()); + BeanTransformerContext all = new BeanTransformerContext(model, new EugeneCoreTagValues(), new EugeneJavaTagValues(), new BeanTransformerTagValues(), false, false, t -> true, getLog()); ObserveTagValues observeTagValues = new ObserveTagValues(); - String packageName = getConfiguration().getProperty(PROP_DEFAULT_PACKAGE); + loadTagValues(model, packageName); + augmentsReferences(allWithAbstract, packageName); augmentsTagValues(model, all, observeTagValues); consolidateModel(model, all, observeTagValues, getLog()); augmentsTagValuesFinal(model, all, observeTagValues); - extractTagValues(allWithAbstract); return true; } + private void loadTagValues(ObjectModel model, String packageName) { + try { + + SortedProperties loadedTagValues = new LoadTagValues(model, packageName, getClassLoader()).load("dto"); + getLog().info(String.format("Load %d tag-value(s) for classifier dto.", loadedTagValues.size())); + + Path outputDirectory = getConfiguration().getProperty(PROP_OUTPUT_DIRECTORY, File.class).toPath().getParent().getParent(); + Path tmpFile = outputDirectory.resolve("all-dto-tagValues-" + System.nanoTime() + ".properties"); + try (BufferedWriter writer = Files.newBufferedWriter(tmpFile)) { + loadedTagValues.store(writer, String.format("Generated by %s", getClass().getName())); + } + ModelExtensionReader<ObjectModel> reader = new ModelExtensionReader<>(isVerbose(), true, model); + reader.read(tmpFile.toFile()); + + } catch (Exception e) { + throw new IllegalStateException("Can't load tag-values", e); + } + } + protected void augmentsTagValues(ObjectModel model, BeanTransformerContext all, ObserveTagValues observeTagValues) { for (ObjectModelClass aClass : all.selectedClasses) { ObjectModelPackage aPackage = model.getPackage(aClass.getPackageName()); @@ -222,27 +240,4 @@ public abstract class DtoMetaTransformer extends AbstractMetaTransformer<ObjectM return candidates.get(0); } - - protected void extractTagValues(BeanTransformerContext all) { - Map<String, String> p = new TreeMap<>(); - for (ObjectModelClass aClass : all.selectedClasses) { - String tagValuePrefix = aClass.getQualifiedName() + ".attribute."; - for (ObjectModelAttribute attribute : aClass.getAttributes()) { - String tagValuePrefix2 = tagValuePrefix + attribute.getName() + ".tagValue."; - Map<String, String> tagValues1 = attribute.getTagValues(); - tagValues1.forEach((k, v) -> p.put(tagValuePrefix2 + k, v)); - } - } - File outputDir = getConfiguration().getProperty(PROP_OUTPUT_DIRECTORY, File.class); - Path path = outputDir.toPath().resolve("extracted-tagValues.properties"); - getLog().info(String.format("Generated all tag-values in %s", path)); - try (BufferedWriter writer = java.nio.file.Files.newBufferedWriter(path, StandardCharsets.UTF_8)) { - for (String k : p.keySet()) { - writer.write(String.format("%s=%s", k, p.get(k))); - writer.newLine(); - } - } catch (IOException e) { - throw new IllegalStateException("Can't write " + path, e); - } - } } ===================================== toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/ExtractTagValues.java ===================================== @@ -0,0 +1,184 @@ +package fr.ird.observe.toolkit.templates; + +/*- + * #%L + * ObServe Toolkit :: Templates + * %% + * Copyright (C) 2008 - 2021 IRD, Code Lutin, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ImmutableList; +import io.ultreia.java4all.util.SortedProperties; +import org.codehaus.plexus.component.annotations.Component; +import org.nuiton.eugene.Template; +import org.nuiton.eugene.java.EugeneJavaTagValues; +import org.nuiton.eugene.models.object.ObjectModel; +import org.nuiton.eugene.models.object.ObjectModelAttribute; +import org.nuiton.eugene.models.object.ObjectModelClass; +import org.nuiton.eugene.models.object.ObjectModelGenerator; +import org.nuiton.eugene.models.object.ObjectModelType; +import org.nuiton.topia.templates.TopiaTemplateHelperExtension; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.function.Predicate; + +/** + * Created on 26/01/2021. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 8.0.5 + */ +@Component(role = Template.class, hint = "fr.ird.observe.toolkit.templates.ExtractTagValues") +public class ExtractTagValues extends ObjectModelGenerator { + + private String filePrefix; + private Path outputFile; + private Path resourceDirectory; + private Map<String, String> currentTagValues; + + @Override + public void applyTemplate(ObjectModel model, File destDir) throws IOException { + String packageName = getConfiguration().getProperty(PROP_DEFAULT_PACKAGE); + EugeneJavaTagValues javaTemplatesTagValues = new EugeneJavaTagValues(); + resourceDirectory = getConfiguration().getProperty(PROP_RESOURCE_DIRECTORY, File.class).toPath().getParent().resolve("models").resolve(model.getName()); + Predicate<ObjectModelClass> acceptClass; + if (packageName.contains(".dto")) { + resourceDirectory = resourceDirectory.resolve("dto"); + acceptClass = c -> javaTemplatesTagValues.isBean(c, model.getPackage(c)); + } else if (packageName.contains(".entities")) { + resourceDirectory = resourceDirectory.resolve("persistence"); + TopiaTemplateHelperExtension templateHelper = new TopiaTemplateHelperExtension(model); + acceptClass = templateHelper::isEntity; + } else { + throw new IllegalStateException("Can't manage packageName: " + packageName); + } + getLog().info(String.format("Will generate tag values at %s", resourceDirectory)); + + ImmutableList<ObjectModelClass> classes = model.getClasses().stream().filter(acceptClass).collect(ImmutableList.toImmutableList()); + getLog().info(String.format("Will extract tag values from %d class(es).", classes.size())); + ArrayListMultimap<String, String> tagValueKeysByTagValue = ArrayListMultimap.create(); + Map<String, String> allTagValues = new TreeMap<>(); + try { + extractTagValues(classes, tagValueKeysByTagValue, allTagValues); + } catch (IOException e) { + throw new IllegalStateException("Can't extract tag values", e); + } + Set<String> tagValuesKeys = tagValueKeysByTagValue.keySet(); + int beginIndex = packageName.length() + 1; + List<String> tagValueList = new ArrayList<>(tagValuesKeys.size()); + for (String tagValuesKey : tagValuesKeys) { + filePrefix = tagValuesKey; + int keySuffix = filePrefix.substring(filePrefix.indexOf("-")).length(); + + currentTagValues = new TreeMap<>(); + for (String k : tagValueKeysByTagValue.get(filePrefix)) { + String value = allTagValues.get(k); + String key = k.substring(beginIndex); + key = key.substring(0, key.length() - keySuffix); + currentTagValues.put(key, value); + } + String index = tagValuesKey.replace("-tagValue", "").replaceAll("-", "."); + tagValueList.add(index); + super.applyTemplate(model, destDir); + } + + Path indexPath = resourceDirectory.resolve(LoadTagValues.TAG_VALUES_LIST_FILENAME); + getLog().info(String.format("Will generate tag values list (%d) at %s", tagValueList.size(), indexPath)); + tagValueList.sort(String::compareTo); + Files.write(indexPath, tagValueList); + } + + @Override + protected void generateFromElement(Object element, File destDir, String filename, ObjectModelType type) { + if (ObjectModelType.OBJECT_MODEL != type) { + // only generate on model + return; + } + super.generateFromElement(element, destDir, filename, type); + } + + @Override + public void generateFromModel(Writer output, ObjectModel input) throws IOException { + + // get existing tag values + SortedProperties existingProperties = new SortedProperties(); + if (Files.exists(outputFile)) { + try (BufferedReader reader = Files.newBufferedReader(outputFile)) { + existingProperties.load(reader); + } + getLog().info(String.format("%s - Load existing %d element(s) from %s.", filePrefix, existingProperties.size(), outputFile)); + } + // add new one from model + int size = existingProperties.stringPropertyNames().size(); + currentTagValues.forEach(existingProperties::setProperty); + + getLog().info(String.format("%s - Load from model new %d element(s).", filePrefix, existingProperties.stringPropertyNames().size() - size)); + getLog().info(String.format("%s - Store %d element(s) to %s.", filePrefix, existingProperties.size(), outputFile)); + // store all tag values + for (String key : existingProperties.stringPropertyNames()) { + String value = existingProperties.getProperty(key); + output.write(String.format("%s=%s", key, value)); + output.write('\n'); + } + } + + @Override + public String getFilenameForModel(ObjectModel model) { + return filePrefix + ".properties"; + } + + @Override + protected File getDestinationFile(File destDir, String filename) { + int endIndex = filename.indexOf("-"); + outputFile = resourceDirectory.resolve(filename.substring(0, endIndex)).resolve(filename.substring(filename.lastIndexOf("-") + 1)); + return outputFile.toFile(); + } + + private void extractTagValues(ImmutableList<ObjectModelClass> all, ArrayListMultimap<String, String> tagValueKeysByTagValue, Map<String, String> allTagValues) throws IOException { + String classPrefix = "class-tagvalue-"; + String attributePrefix = "attribute-tagvalue-"; + for (ObjectModelClass aClass : all) { + String classTagValuePrefix = aClass.getQualifiedName() + ".class.tagValue."; + aClass.getTagValues().forEach((k, v) -> { + String key = classTagValuePrefix + k; + allTagValues.put(key, v); + tagValueKeysByTagValue.put(classPrefix + k, key); + }); + String attributeTagValuePrefix = aClass.getQualifiedName() + ".attribute."; + for (ObjectModelAttribute attribute : aClass.getAttributes()) { + String attributeTagValuePrefix2 = attributeTagValuePrefix + attribute.getName() + ".tagValue."; + attribute.getTagValues().forEach((k, v) -> { + String key = attributeTagValuePrefix2 + k; + allTagValues.put(key, v); + tagValueKeysByTagValue.put(attributePrefix + k, key); + }); + } + } + } +} ===================================== toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/LoadTagValues.java ===================================== @@ -0,0 +1,83 @@ +package fr.ird.observe.toolkit.templates; + +import io.ultreia.java4all.util.SortedProperties; +import org.apache.commons.io.IOUtils; +import org.nuiton.eugene.models.object.ObjectModel; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Properties; +import java.util.TreeMap; + +/** + * To load tag-values from new layout. + * <p> + * Created on 27/01/2021. + * + * @author Tony Chemit - dev@tchemit.fr + * @see ExtractTagValues + * @since 8.0.5 + */ +public class LoadTagValues { + + public static final String TAG_VALUES_LIST_FILENAME = "tagValues.list"; + private final ObjectModel model; + private final String packageName; + private final ClassLoader classLoader; + + public LoadTagValues(ObjectModel model, String packageName, ClassLoader classLoader) { + this.model = Objects.requireNonNull(model); + this.packageName = Objects.requireNonNull(packageName); + this.classLoader = Objects.requireNonNull(classLoader); + } + + public SortedProperties load(String classifier) throws IOException { + String resourcesPath = "models/" + model.getName() + "/" + Objects.requireNonNull(classifier) + "/"; + + List<String> tagValueList = loadTagValuesList(resourcesPath, classLoader); + SortedProperties result = new SortedProperties(); + for (String tagValue : tagValueList) { + int i = tagValue.indexOf("."); + String type = tagValue.substring(0, i); + String suffix = tagValue.substring(i+1); + String tagValueName = suffix.replace("tagvalue.", ""); + String tagValuePath = resourcesPath + type + "/" + tagValueName + ".properties"; + switch (type) { + case "attribute": + case "class": + URL tagValueURL = classLoader.getResource(tagValuePath); + Map<String, String> tagValueProperties = loadTagValuesFile(packageName, suffix, Objects.requireNonNull(tagValueURL)); + result.putAll(tagValueProperties); + break; + default: + throw new IllegalStateException(String.format("Can't manage tag value type: %s", type)); + } + } + return result; + } + + private List<String> loadTagValuesList(String resourcesPath, ClassLoader classLoader) throws IOException { + String tagValuesListPath = resourcesPath + TAG_VALUES_LIST_FILENAME; + URL resource = Objects.requireNonNull(classLoader.getResource(tagValuesListPath)); + try (InputStreamReader reader = new InputStreamReader(resource.openStream())) { + return IOUtils.readLines(reader); + } + } + + private Map<String, String> loadTagValuesFile(String packageName, String suffix, URL resource) throws IOException { + Properties incoming = new Properties(); + try (InputStream inputStream = resource.openStream()) { + incoming.load(inputStream); + } + Map<String, String> result = new TreeMap<>(); + for (String key : incoming.stringPropertyNames()) { + result.put(packageName + "." + key + "."+suffix, incoming.getProperty(key)); + } + return result; + } +} ===================================== toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/ObserveTagValues.java ===================================== @@ -84,6 +84,21 @@ public class ObserveTagValues extends DefaultTagValueMetadatasProvider { return tagValue == null ? null : tagValue.trim(); } + public String getNavigationParentTagValue(ObjectModelClassifier classifier) { + String tagValue = TagValueUtil.findTagValue(Store.navigationParent, classifier); + return tagValue == null ? null : tagValue.trim(); + } +// +// public String getNavigationExtraParentTagValue(ObjectModelClassifier classifier) { +// String tagValue = TagValueUtil.findTagValue(Store.navigationExtraParent, classifier); +// return tagValue == null ? null : tagValue.trim(); +// } + + public String getNavigationEntryPointTagValue(ObjectModelClassifier classifier) { + String tagValue = TagValueUtil.findTagValue(Store.navigationEntryPoint, classifier); + return tagValue == null ? null : tagValue.trim(); + } + /** * Obtain the value of the {@link Store#comparator} tag value on the given classifier. * @@ -203,6 +218,12 @@ public class ObserveTagValues extends DefaultTagValueMetadatasProvider { mainDto("Pour qualifier le dto principal", String.class, null, ObjectModelClassifier.class), + navigationParent("Pour indiquer quelle est le parent dans la navigation", String.class, null, ObjectModelClassifier.class), + +// navigationExtraParent("Pour indiquer quelle est le parent dans la navigation", String.class, null, ObjectModelClassifier.class), + + navigationEntryPoint("Pour indiquer si la classe est un point d'entrée est le parent dans la navigation", String.class, null, ObjectModelClassifier.class), + comparator("Pour qualifier l'attribut de comparaison", String.class, null, ObjectModelClassifier.class), /** ===================================== toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/dto/BusinessProjectTransformer.java ===================================== @@ -161,15 +161,15 @@ public class BusinessProjectTransformer extends ObjectModelTransformerToJava imp navigationModelHelper.registerEditClassesCandidate(moduleName, subModuleName, input, input.getName()); navigationModelHelper.registerSelectClassesCandidate(moduleName, subModuleName, input, input.getName()); - String extraParent = input.getTagValue("navigationExtraParent"); - if (extraParent != null) { - String inputName = GeneratorUtil.getSimpleName(extraParent) + input.getName(); - navigationModelHelper.registerSelectClassesCandidate(moduleName, subModuleName, input, inputName); - } +// String extraParent = observeTagValues.getNavigationExtraParentTagValue(input); +// if (extraParent != null) { +// String inputName = GeneratorUtil.getSimpleName(extraParent) + input.getName(); +// navigationModelHelper.registerSelectClassesCandidate(moduleName, subModuleName, input, inputName); +// } } else if (superclasses.stream().anyMatch(s -> s.getName().equals("Editable"))) { navigationModelHelper.registerSelectClassesCandidate(moduleName, subModuleName, input, input.getName()); } else { - String navigationEntryPoint = input.getTagValue("NavigationEntryPoint"); + String navigationEntryPoint = observeTagValues.getNavigationEntryPointTagValue(input); if (navigationEntryPoint != null) { navigationModelHelper.registerSelectExtraClassesCandidate(moduleName, subModuleName, input); navigationModelHelper.registerEditExtraClassesCandidate(moduleName, subModuleName, input); ===================================== toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/dto/NavigationModelHelper.java ===================================== @@ -26,6 +26,7 @@ import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import fr.ird.observe.spi.ProjectPackagesDefinition; +import fr.ird.observe.toolkit.templates.ObserveTagValues; import org.apache.commons.lang3.mutable.MutableInt; import org.nuiton.eugene.GeneratorUtil; import org.nuiton.eugene.models.object.ObjectModelClass; @@ -123,11 +124,12 @@ public class NavigationModelHelper { */ public void init() { + ObserveTagValues tagValues = new ObserveTagValues(); Set<ObjectModelClass> editCandidates = new LinkedHashSet<>(editExtraClassesCandidates.keySet()); editCandidates.addAll(editClassesCandidates.keySet()); ImmutableMap<String, ObjectModelClass> editNameCandidates = Maps.uniqueIndex(editCandidates, ObjectModelClass::getQualifiedName); for (ObjectModelClass candidateClass : editClassesCandidates.keySet()) { - String dependencyClass = def.getDtoRootPackage() + "." + candidateClass.getTagValue("navigationParent"); + String dependencyClass = def.getDtoRootPackage() + "." + tagValues.getNavigationParentTagValue(candidateClass); ObjectModelClass parentClass = editNameCandidates.get(dependencyClass); if (parentClass != null) { String editNodeName = getEditNodeName(candidateClass); @@ -140,7 +142,7 @@ public class NavigationModelHelper { selectCandidates.addAll(selectClassesCandidates.keySet()); ImmutableMap<String, ObjectModelClass> selectNameCandidates = Maps.uniqueIndex(selectCandidates, ObjectModelClass::getQualifiedName); for (ObjectModelClass candidateClass : selectClassesCandidates.keySet()) { - String dependencyClass = def.getDtoRootPackage() + "." + candidateClass.getTagValue("navigationParent"); + String dependencyClass = def.getDtoRootPackage() + "." + tagValues.getNavigationParentTagValue(candidateClass); ObjectModelClass parentClass = selectNameCandidates.get(dependencyClass); if (parentClass != null) { String selectNodeName = getSelectNodeName(candidateClass); View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/44fc8be644857c15670c6446c... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/44fc8be644857c15670c6446c... You're receiving this email because of your account on gitlab.com.