| name | guidewire-local-dev-loop |
| description | Configure local Guidewire development workflow with Guidewire Studio, Gosu debugging,
and hot reload capabilities.
Use when setting up development environment, configuring IDE, or optimizing dev workflow.
Trigger with phrases like "guidewire local dev", "guidewire studio setup",
"gosu development", "guidewire debugging", "configure guidewire ide".
|
| allowed-tools | Read, Write, Edit, Bash(java:*), Bash(gradle:*), Bash(git:*), Grep |
| version | 1.0.0 |
| license | MIT |
| author | Jeremy Longshore <jeremy@intentsolutions.io> |
Guidewire Local Dev Loop
Overview
Set up an efficient local development workflow with Guidewire Studio, including hot reload, Gosu debugging, and continuous testing.
Prerequisites
- JDK 17 installed and configured
- IntelliJ IDEA (Ultimate recommended) or Guidewire Studio
- Gradle 8.x
- Git for version control
- Access to Guidewire Cloud sandbox environment
Instructions
Step 1: Configure IDE Settings
IntelliJ Plugins to Install:
- Gosu Language Support
- Guidewire Studio Plugin
- EditorConfig
Step 2: Project Structure Setup
project-root/
├── build.gradle
├── settings.gradle
├── gradle.properties
├── modules/
│ ├── configuration/
│ │ ├── gsrc/
│ │ └── config/
│ └── integration/
├── database/
│ └── upgrade/
└── build/
└── idea/
Step 3: Configure Local Server
// build.gradle - Local server configuration
plugins {
id 'com.guidewire.gradle' version '10.12.0'
}
guidewire {
server {
port = 8080
debugPort = 5005
jvmArgs = [
'-Xmx4g',
'-XX:+UseG1GC',
'-Dgw.server.mode=dev'
]
}
database {
server = 'localhost'
port = 5432
name = 'pc_dev'
username = 'postgres'
password = System.getenv('DB_PASSWORD') ?: 'password'
}
}
// Hot reload configuration
tasks.register('devServer') {
dependsOn 'classes'
doLast {
exec {
commandLine 'java', '-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005',
'-jar', 'build/libs/server.jar'
}
}
}
Step 4: Database Setup
createdb -U postgres pc_dev
./gradlew dbUpgrade
./gradlew dbReset
./gradlew loadSampleData
Step 5: Start Development Server
./gradlew runServer
./gradlew runServer --debug-jvm
./gradlew :policycenter:runServer
Step 6: Configure Hot Reload
// Enable Gosu hot swap in development
// config/dev-config.xml
<config>
<development>
<hot-swap enabled="true"/>
<gosu-reload enabled="true"/>
<pcf-reload enabled="true"/>
</development>
</config>
IDE Configuration for Hot Reload:
- Run > Edit Configurations > Remote JVM Debug
- Set port to 5005
- Start debug session after server is running
Gosu Development Workflow
Create New Gosu Class
// gsrc/gw/custom/MyService.gs
package gw.custom
uses gw.api.database.Query
uses gw.api.util.Logger
class MyService {
private static final var LOG = Logger.forCategory("MyService")
static function processPolicy(policyNumber : String) : Policy {
LOG.info("Processing policy: ${policyNumber}")
var policy = Query.make(Policy)
.compare(Policy#PolicyNumber, Equals, policyNumber)
.select()
.AtMostOneRow
if (policy == null) {
throw new IllegalArgumentException("Policy not found: ${policyNumber}")
}
// Business logic here
return policy
}
}
Unit Testing
// test/gsrc/gw/custom/MyServiceTest.gs
package gw.custom
uses gw.testharness.v3.PLTestCase
uses gw.testharness.v3.PLAssert
class MyServiceTest extends PLTestCase {
function testProcessPolicy() {
// Setup test data
var account = createTestAccount()
var policy = createTestPolicy(account)
// Execute
var result = MyService.processPolicy(policy.PolicyNumber)
// Assert
PLAssert.assertNotNull(result)
PLAssert.assertEquals(policy.PolicyNumber, result.PolicyNumber)
}
private function createTestAccount() : Account {
var account = new Account()
account.AccountNumber = "TEST-" + System.currentTimeMillis()
account.Bundle.commit()
return account
}
}
Run Tests
./gradlew test
./gradlew test --tests "gw.custom.MyServiceTest"
./gradlew test jacocoTestReport
./gradlew test --continuous
PCF Development
<?xml version="1.0"?>
<PCF
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="pcf.xsd">
<Screen
id="AccountDetailScreen"
editable="true">
<Require var="account" type="Account"/>
<Toolbar>
<ToolbarButton
action="saveAccount()"
id="SaveButton"
label="Save"/>
</Toolbar>
<DetailViewPanel>
<InputColumn>
<TextInput
editable="true"
id="AccountNumber"
label="Account Number"
value="account.AccountNumber"/>
<TextInput
editable="true"
id="AccountName"
label="Account Name"
value=/>
<![CDATA[
function saveAccount() {
account.Bundle.commit()
util.LocationUtil.addRequestScopedInfoMessage("Account saved")
}
]]>
Output
- Running local development server
- Hot reload enabled for Gosu and PCF changes
- Debug session attached to IDE
- Unit tests executing successfully
Error Handling
| Error | Cause | Solution |
|---|
| Port already in use | Server already running | Kill existing process or change port |
| Database connection failed | Wrong credentials/missing DB | Check postgres is running |
| Gosu compilation error | Syntax error | Check IDE error highlights |
| Hot reload not working | Debug not attached | Reconnect debugger |
| Out of memory | Insufficient heap | Increase -Xmx in jvmArgs |
Development Commands Cheatsheet
./gradlew clean build
./gradlew runServer
./gradlew dbUpgrade
./gradlew dbReset
./gradlew loadSampleData
./gradlew test
./gradlew test --tests "ClassName.methodName"
./gradlew test --continuous
./gradlew gosucheck
./gradlew spotlessApply
./gradlew apiDoc
IDE Keyboard Shortcuts
| Action | IntelliJ Shortcut |
|---|
| Hot swap code | Ctrl+Shift+F9 |
| Run to cursor | Alt+F9 |
| Evaluate expression | Alt+F8 |
| Find usages | Alt+F7 |
| Go to declaration | Ctrl+B |
| Refactor rename | Shift+F6 |
Resources
Next Steps
For SDK and API patterns, see guidewire-sdk-patterns.