From 9dd5c9fd2b47f97948f7bbe6601ff7fde59b9c36 Mon Sep 17 00:00:00 2001 From: John Collins Date: Fri, 19 Apr 2019 18:01:55 -0500 Subject: [PATCH] #1016 - working annotation processor, default schema, update message types to include domain fields --- common/pom.xml | 20 +++ .../org/powertac/common/ClearedTrade.java | 2 +- .../org/powertac/common/MarketPosition.java | 2 +- .../java/org/powertac/common/Orderbook.java | 2 +- .../org/powertac/common/OrderbookOrder.java | 2 +- .../powertac/common/TariffSpecification.java | 14 +-- .../common/WeatherForecastPrediction.java | 3 +- .../org/powertac/common/WeatherReport.java | 2 +- .../powertac/common/msg/BalanceReport.java | 2 +- .../org/powertac/common/msg/OrderStatus.java | 2 +- .../org/powertac/common/msg/TariffStatus.java | 2 +- .../resources/metadata/default-log.schema | 29 +++++ .../resources/metadata/domain-default.schema | 30 +++++ pom.xml | 2 + powertac-metadata/pom.xml | 21 +++- .../powertac/metadata/DomainProcessor.java | 115 ++++++++++++++++++ .../javax.annotation.processing.Processor | 2 + 17 files changed, 230 insertions(+), 22 deletions(-) create mode 100644 common/src/main/resources/metadata/default-log.schema create mode 100644 common/src/main/resources/metadata/domain-default.schema create mode 100644 powertac-metadata/src/main/java/org/powertac/metadata/DomainProcessor.java create mode 100644 powertac-metadata/src/main/resources/META-INF/services/javax.annotation.processing.Processor diff --git a/common/pom.xml b/common/pom.xml index 005df755..a0d99af6 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -31,6 +31,12 @@ + + org.powertac + powertac-metadata + 1.7.0-SNAPSHOT + + org.powertac powertac-aop @@ -160,8 +166,22 @@ org.codehaus.mojo aspectj-maven-plugin + + none + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler.version} + + + + -Acore.versionId=${project.version} + + + diff --git a/common/src/main/java/org/powertac/common/ClearedTrade.java b/common/src/main/java/org/powertac/common/ClearedTrade.java index c1235dcf..08441c43 100644 --- a/common/src/main/java/org/powertac/common/ClearedTrade.java +++ b/common/src/main/java/org/powertac/common/ClearedTrade.java @@ -32,7 +32,7 @@ * timeslot in which a non-zero quantity was traded. * @author Daniel Schnurr, John Collins */ -@Domain +@Domain(fields = {"timeslot", "executionMWh", "executionPrice", "dateExecuted"}) @XStreamAlias("trade") public class ClearedTrade { diff --git a/common/src/main/java/org/powertac/common/MarketPosition.java b/common/src/main/java/org/powertac/common/MarketPosition.java index 7c2ed275..b10e813b 100644 --- a/common/src/main/java/org/powertac/common/MarketPosition.java +++ b/common/src/main/java/org/powertac/common/MarketPosition.java @@ -36,7 +36,7 @@ * * @author Carsten Block, David Dauer, John Collins */ -@Domain +@Domain(fields = {"broker", "timeslot", "balance"}) @XStreamAlias("market-posn") public class MarketPosition //implements Serializable { diff --git a/common/src/main/java/org/powertac/common/Orderbook.java b/common/src/main/java/org/powertac/common/Orderbook.java index 9c6f50af..f27903ec 100644 --- a/common/src/main/java/org/powertac/common/Orderbook.java +++ b/common/src/main/java/org/powertac/common/Orderbook.java @@ -40,7 +40,7 @@ * @author Daniel Schnurr, John Collins * @version 1.2 , 05/02/2011 */ -@Domain +@Domain(fields = {"timeslot", "clearingPrice", "dateExecuted"}) @XStreamAlias("orderbook") public class Orderbook { diff --git a/common/src/main/java/org/powertac/common/OrderbookOrder.java b/common/src/main/java/org/powertac/common/OrderbookOrder.java index 1ea580cd..84cae3e2 100644 --- a/common/src/main/java/org/powertac/common/OrderbookOrder.java +++ b/common/src/main/java/org/powertac/common/OrderbookOrder.java @@ -26,7 +26,7 @@ * an Orderbook. * @author Daniel Schnurr */ -@Domain +@Domain(fields = {"mWh", "limitPrice"}) @XStreamAlias("orderbook-bid") public class OrderbookOrder implements Comparable { diff --git a/common/src/main/java/org/powertac/common/TariffSpecification.java b/common/src/main/java/org/powertac/common/TariffSpecification.java index ae805c15..d3076d96 100644 --- a/common/src/main/java/org/powertac/common/TariffSpecification.java +++ b/common/src/main/java/org/powertac/common/TariffSpecification.java @@ -54,14 +54,19 @@ * * @author John Collins */ -@Domain(fields = {"broker", "powerType", "minDuration", "signupPayment", - "earlyWithdrawPayment", "periodicPayment", "expiration", +@Domain(fields = {"broker", "powerType", "expiration", "minDuration", + "signupPayment", "earlyWithdrawPayment", "periodicPayment", "supersedes"}) @XStreamAlias("tariff-spec") public class TariffSpecification extends TariffMessage { static private Logger log = LogManager.getLogger(TariffSpecification.class); + /** Last date, in msec past epoch, that new subscriptions will be accepted. + * Zero means never expire. */ + @XStreamAsAttribute + private long expiration = 0l; + /** Minimum contract duration (in milliseconds) */ @XStreamAsAttribute private long minDuration = 0l; @@ -84,11 +89,6 @@ public class TariffSpecification extends TariffMessage @XStreamAsAttribute private double periodicPayment = 0.0; - /** Last date, in msec past epoch, that new subscriptions will be accepted. - * Zero means never expire. */ - @XStreamAsAttribute - private long expiration = 0l; - private List rates; private List supersedes; diff --git a/common/src/main/java/org/powertac/common/WeatherForecastPrediction.java b/common/src/main/java/org/powertac/common/WeatherForecastPrediction.java index 0faac841..9705e2eb 100644 --- a/common/src/main/java/org/powertac/common/WeatherForecastPrediction.java +++ b/common/src/main/java/org/powertac/common/WeatherForecastPrediction.java @@ -28,7 +28,8 @@ * * @version 1.0 - 03/Jun/2011 */ -@Domain +@Domain(fields = {"forecastTime", "temperature", "windSpeed", + "windDirection", "cloudCover"}) @XStreamAlias("weather-prediction") public class WeatherForecastPrediction { diff --git a/common/src/main/java/org/powertac/common/WeatherReport.java b/common/src/main/java/org/powertac/common/WeatherReport.java index 07ef4439..0fc00d90 100644 --- a/common/src/main/java/org/powertac/common/WeatherReport.java +++ b/common/src/main/java/org/powertac/common/WeatherReport.java @@ -32,7 +32,7 @@ * * @version 1.0 - 03/May/2011 */ -@Domain +@Domain(fields = {"timeslot", "temperature", "windSpeed", "windDirection", "cloudCover"}) @XStreamAlias("weather-report") public class WeatherReport { diff --git a/common/src/main/java/org/powertac/common/msg/BalanceReport.java b/common/src/main/java/org/powertac/common/msg/BalanceReport.java index 1c919f0e..d6d6348f 100644 --- a/common/src/main/java/org/powertac/common/msg/BalanceReport.java +++ b/common/src/main/java/org/powertac/common/msg/BalanceReport.java @@ -29,7 +29,7 @@ * @author John Collins */ @XStreamAlias("balance-report") -@Domain +@Domain(fields = {"timeslotIndex", "newImbalance"}) public class BalanceReport { @XStreamAsAttribute diff --git a/common/src/main/java/org/powertac/common/msg/OrderStatus.java b/common/src/main/java/org/powertac/common/msg/OrderStatus.java index dba2a28b..708bf5dd 100644 --- a/common/src/main/java/org/powertac/common/msg/OrderStatus.java +++ b/common/src/main/java/org/powertac/common/msg/OrderStatus.java @@ -32,7 +32,7 @@ * * @author John Collins */ -@Domain +@Domain(fields = {"broker", "orderId", "status"}) @XStreamAlias("order-status") public class OrderStatus extends XStreamStateLoggable diff --git a/common/src/main/java/org/powertac/common/msg/TariffStatus.java b/common/src/main/java/org/powertac/common/msg/TariffStatus.java index e4ccd81b..63199d1a 100644 --- a/common/src/main/java/org/powertac/common/msg/TariffStatus.java +++ b/common/src/main/java/org/powertac/common/msg/TariffStatus.java @@ -28,7 +28,7 @@ * of a tariff. * @author jcollins */ -@Domain +@Domain(fields = {"broker", "tariffId", "updateId", "status"}) @XStreamAlias("tariff-status") public class TariffStatus extends TariffMessage { diff --git a/common/src/main/resources/metadata/default-log.schema b/common/src/main/resources/metadata/default-log.schema new file mode 100644 index 00000000..8f870b0a --- /dev/null +++ b/common/src/main/resources/metadata/default-log.schema @@ -0,0 +1,29 @@ +Domain-metadata-version:default +org.powertac.common.Order:broker,timeslot,MWh,limitPrice +org.powertac.common.DistributionTransaction:postedTimeslot,NSmall,NLarge,KWh,charge +org.powertac.common.RegulationRate:tariffId,response,upRegulationPayment,downRegulationPayment +org.powertac.common.msg.EconomicControlEvent:tariffId,curtailmentRatio,timeslotIndex +org.powertac.common.msg.VariableRateUpdate:broker,tariffId,payload,rateId +org.powertac.common.msg.TariffExpire:broker,tariffId,newExpiration +org.powertac.common.msg.DistributionReport:timeslot,totalConsumption,totalProduction +org.powertac.common.Rate:tariffId,weeklyBegin,weeklyEnd,dailyBegin,dailyEnd,tierThreshold,fixed,minValue,maxValue,noticeInterval,expectedMean,maxCurtailment +org.powertac.common.msg.BalancingOrder:exerciseRatio,price,tariffId,broker +org.powertac.common.msg.OrderStatus:broker,orderId,status +org.powertac.common.msg.TariffStatus:broker,tariffId,updateId,status +org.powertac.common.HourlyCharge:rateId,value,atTime +org.powertac.common.msg.TariffRevoke:broker,tariffId +org.powertac.common.BalancingTransaction:postedTimeslot,kWh,charge +org.powertac.common.TariffSpecification:broker,powerType,minDuration,signupPayment,earlyWithdrawPayment,periodicPayment,supersedes +org.powertac.common.MarketPosition:broker,timeslot,balance +org.powertac.common.WeatherForecastPrediction:forecastTime,temperature,windSpeed,windDirection,cloudCover +org.powertac.common.MarketTransaction:postedTimeslot,timeslot,MWh,price +org.powertac.common.CapacityTransaction:postedTimeslot,peakTimeslot,threshold,KWh,charge +org.powertac.common.msg.BalanceReport:timeslotIndex,newImbalance +org.powertac.common.OrderbookOrder:mWh,limitPrice +org.powertac.common.ClearedTrade:timeslot,executionMWh,executionPrice,dateExecuted +org.powertac.common.CashPosition:postedTimeslot,balance +org.powertac.common.BankTransaction:postedTimeslot,amount +org.powertac.common.Orderbook:timeslot,clearingPrice,dateExecuted +org.powertac.common.WeatherReport:timeslot,temperature,windSpeed,windDirection,cloudCover +org.powertac.common.msg.BalancingControlEvent:tariffId,kwh,payment,timeslotIndex +org.powertac.common.TariffTransaction:postedTimeslot,txType,customerInfo,customerCount,KWh,charge,regulation diff --git a/common/src/main/resources/metadata/domain-default.schema b/common/src/main/resources/metadata/domain-default.schema new file mode 100644 index 00000000..112760a8 --- /dev/null +++ b/common/src/main/resources/metadata/domain-default.schema @@ -0,0 +1,30 @@ +Domain-schema-version:default +org.powertac.common.Order:broker,timeslot,MWh,limitPrice +org.powertac.common.DistributionTransaction:postedTimeslot,NSmall,NLarge,KWh,charge +org.powertac.common.RegulationRate:tariffId,response,upRegulationPayment,downRegulationPayment +org.powertac.common.msg.EconomicControlEvent:tariffId,curtailmentRatio,timeslotIndex +org.powertac.common.msg.VariableRateUpdate:broker,tariffId,payload,rateId +org.powertac.common.msg.TariffExpire:broker,tariffId,newExpiration +org.powertac.common.msg.DistributionReport:timeslot,totalConsumption,totalProduction +org.powertac.common.Rate:tariffId,weeklyBegin,weeklyEnd,dailyBegin,dailyEnd,tierThreshold,fixed,minValue,maxValue,noticeInterval,expectedMean,maxCurtailment +org.powertac.common.msg.BalancingOrder:exerciseRatio,price,tariffId,broker +org.powertac.common.msg.OrderStatus:broker,orderId,status +org.powertac.common.msg.TariffStatus:broker,tariffId,updateId,status +org.powertac.common.HourlyCharge:rateId,value,atTime +org.powertac.common.msg.TariffRevoke:broker,tariffId +org.powertac.common.BalancingTransaction:postedTimeslot,kWh,charge +org.powertac.common.TariffSpecification:broker,powerType,minDuration,signupPayment,earlyWithdrawPayment,periodicPayment,supersedes +org.powertac.common.MarketPosition:broker,timeslot,balance +org.powertac.common.WeatherForecastPrediction:forecastTime,temperature,windSpeed,windDirection,cloudCover +org.powertac.common.MarketTransaction:postedTimeslot,timeslot,MWh,price +org.powertac.common.CapacityTransaction:postedTimeslot,peakTimeslot,threshold,KWh,charge +org.powertac.common.msg.BalanceReport:timeslotIndex,newImbalance +org.powertac.common.OrderbookOrder:mWh,limitPrice +org.powertac.common.ClearedTrade:timeslot,executionMWh,executionPrice,dateExecuted +org.powertac.common.CashPosition:postedTimeslot,balance +org.powertac.common.BankTransaction:postedTimeslot,amount +org.powertac.common.Orderbook:timeslot,clearingPrice,dateExecuted +org.powertac.common.WeatherReport:timeslot,temperature,windSpeed,windDirection,cloudCover +org.powertac.common.msg.BalancingControlEvent:tariffId,kwh,payment,timeslotIndex +org.powertac.common.TariffTransaction:postedTimeslot,txType,customerInfo,customerCount,KWh,charge,regulation +schema.end diff --git a/pom.xml b/pom.xml index ef31af37..3c65b316 100644 --- a/pom.xml +++ b/pom.xml @@ -17,9 +17,11 @@ + diff --git a/powertac-metadata/pom.xml b/powertac-metadata/pom.xml index a5d40bd4..3d7d9a9c 100644 --- a/powertac-metadata/pom.xml +++ b/powertac-metadata/pom.xml @@ -19,6 +19,13 @@ + + + org.powertac + powertac-aop + 1.7.0-SNAPSHOT + + org.springframework @@ -49,12 +56,14 @@ - org.apache.maven.plugins - maven-compiler-plugin - 3.6.1 - - -proc:none - + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler.version} + + -proc:none + + diff --git a/powertac-metadata/src/main/java/org/powertac/metadata/DomainProcessor.java b/powertac-metadata/src/main/java/org/powertac/metadata/DomainProcessor.java new file mode 100644 index 00000000..41ecda8a --- /dev/null +++ b/powertac-metadata/src/main/java/org/powertac/metadata/DomainProcessor.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2019 by John Collins + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.powertac.metadata; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.FilerException; +import javax.annotation.processing.ProcessingEnvironment; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.SourceVersion; +import javax.tools.Diagnostic; +import javax.tools.FileObject; +import javax.tools.StandardLocation; + +import org.powertac.common.state.Domain; + +//import org.powertac.common.state.Domain; + +/** + * @author John Collins + * + */ +@SupportedAnnotationTypes("org.powertac.common.state.Domain") +@SupportedSourceVersion(SourceVersion.RELEASE_8) +public class DomainProcessor extends AbstractProcessor +{ + + public DomainProcessor () + { + super(); + } + + /* (non-Javadoc) + * @see javax.annotation.processing.AbstractProcessor#process(java.util.Set, javax.annotation.processing.RoundEnvironment) + */ + @Override + public boolean process (Set annotations, + RoundEnvironment roundEnv) + { + // start by opening a file for metadata recording + PrintWriter out; + try { + FileObject f = + processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, + "", + "metadata/domain.schema"); + out = new PrintWriter(f.openWriter(), true); + } + catch (FilerException e) { + // happens in normal processing + return true; + } + catch (IOException e) { + e.printStackTrace(); + return true; + } + + Map opts = processingEnv.getOptions(); + //System.out.println("Env options: " + opts.size()); + //for (String key : opts.keySet()) + // System.out.println("Key " + key); + String artifactVersion = opts.get("core.versionId"); + out.format("Domain-schema-version:%s\n", artifactVersion); + if (annotations.size() != 1) { + System.out.println("Should be only one annotation, saw " + annotations.size()); + } + for (TypeElement annotation : annotations) { + //System.out.println("annotation name: " + annotation.getQualifiedName()); + for (Element element : roundEnv.getElementsAnnotatedWith(annotation)) { + TypeMirror tm = element.asType(); + if (tm.getKind() == TypeKind.DECLARED) { + Domain domain = element.getAnnotation(Domain.class); + if (domain.fields().length > 0) { + out.format("%s:", tm.toString()); + String delim = ""; + for (String field: domain.fields()) { + out.format("%s%s", delim, field); + delim = ","; + } + out.format("\n"); + } + } + } + } + out.format("schema.end\n"); + out.close(); + return true; + } + +} diff --git a/powertac-metadata/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/powertac-metadata/src/main/resources/META-INF/services/javax.annotation.processing.Processor new file mode 100644 index 00000000..24ba0e72 --- /dev/null +++ b/powertac-metadata/src/main/resources/META-INF/services/javax.annotation.processing.Processor @@ -0,0 +1,2 @@ +# annotation processing services +org.powertac.metadata.DomainProcessor \ No newline at end of file