1+ #! /bin/bash
2+
3+ set -e
4+
5+ SCRIPT_DIR=" $( cd " $( dirname " ${BASH_SOURCE[0]} " ) " && pwd) "
6+ PROJECT_ROOT=" ${SCRIPT_DIR} /.."
7+ DEFAULT_OPENAPI_FILE=" ${SCRIPT_DIR} /openapi.json"
8+ DEFAULT_PACKAGE_NAME=" co.permify.sdk"
9+ DEFAULT_CLIENT_NAME=" PermifyClient"
10+
11+ usage () {
12+ echo " Usage: $0 [OPTIONS]"
13+ echo " "
14+ echo " Generate Java SDK from OpenAPI specification and update project directories"
15+ echo " "
16+ echo " Options:"
17+ echo " -i, --input FILE OpenAPI JSON file (default: ${DEFAULT_OPENAPI_FILE} )"
18+ echo " -p, --package NAME Java package name (default: ${DEFAULT_PACKAGE_NAME} )"
19+ echo " -c, --client NAME Client class name (default: ${DEFAULT_CLIENT_NAME} )"
20+ echo " -h, --help Show this help message"
21+ echo " "
22+ echo " This script will update the following directories:"
23+ echo " - ../api"
24+ echo " - ../src"
25+ echo " - ../docs"
26+ echo " "
27+ echo " Examples:"
28+ echo " $0 # Use defaults"
29+ echo " $0 -i swagger.json # Custom input file"
30+ echo " $0 -p com.example.client # Custom package name"
31+ }
32+
33+ OPENAPI_FILE=" ${DEFAULT_OPENAPI_FILE} "
34+ PACKAGE_NAME=" ${DEFAULT_PACKAGE_NAME} "
35+ CLIENT_NAME=" ${DEFAULT_CLIENT_NAME} "
36+
37+ while [[ $# -gt 0 ]]; do
38+ case $1 in
39+ -i|--input)
40+ OPENAPI_FILE=" $2 "
41+ shift 2
42+ ;;
43+ -p|--package)
44+ PACKAGE_NAME=" $2 "
45+ shift 2
46+ ;;
47+ -c|--client)
48+ CLIENT_NAME=" $2 "
49+ shift 2
50+ ;;
51+ -h|--help)
52+ usage
53+ exit 0
54+ ;;
55+ * )
56+ echo " Unknown option: $1 "
57+ usage
58+ exit 1
59+ ;;
60+ esac
61+ done
62+
63+ if [[ ! -f " ${OPENAPI_FILE} " ]]; then
64+ echo " Error: OpenAPI file '${OPENAPI_FILE} ' not found"
65+ exit 1
66+ fi
67+
68+ if ! command -v docker & > /dev/null; then
69+ echo " Error: Docker is required but not installed"
70+ echo " Please install Docker: https://docs.docker.com/get-docker/"
71+ exit 1
72+ fi
73+
74+ TEMP_OUTPUT_DIR=$( mktemp -d)
75+ trap ' rm -rf "${TEMP_OUTPUT_DIR}"' EXIT
76+
77+ OPENAPI_ABSOLUTE_PATH=$( realpath " ${OPENAPI_FILE} " )
78+
79+ OPENAPI_VERSION=$( grep -o ' "version": *"[^"]*"' " ${OPENAPI_FILE} " | cut -d ' "' -f 4)
80+ if [[ -z " ${OPENAPI_VERSION} " ]]; then
81+ echo " Error: Could not extract version from OpenAPI file"
82+ exit 1
83+ fi
84+
85+ echo " Generating Java SDK..."
86+ echo " OpenAPI file: ${OPENAPI_ABSOLUTE_PATH} "
87+ echo " OpenAPI version: ${OPENAPI_VERSION} "
88+ echo " Package name: ${PACKAGE_NAME} "
89+ echo " Client name: ${CLIENT_NAME} "
90+ echo " Temp directory: ${TEMP_OUTPUT_DIR} "
91+ echo " "
92+
93+ docker run --rm \
94+ -v " ${OPENAPI_ABSOLUTE_PATH} :/local/openapi.json:ro" \
95+ -v " ${TEMP_OUTPUT_DIR} :/local/out" \
96+ openapitools/openapi-generator-cli:latest generate \
97+ -i /local/openapi.json \
98+ -g java \
99+ -o /local/out \
100+ --package-name=" ${PACKAGE_NAME} " \
101+ --api-package=" ${PACKAGE_NAME} .api" \
102+ --model-package=" ${PACKAGE_NAME} .model" \
103+ --invoker-package=" ${PACKAGE_NAME} .client" \
104+ --additional-properties=clientPackage=" ${PACKAGE_NAME} .client" ,clientName=" ${CLIENT_NAME} " \
105+ --additional-properties=useJakartaEe=true \
106+ --additional-properties=library=native \
107+ --additional-properties=dateLibrary=java8 \
108+ --additional-properties=java8=true \
109+ --additional-properties=hideGenerationTimestamp=true \
110+ --skip-validate-spec
111+
112+ if [[ $? -ne 0 ]]; then
113+ echo " "
114+ echo " ❌ Failed to generate Java SDK"
115+ exit 1
116+ fi
117+
118+ echo " Updating project directories..."
119+
120+ API_DIR=" ${PROJECT_ROOT} /api"
121+ SRC_DIR=" ${PROJECT_ROOT} /src"
122+ DOCS_DIR=" ${PROJECT_ROOT} /docs"
123+
124+ if [[ -f " ${TEMP_OUTPUT_DIR} /openapi.yaml" ]]; then
125+ echo " Updating ${API_DIR} /openapi.yaml"
126+ mkdir -p " ${API_DIR} "
127+ cp " ${TEMP_OUTPUT_DIR} /openapi.yaml" " ${API_DIR} /openapi.yaml"
128+ fi
129+
130+ if [[ -d " ${TEMP_OUTPUT_DIR} /src" ]]; then
131+ echo " Updating ${SRC_DIR} "
132+ rm -rf " ${SRC_DIR} /main/java/${PACKAGE_NAME// ./ \/ } "
133+ mkdir -p " ${SRC_DIR} /main/java"
134+ cp -r " ${TEMP_OUTPUT_DIR} /src/main/java/" * " ${SRC_DIR} /main/java/"
135+
136+ if [[ -d " ${TEMP_OUTPUT_DIR} /src/test" ]]; then
137+ rm -rf " ${SRC_DIR} /test/java/${PACKAGE_NAME// ./ \/ } "
138+ mkdir -p " ${SRC_DIR} /test/java"
139+ cp -r " ${TEMP_OUTPUT_DIR} /src/test/java/" * " ${SRC_DIR} /test/java/"
140+ fi
141+ fi
142+
143+ if [[ -d " ${TEMP_OUTPUT_DIR} /docs" ]]; then
144+ echo " Updating ${DOCS_DIR} "
145+ rm -rf " ${DOCS_DIR} " /* .md
146+ mkdir -p " ${DOCS_DIR} "
147+ cp " ${TEMP_OUTPUT_DIR} /docs/" * .md " ${DOCS_DIR} /"
148+ fi
149+
150+ # Strip 'v' prefix from version if present
151+ VERSION_WITHOUT_V=" ${OPENAPI_VERSION# v} "
152+ echo " Updating version in pom.xml to ${VERSION_WITHOUT_V} "
153+ POM_FILE=" ${PROJECT_ROOT} /pom.xml"
154+ if [[ -f " ${POM_FILE} " ]]; then
155+ if command -v sed & > /dev/null; then
156+ if [[ " $OSTYPE " == " darwin" * ]]; then
157+ sed -i ' ' ' /<name>Permify Java<\/name>/{n;s|<version>[^<]*</version>|<version>' " ${VERSION_WITHOUT_V} " ' </version>|;}' " ${POM_FILE} "
158+ if [[ $? -eq 0 ]]; then
159+ echo " ✅ Updated pom.xml version to ${VERSION_WITHOUT_V} "
160+ else
161+ echo " ❌ Error: Failed to update pom.xml version"
162+ fi
163+ else
164+ sed -i ' /<name>Permify Java<\/name>/{n;s|<version>[^<]*</version>|<version>' " ${VERSION_WITHOUT_V} " ' </version>|;}' " ${POM_FILE} "
165+ if [[ $? -eq 0 ]]; then
166+ echo " ✅ Updated pom.xml version to ${VERSION_WITHOUT_V} "
167+ else
168+ echo " ❌ Error: Failed to update pom.xml version"
169+ fi
170+ fi
171+ else
172+ echo " ⚠️ Warning: sed not available, could not update pom.xml version"
173+ fi
174+ else
175+ echo " ⚠️ Warning: pom.xml not found at ${POM_FILE} "
176+ fi
177+
178+ echo " "
179+ echo " ✅ Java SDK updated successfully!"
180+ echo " 📁 Updated directories:"
181+ echo " - ${API_DIR} "
182+ echo " - ${SRC_DIR} "
183+ echo " - ${DOCS_DIR} "
184+ echo " 📝 Updated version in pom.xml to ${OPENAPI_VERSION} "
185+ echo " "
186+ echo " Next steps:"
187+ echo " 1. Build the SDK: ./gradlew build (or mvn compile if using Maven)"
188+ echo " 2. Run tests: ./gradlew test (or mvn test if using Maven)"
189+ echo " 3. Install to local repository: ./gradlew publishToMavenLocal (or mvn install)"
0 commit comments