From 891b4605a57e375c3a5563fcebaf6ede73b8d0d4 Mon Sep 17 00:00:00 2001 From: Ricardo Zanini Date: Thu, 13 Feb 2025 12:15:07 -0500 Subject: [PATCH 1/2] Fix Release action by adding nexus-staging plugin Signed-off-by: Ricardo Zanini --- .github/workflows/release.yml | 22 +- pom.xml | 865 +++++++++++++++++----------------- 2 files changed, 460 insertions(+), 427 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2d002124..2f6c77ef 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -51,7 +51,27 @@ jobs: cat release.properties git checkout ${{github.base_ref}} git rebase release - mvn -B release:perform -Darguments=-DperformRelease -DperformRelease -Prelease + mvn -B release:perform -Prelease -Darguments="-DperformRelease" + env: + MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }} + MAVEN_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + + - name: Create Staging Repository + run: mvn nexus-staging:deploy + env: + MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }} + MAVEN_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + + - name: Check Staging Repository + run: mvn nexus-staging:rc-list + env: + MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }} + MAVEN_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + + - name: Close & Release Staging Repository + run: | + mvn nexus-staging:rc-close + mvn nexus-staging:rc-release env: MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }} MAVEN_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} diff --git a/pom.xml b/pom.xml index 904f8353..88339a24 100644 --- a/pom.xml +++ b/pom.xml @@ -1,40 +1,41 @@ - - 4.0.0 + + 4.0.0 - io.serverlessworkflow - serverlessworkflow-parent - 8.0.0-SNAPSHOT - pom + io.serverlessworkflow + serverlessworkflow-parent + 8.0.0-SNAPSHOT + pom - Serverless Workflow :: Parent - https://serverlessworkflow.io/sdk-java/ - Java SDK for Serverless Workflow Specification - 2020 - - - serverless-workflow - Serverless Workflow Specification Authors - CNCF - - - - CNCF - https://www.cncf.io// - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - scm:git:git@github.com:serverlessworkflow/sdk-java.git - scm:git:git@github.com:serverlessworkflow/sdk-java.git - https://github.com/serverlessworkflow/sdk-java - HEAD - + Serverless Workflow :: Parent + https://serverlessworkflow.io/sdk-java/ + Java SDK for Serverless Workflow Specification + 2020 + + + serverless-workflow + Serverless Workflow Specification Authors + CNCF + + + + CNCF + https://www.cncf.io// + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + scm:git:git@github.com:serverlessworkflow/sdk-java.git + scm:git:git@github.com:serverlessworkflow/sdk-java.git + https://github.com/serverlessworkflow/sdk-java + HEAD + api @@ -42,47 +43,48 @@ impl - - 17 - ${java.version} - ${java.version} - UTF-8 - 3.9.7 + + 17 + ${java.version} + ${java.version} + UTF-8 + 3.9.7 - - 3.2.1 - 3.6.0 - 3.13.0 - 3.1.3 - 3.5.0 - 3.5.2 - 2.25 - 3.2.7 - 3.4.2 - ${java.version} - 1.2.2 - 3.11.2 - 3.1.1 - 3.3.1 - 3.5.2 + + 3.2.1 + 3.6.0 + 3.13.0 + 3.1.3 + 3.5.0 + 3.5.2 + 2.25 + 3.2.7 + 3.4.2 + ${java.version} + 1.2.2 + 3.11.2 + 3.1.1 + 3.3.1 + 3.5.2 + 1.6.13 - - 1.5.16 - 2.18.2 - 1.5.5 - 3.1.1 - 1.5.2 - 3.27.3 - 5.11.4 - 5.15.2 - 2.0.16 - 8.0.2.Final - 5.0.0 + + 1.5.16 + 2.18.2 + 1.5.5 + 3.1.1 + 1.5.2 + 3.27.3 + 5.11.4 + 5.15.2 + 2.0.16 + 8.0.2.Final + 5.0.0 - - true - + true + - - java - true - + + java + true + - - - - org.slf4j - slf4j-api - ${version.org.slf4j} - - - com.fasterxml.jackson.core - jackson-core - ${version.com.fasterxml.jackson} - - - com.fasterxml.jackson.core - jackson-databind - ${version.com.fasterxml.jackson} - - - com.networknt - json-schema-validator - ${version.com.networknt} - - - org.hibernate.validator - hibernate-validator - ${version.org.hibernate.validator} - - - org.glassfish.expressly - expressly - ${version.org.glassfish.expressly} - + + + + org.slf4j + slf4j-api + ${version.org.slf4j} + + + com.fasterxml.jackson.core + jackson-core + ${version.com.fasterxml.jackson} + + + com.fasterxml.jackson.core + jackson-databind + ${version.com.fasterxml.jackson} + + + com.networknt + json-schema-validator + ${version.com.networknt} + + + org.hibernate.validator + hibernate-validator + ${version.org.hibernate.validator} + + + org.glassfish.expressly + expressly + ${version.org.glassfish.expressly} + - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - ${version.com.fasterxml.jackson} - - - org.jsonschema2pojo - jsonschema2pojo-core - ${version.jsonschema2pojo-maven-plugin} - - - jakarta.validation - jakarta.validation-api - ${version.jakarta.validation} - - - - - org.junit.jupiter - junit-jupiter-api - ${version.org.junit.jupiter} - test - - - org.junit.jupiter - junit-jupiter-engine - ${version.org.junit.jupiter} - test - - - org.junit.jupiter - junit-jupiter-params - ${version.org.junit.jupiter} - test - - - org.mockito - mockito-core - ${version.org.mockito} - test - - - ch.qos.logback - logback-classic - ${version.ch.qos.logback} - test - - - org.assertj - assertj-core - ${version.org.assertj} - test - - - + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + ${version.com.fasterxml.jackson} + + + org.jsonschema2pojo + jsonschema2pojo-core + ${version.jsonschema2pojo-maven-plugin} + + + jakarta.validation + jakarta.validation-api + ${version.jakarta.validation} + - - - - - org.codehaus.mojo - buildnumber-maven-plugin - ${version.buildnumber.plugin} - - - get-scm-revision - initialize - - create - - - false - false - UNKNOWN - true - - - - - - maven-compiler-plugin - ${version.compiler.plugin} - - true - true - ${maven.compiler.source} - ${maven.compiler.target} - ${maven.compiler.source} - ${maven.compiler.target} - true - - -Xlint:unchecked - - - - + + + org.junit.jupiter + junit-jupiter-api + ${version.org.junit.jupiter} + test + + + org.junit.jupiter + junit-jupiter-engine + ${version.org.junit.jupiter} + test + + + org.junit.jupiter + junit-jupiter-params + ${version.org.junit.jupiter} + test + + + org.mockito + mockito-core + ${version.org.mockito} + test + + + ch.qos.logback + logback-classic + ${version.ch.qos.logback} + test + + + org.assertj + assertj-core + ${version.org.assertj} + test + + + + + + + + + org.codehaus.mojo + buildnumber-maven-plugin + ${version.buildnumber.plugin} + + + get-scm-revision + initialize + + create + + + false + false + UNKNOWN + true + + + + + + maven-compiler-plugin + ${version.compiler.plugin} + + true + true + ${maven.compiler.source} + ${maven.compiler.target} + ${maven.compiler.source} + ${maven.compiler.target} + true + + -Xlint:unchecked + + + + org.apache.maven.plugins maven-checkstyle-plugin - - + + - - + + @@ -293,228 +295,239 @@ - + - - - - org.apache.maven.plugins - maven-gpg-plugin - ${version.gpg.plugin} - - - maven-deploy-plugin - ${version.deploy.plugin} - - 10 - - - - org.apache.maven.plugins - maven-enforcer-plugin - ${version.enforcer.plugin} - - - enforce-versions - - enforce - - - - - ${version.maven} - - - ${version.jdk} - - - - - - - - org.apache.maven.plugins - maven-source-plugin - ${version.source.plugin} - - - attach-sources - - jar-no-fork - - - - - - true - - - true - - - true - - - - ${project.url} - ${java.version} - ${java.vendor} - ${os.name} - ${os.arch} - ${os.version} - ${project.scm.url} - ${project.scm.connection} - ${buildNumber} - - - - - - org.apache.maven.plugins - maven-release-plugin - ${version.release.plugin} - - clean install - true - @{project.version} - false - true - false - - - - org.jsonschema2pojo - jsonschema2pojo-maven-plugin - ${version.jsonschema2pojo-maven-plugin} - - - org.apache.maven.plugins - maven-surefire-plugin - ${version.surefire.plugin} - - -Xmx1024m -XX:+IgnoreUnrecognizedVMOptions -XX:MaxPermSize=256m - - - - org.apache.maven.plugins - maven-failsafe-plugin - ${version.failsafe.plugin} - - -Xmx1024m -XX:+IgnoreUnrecognizedVMOptions -XX:MaxPermSize=256m - - - - org.apache.maven.plugins - maven-checkstyle-plugin - ${version.checkstyle.plugin} - - - com.spotify.fmt - fmt-maven-plugin - ${version.fmt-maven-plugin} - - - org.apache.maven.plugins - maven-jar-plugin - ${version.jar.plugin} - - - true - - - true - - - true - - - - ${project.url} - ${java.version} - ${java.vendor} - ${os.name} - ${os.arch} - ${os.version} - ${project.scm.url} - ${project.scm.connection} - ${buildNumber} - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - ${version.javadoc.plugin} - - false - - - - - + + + + org.sonatype.plugins + nexus-staging-maven-plugin + ${version.nexus.plugin} + true + + ossrh + https://oss.sonatype.org/ + true + + + + org.apache.maven.plugins + maven-gpg-plugin + ${version.gpg.plugin} + + + maven-deploy-plugin + ${version.deploy.plugin} + + 10 + + + + org.apache.maven.plugins + maven-enforcer-plugin + ${version.enforcer.plugin} + + + enforce-versions + + enforce + + + + + ${version.maven} + + + ${version.jdk} + + + + + + + + org.apache.maven.plugins + maven-source-plugin + ${version.source.plugin} + + + attach-sources + + jar-no-fork + + + + + + true + + + true + + + true + + + + ${project.url} + ${java.version} + ${java.vendor} + ${os.name} + ${os.arch} + ${os.version} + ${project.scm.url} + ${project.scm.connection} + ${buildNumber} + + + + + + org.apache.maven.plugins + maven-release-plugin + ${version.release.plugin} + + clean install + true + @{project.version} + false + true + false + + + + org.jsonschema2pojo + jsonschema2pojo-maven-plugin + ${version.jsonschema2pojo-maven-plugin} + + + org.apache.maven.plugins + maven-surefire-plugin + ${version.surefire.plugin} + + -Xmx1024m -XX:+IgnoreUnrecognizedVMOptions -XX:MaxPermSize=256m + + + + org.apache.maven.plugins + maven-failsafe-plugin + ${version.failsafe.plugin} + + -Xmx1024m -XX:+IgnoreUnrecognizedVMOptions -XX:MaxPermSize=256m + + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${version.checkstyle.plugin} + + + com.spotify.fmt + fmt-maven-plugin + ${version.fmt-maven-plugin} + + + org.apache.maven.plugins + maven-jar-plugin + ${version.jar.plugin} + + + true + + + true + + + true + + + + ${project.url} + ${java.version} + ${java.vendor} + ${os.name} + ${os.arch} + ${os.version} + ${project.scm.url} + ${project.scm.connection} + ${buildNumber} + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${version.javadoc.plugin} + + false + + + + + - - - ossrh-snapshots - https://oss.sonatype.org/content/repositories/snapshots - - - ossrh - https://oss.sonatype.org/service/local/staging/deploy/maven2/ - - + + + ossrh-snapshots + https://oss.sonatype.org/content/repositories/snapshots + + + ossrh + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + - - - central - Central Repository - https://repo.maven.apache.org/maven2 - default - - false - - - + + + central + Central Repository + https://repo.maven.apache.org/maven2 + default + + false + + + - - - release - - - - org.apache.maven.plugins - maven-gpg-plugin - - - --pinentry-mode - loopback - - - - - sign-artifacts - verify - - sign - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - - package - - jar - - - - - - - - + + + release + + + + org.apache.maven.plugins + maven-gpg-plugin + + + --pinentry-mode + loopback + + + + + sign-artifacts + verify + + sign + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + package + + jar + + + + + + + + From bb5740dab31336f0fcb8035e829168611367d072 Mon Sep 17 00:00:00 2001 From: Ricardo Zanini Date: Thu, 13 Feb 2025 12:23:46 -0500 Subject: [PATCH 2/2] Fix and format pom files Signed-off-by: Ricardo Zanini --- .github/workflows/maven-verify.yml | 4 + api/pom.xml | 2 +- custom-generator/pom.xml | 32 ++++---- examples/events/pom.xml | 38 ++++----- examples/pom.xml | 66 +++++++-------- examples/simpleGet/pom.xml | 46 ++++++----- impl/core/pom.xml | 122 ++++++++++++++-------------- impl/http/pom.xml | 86 ++++++++++---------- impl/pom.xml | 126 +++++++++++++++-------------- pom.xml | 2 +- 10 files changed, 271 insertions(+), 253 deletions(-) diff --git a/.github/workflows/maven-verify.yml b/.github/workflows/maven-verify.yml index a9f5077c..2070974b 100644 --- a/.github/workflows/maven-verify.yml +++ b/.github/workflows/maven-verify.yml @@ -26,3 +26,7 @@ jobs: - name: Verify with Maven run: | mvn -B -f pom.xml clean install verify + + - name: Verify Examples with Maven + run: | + mvn -B -f examples/pom.xml clean install verify diff --git a/api/pom.xml b/api/pom.xml index b8cfb953..69f8c2f5 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -112,7 +112,7 @@ io.serverlessworkflow - custom-generator + serverless-workflow-custom-generator ${project.version} diff --git a/custom-generator/pom.xml b/custom-generator/pom.xml index fb653bee..3660e286 100644 --- a/custom-generator/pom.xml +++ b/custom-generator/pom.xml @@ -1,20 +1,22 @@ - - 4.0.0 - - io.serverlessworkflow - serverlessworkflow-parent - 8.0.0-SNAPSHOT - - custom-generator - + + 4.0.0 + + io.serverlessworkflow + serverlessworkflow-parent + 8.0.0-SNAPSHOT + + serverless-workflow-custom-generator + Serverless Workflow :: Custom Generator + org.jsonschema2pojo jsonschema2pojo-core - - - - + + + + com.spotify.fmt fmt-maven-plugin @@ -34,6 +36,6 @@ - - + + \ No newline at end of file diff --git a/examples/events/pom.xml b/examples/events/pom.xml index 4ca2214a..143a7967 100644 --- a/examples/events/pom.xml +++ b/examples/events/pom.xml @@ -1,19 +1,21 @@ - - 4.0.0 - - io.serverlessworkflow - serverlessworkflow-examples - 8.0.0-SNAPSHOT - - serverlessworkflow-examples-events - - - io.serverlessworkflow - serverlessworkflow-impl-core - - - org.slf4j - slf4j-simple - - + + 4.0.0 + + io.serverlessworkflow + serverlessworkflow-examples + 8.0.0-SNAPSHOT + + Serverless Workflow :: Examples :: Events + serverlessworkflow-examples-events + + + io.serverlessworkflow + serverlessworkflow-impl-core + + + org.slf4j + slf4j-simple + + \ No newline at end of file diff --git a/examples/pom.xml b/examples/pom.xml index 941f5b1a..238ee4b1 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -1,33 +1,35 @@ - - 4.0.0 - - io.serverlessworkflow - serverlessworkflow-parent - 8.0.0-SNAPSHOT - - serverlessworkflow-examples - pom - - - - io.serverlessworkflow - serverlessworkflow-impl-core - ${project.version} - - - io.serverlessworkflow - serverlessworkflow-impl-http - ${project.version} - - - org.slf4j - slf4j-simple - 2.0.16 - - - - - simpleGet - events - + + 4.0.0 + + io.serverlessworkflow + serverlessworkflow-parent + 8.0.0-SNAPSHOT + + Serverless Workflow :: Examples + serverlessworkflow-examples + pom + + + + io.serverlessworkflow + serverlessworkflow-impl-core + ${project.version} + + + io.serverlessworkflow + serverlessworkflow-impl-http + ${project.version} + + + org.slf4j + slf4j-simple + ${version.org.slf4j} + + + + + simpleGet + events + \ No newline at end of file diff --git a/examples/simpleGet/pom.xml b/examples/simpleGet/pom.xml index a1418e4b..923001ae 100644 --- a/examples/simpleGet/pom.xml +++ b/examples/simpleGet/pom.xml @@ -1,23 +1,25 @@ - - 4.0.0 - - io.serverlessworkflow - serverlessworkflow-examples - 8.0.0-SNAPSHOT - - serverlessworkflow-examples-simpleGet - - - io.serverlessworkflow - serverlessworkflow-impl-core - - - io.serverlessworkflow - serverlessworkflow-impl-http - - - org.slf4j - slf4j-simple - - + + 4.0.0 + + io.serverlessworkflow + serverlessworkflow-examples + 8.0.0-SNAPSHOT + + serverlessworkflow-examples-simpleGet + Serverless Workflow :: Examples :: SimpleGet + + + io.serverlessworkflow + serverlessworkflow-impl-core + + + io.serverlessworkflow + serverlessworkflow-impl-http + + + org.slf4j + slf4j-simple + + \ No newline at end of file diff --git a/impl/core/pom.xml b/impl/core/pom.xml index 4267172e..a5fac29a 100644 --- a/impl/core/pom.xml +++ b/impl/core/pom.xml @@ -1,61 +1,63 @@ - - 4.0.0 - - io.serverlessworkflow - serverlessworkflow-impl - 8.0.0-SNAPSHOT - - serverlessworkflow-impl-core - - - io.serverlessworkflow - serverlessworkflow-api - ${project.version} - - - io.cloudevents - cloudevents-api - - - io.cloudevents - cloudevents-json-jackson - - - com.github.f4b6a3 - ulid-creator - - - com.networknt - json-schema-validator - - - net.thisptr - jackson-jq - - - org.junit.jupiter - junit-jupiter-api - test - - - org.junit.jupiter - junit-jupiter-engine - test - - - org.junit.jupiter - junit-jupiter-params - test - - - org.assertj - assertj-core - test - - - ch.qos.logback - logback-classic - test - - + + 4.0.0 + + io.serverlessworkflow + serverlessworkflow-impl + 8.0.0-SNAPSHOT + + serverlessworkflow-impl-core + Serverless Workflow :: Impl :: Core + + + io.serverlessworkflow + serverlessworkflow-api + ${project.version} + + + io.cloudevents + cloudevents-api + + + io.cloudevents + cloudevents-json-jackson + + + com.github.f4b6a3 + ulid-creator + + + com.networknt + json-schema-validator + + + net.thisptr + jackson-jq + + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-params + test + + + org.assertj + assertj-core + test + + + ch.qos.logback + logback-classic + test + + diff --git a/impl/http/pom.xml b/impl/http/pom.xml index 998ff945..fdf2a168 100644 --- a/impl/http/pom.xml +++ b/impl/http/pom.xml @@ -1,43 +1,45 @@ - - 4.0.0 - - io.serverlessworkflow - serverlessworkflow-impl - 8.0.0-SNAPSHOT - - serverlessworkflow-impl-http - - - org.glassfish.jersey.core - jersey-client - - - org.glassfish.jersey.media - jersey-media-json-jackson - - - io.serverlessworkflow - serverlessworkflow-impl-core - - - org.junit.jupiter - junit-jupiter-api - test - - - org.junit.jupiter - junit-jupiter-engine - test - - - org.junit.jupiter - junit-jupiter-params - test - - - org.assertj - assertj-core - test - - + + 4.0.0 + + io.serverlessworkflow + serverlessworkflow-impl + 8.0.0-SNAPSHOT + + serverlessworkflow-impl-http + Serverless Workflow :: Impl :: HTTP + + + org.glassfish.jersey.core + jersey-client + + + org.glassfish.jersey.media + jersey-media-json-jackson + + + io.serverlessworkflow + serverlessworkflow-impl-core + + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-params + test + + + org.assertj + assertj-core + test + + \ No newline at end of file diff --git a/impl/pom.xml b/impl/pom.xml index 307dcbc7..65fa9095 100644 --- a/impl/pom.xml +++ b/impl/pom.xml @@ -1,64 +1,66 @@ - - 4.0.0 - - io.serverlessworkflow - serverlessworkflow-parent - 8.0.0-SNAPSHOT - - serverlessworkflow-impl - pom - - 3.1.10 - 4.0.1 - 1.2.0 - 5.2.3 - - - - + + 4.0.0 + io.serverlessworkflow - serverlessworkflow-impl-core - ${project.version} - - - io.serverlessworkflow - serverlessworkflow-impl-http - ${project.version} - - - org.glassfish.jersey.core - jersey-client - ${version.org.glassfish.jersey} - - - org.glassfish.jersey.media - jersey-media-json-jackson - ${version.org.glassfish.jersey} - - - io.cloudevents - cloudevents-api - ${version.io.cloudevents} - - - io.cloudevents - cloudevents-json-jackson - ${version.io.cloudevents} - - - net.thisptr - jackson-jq - ${version.net.thisptr} - - - com.github.f4b6a3 - ulid-creator - ${version.com.github.f4b6a3} - - - - - http - core - + serverlessworkflow-parent + 8.0.0-SNAPSHOT + + serverlessworkflow-impl + Serverless Workflow :: Impl + pom + + 3.1.10 + 4.0.1 + 1.2.0 + 5.2.3 + + + + + io.serverlessworkflow + serverlessworkflow-impl-core + ${project.version} + + + io.serverlessworkflow + serverlessworkflow-impl-http + ${project.version} + + + org.glassfish.jersey.core + jersey-client + ${version.org.glassfish.jersey} + + + org.glassfish.jersey.media + jersey-media-json-jackson + ${version.org.glassfish.jersey} + + + io.cloudevents + cloudevents-api + ${version.io.cloudevents} + + + io.cloudevents + cloudevents-json-jackson + ${version.io.cloudevents} + + + net.thisptr + jackson-jq + ${version.net.thisptr} + + + com.github.f4b6a3 + ulid-creator + ${version.com.github.f4b6a3} + + + + + http + core + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 88339a24..e054f843 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt + https://www.apache.org/licenses/LICENSE-2.0.txt repo pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy