Skip to content

Commit 1e5aa33

Browse files
authored
Merge pull request adobe#75 from BNanda99/beta
adobe-skills-issues-69 - updated package with Distributor
1 parent f295eb5 commit 1e5aa33

1 file changed

Lines changed: 57 additions & 55 deletions

File tree

  • skills/aem/cloud-service/skills/best-practices/references

skills/aem/cloud-service/skills/best-practices/references/replication.md

Lines changed: 57 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ Migrates legacy replication code to Cloud Service compatible pattern: **Sling Di
99
- CQ Replication API: `com.day.cq.replication.Replicator`, `ReplicationAction``replicator.replicate(resolver, new ReplicationAction(ReplicationActionType.ACTIVATE, path))`
1010

1111
**Target pattern:**
12-
- Sling Distribution API: `DistributionAgent`, `DistributionRequest`, `SimpleDistributionRequest`
13-
- `distributionAgent.execute(new SimpleDistributionRequest(DistributionRequestType.ADD, path))`
12+
- Sling Distribution API: `Distributor`, `DistributionRequest`, `SimpleDistributionRequest`
13+
- `DistributionRequest distributionRequest = new SimpleDistributionRequest(DistributionRequestType.ADD, false, path);`
1414
- Uses `getServiceResourceResolver()` with SUBSERVICE; resolver lifecycle and logging per [aem-cloud-service-pattern-prerequisites.md](aem-cloud-service-pattern-prerequisites.md)
1515

1616
## Classification
@@ -19,21 +19,21 @@ Identify which source pattern the file uses:
1919
- **Sling Replication Agent:** Has `ReplicationAgent`, `ReplicationAgentException`, `ReplicationResult`, `agent.replicate(resolver, ReplicationActionType.*, path)`
2020
- **CQ Replicator:** Has `com.day.cq.replication.Replicator`, `ReplicationAction`, `replicator.replicate(resolver, action)`
2121

22-
If the file already uses `DistributionAgent` and `DistributionRequest`/`SimpleDistributionRequest`, it may not need migration — verify and skip if already compliant.
22+
If the file already uses `Distributor` and `SimpleDistributionRequest`, it may not need migration — verify and skip if already compliant.
2323

2424
## Pattern-Specific Rules
2525

26-
- **DO** replace ReplicationAgent/Replicator with DistributionAgent
27-
- **DO** replace ReplicationAction/ReplicationResult with DistributionRequest/SimpleDistributionRequest
26+
- **DO** replace ReplicationAgent/Replicator with `Distributor`
27+
- **DO** replace ReplicationAction/ReplicationResult with `SimpleDistributionRequest`/`DistributionResponse`
2828
- **DO** map ReplicationActionType to DistributionRequestType (e.g., ACTIVATE → ADD)
29-
- **DO** use `@Reference(target = "(name=agent-name)")` to target the specific Distribution Agent
29+
- **DO** use `publish` or `preview` to target the specific Distribution Agent or both separately if distributing to both publish and preview tiers
3030
- **DO NOT** use administrative resolver or console logging — follow [aem-cloud-service-pattern-prerequisites.md](aem-cloud-service-pattern-prerequisites.md)
3131

3232
---
3333

3434
## Complete Example: Before and After
3535

36-
### Example 1: CQ Replicator → Sling Distribution Agent
36+
### Example 1: CQ Replicator → Sling Content Distribution
3737

3838
#### Before (Legacy CQ Replicator)
3939

@@ -98,11 +98,11 @@ package com.example.replication;
9898
import org.apache.sling.api.resource.LoginException;
9999
import org.apache.sling.api.resource.ResourceResolver;
100100
import org.apache.sling.api.resource.ResourceResolverFactory;
101-
import org.apache.sling.distribution.agent.api.DistributionAgent;
102-
import org.apache.sling.distribution.agent.api.DistributionAgentException;
103-
import org.apache.sling.distribution.agent.api.DistributionRequest;
104-
import org.apache.sling.distribution.agent.api.SimpleDistributionRequest;
105-
import org.apache.sling.distribution.agent.api.DistributionRequestType;
101+
import org.apache.sling.distribution.Distributor;
102+
import org.apache.sling.distribution.DistributionRequest;
103+
import org.apache.sling.distribution.DistributionResponse;
104+
import org.apache.sling.distribution.DistributionRequestType;
105+
import org.apache.sling.distribution.SimpleDistributionRequest;
106106
import org.osgi.service.component.annotations.Component;
107107
import org.osgi.service.component.annotations.Reference;
108108
import org.slf4j.Logger;
@@ -115,8 +115,8 @@ public class PropertyNodeReplicationService {
115115

116116
private static final Logger LOG = LoggerFactory.getLogger(PropertyNodeReplicationService.class);
117117

118-
@Reference(target = "(name=myPropertyDistributionAgent)")
119-
private DistributionAgent distributionAgent;
118+
@Reference
119+
private Distributor distributor;
120120

121121
@Reference
122122
private ResourceResolverFactory resolverFactory;
@@ -130,25 +130,25 @@ public class PropertyNodeReplicationService {
130130
return;
131131
}
132132

133-
DistributionRequest request = new SimpleDistributionRequest(
134-
DistributionRequestType.ADD,
133+
DistributionRequest distributionRequest = new SimpleDistributionRequest(
134+
DistributionRequestType.ADD,
135+
false,
135136
propertyNodePath
136137
);
137-
distributionAgent.execute(request);
138+
DistributionResponse distributionResponse = distributor.distribute("publish", resolver, distributionRequest);
139+
138140
LOG.info("Property Node Distribution successful for path: {}", propertyNodePath);
139141

140142
} catch (LoginException e) {
141143
LOG.error("Failed to get resource resolver", e);
142-
} catch (DistributionAgentException e) {
143-
LOG.error("Distribution failed for path: {}", propertyNodePath, e);
144144
} catch (Exception e) {
145145
LOG.error("Error during distribution", e);
146146
}
147147
}
148148
}
149149
```
150150

151-
### Example 2: Sling Replication Agent → Sling Distribution Agent
151+
### Example 2: Sling Replication Agent → Sling Content Distribution
152152

153153
#### Before (Legacy Sling Replication Agent)
154154

@@ -207,11 +207,11 @@ package com.example.replication;
207207
import org.apache.sling.api.resource.LoginException;
208208
import org.apache.sling.api.resource.ResourceResolver;
209209
import org.apache.sling.api.resource.ResourceResolverFactory;
210-
import org.apache.sling.distribution.agent.api.DistributionAgent;
211-
import org.apache.sling.distribution.agent.api.DistributionAgentException;
212-
import org.apache.sling.distribution.agent.api.DistributionRequest;
213-
import org.apache.sling.distribution.agent.api.SimpleDistributionRequest;
214-
import org.apache.sling.distribution.agent.api.DistributionRequestType;
210+
import org.apache.sling.distribution.Distributor;
211+
import org.apache.sling.distribution.DistributionRequest;
212+
import org.apache.sling.distribution.DistributionResponse;
213+
import org.apache.sling.distribution.DistributionRequestType;
214+
import org.apache.sling.distribution.SimpleDistributionRequest;
215215
import org.osgi.service.component.annotations.Component;
216216
import org.osgi.service.component.annotations.Reference;
217217
import org.slf4j.Logger;
@@ -224,8 +224,8 @@ public class ContentReplicationService {
224224

225225
private static final Logger LOG = LoggerFactory.getLogger(ContentReplicationService.class);
226226

227-
@Reference(target = "(name=my-distribution-agent)")
228-
private DistributionAgent distributionAgent;
227+
@Reference
228+
private Distributor distributor;
229229

230230
@Reference
231231
private ResourceResolverFactory resolverFactory;
@@ -239,17 +239,16 @@ public class ContentReplicationService {
239239
return;
240240
}
241241

242-
DistributionRequest request = new SimpleDistributionRequest(
243-
DistributionRequestType.ADD,
242+
DistributionRequest distributionRequest = new SimpleDistributionRequest(
243+
DistributionRequestType.ADD,
244+
false,
244245
contentPath
245246
);
246-
distributionAgent.execute(request);
247+
DistributionResponse distributionResponse = distributor.distribute("publish", resolver, distributionRequest);
247248
LOG.info("Forward Distribution successful for path: {}", contentPath);
248249

249250
} catch (LoginException e) {
250251
LOG.error("Failed to get resource resolver", e);
251-
} catch (DistributionAgentException e) {
252-
LOG.error("Distribution failed for path: {}", contentPath, e);
253252
} catch (Exception e) {
254253
LOG.error("Error during distribution", e);
255254
}
@@ -258,15 +257,14 @@ public class ContentReplicationService {
258257
```
259258

260259
**Key Changes:**
261-
- ✅ Replaced `Replicator`/`ReplicationAgent``DistributionAgent`
262-
- ✅ Replaced `ReplicationAction`/`ReplicationResult``DistributionRequest`/`SimpleDistributionRequest`
260+
- ✅ Replaced `Replicator`/`ReplicationAgent``Distributor`
261+
- ✅ Replaced `ReplicationAction`/`ReplicationResult``DistributionRequest`/`DistributionResponse`
263262
- ✅ Mapped `ReplicationActionType.ACTIVATE``DistributionRequestType.ADD`
264-
-Added `@Reference(target = "(name=agent-name)")` for agent selection
263+
-Used correct `publish`/`preview` agent
265264
- ✅ Replaced `getAdministrativeResourceResolver()``getServiceResourceResolver()` with SUBSERVICE
266265
- ✅ Removed USER/PASSWORD from authInfo (Cloud Service uses SUBSERVICE only)
267266
- ✅ Replaced `System.out/err` → SLF4J Logger
268267
- ✅ Used try-with-resources for ResourceResolver
269-
-`DistributionAgent.execute()` no longer requires ResourceResolver parameter (agent uses its own service user)
270268

271269
---
272270

@@ -276,7 +274,7 @@ public class ContentReplicationService {
276274

277275
Read [aem-cloud-service-pattern-prerequisites.md](aem-cloud-service-pattern-prerequisites.md) and apply SCR→DS and ResourceResolver/logging **before** replication-specific steps below.
278276

279-
## P1: Replace ReplicationAgent/Replicator with DistributionAgent
277+
## P1: Replace ReplicationAgent/Replicator with Distributor
280278

281279
**For Sling Replication Agent (ReplicationAgent):**
282280

@@ -292,12 +290,14 @@ if (result.isSuccessful()) {
292290
System.out.println("Property Node Replication failed for path: " + propertyNodePath);
293291
}
294292

295-
// AFTER (Sling Distribution Agent)
296-
@Reference(target = "(name=myPropertyDistributionAgent)")
297-
private DistributionAgent distributionAgent;
293+
// AFTER (Sling Content Distributor)
294+
@Reference
295+
private Distributor distributor;
296+
297+
DistributionRequest distributionRequest = new SimpleDistributionRequest(DistributionRequestType.ADD, false, propertyNodePath);
298+
299+
DistributionResponse distributionResponse = distributor.distribute("publish", resolver, distributionRequest);
298300

299-
DistributionRequest request = new SimpleDistributionRequest(DistributionRequestType.ADD, propertyNodePath);
300-
distributionAgent.execute(request);
301301
LOG.info("Property Node Distribution successful for path: {}", propertyNodePath);
302302
```
303303

@@ -312,12 +312,13 @@ ReplicationAction action = new ReplicationAction(ReplicationActionType.ACTIVATE,
312312
replicator.replicate(resolver, action);
313313
System.out.println("Forward Replication successful for path: " + contentPath);
314314

315-
// AFTER (Sling Distribution Agent)
316-
@Reference(target = "(name=my-distribution-agent)")
317-
private DistributionAgent distributionAgent;
315+
// AFTER (Sling Content Distributor)
316+
@Reference
317+
private Distributor distributor;
318+
319+
DistributionRequest distributionRequest = new SimpleDistributionRequest(DistributionRequestType.ADD, false, contentPath);
318320

319-
DistributionRequest request = new SimpleDistributionRequest(DistributionRequestType.ADD, contentPath);
320-
distributionAgent.execute(request);
321+
DistributionResponse distributionResponse = distributor.distribute("publish", resolver, distributionRequest);
321322
LOG.info("Forward Distribution successful for path: {}", contentPath);
322323
```
323324

@@ -330,7 +331,7 @@ LOG.info("Forward Distribution successful for path: {}", contentPath);
330331
| `ADD` | `ADD` |
331332
| `DELETE` | `DELETE` |
332333

333-
**Note:** `DistributionAgent.execute(request)` does not require a ResourceResolver parameter — the agent uses its own service user. If the resolver is needed for other logic, retain it per [resource-resolver-logging.md](resource-resolver-logging.md) (try-with-resources, service user).
334+
**Note:** `Distributor.distribute(agent-name, resolver, distributionRequest)` requires a ResourceResolver parameter, retain it per [resource-resolver-logging.md](resource-resolver-logging.md) (try-with-resources, service user).
334335

335336
## P2: Update imports
336337

@@ -359,11 +360,11 @@ import org.apache.felix.scr.annotations.*; // must be gone when done
359360
import org.apache.sling.api.resource.LoginException;
360361
import org.apache.sling.api.resource.ResourceResolver;
361362
import org.apache.sling.api.resource.ResourceResolverFactory;
362-
import org.apache.sling.distribution.agent.api.DistributionAgent;
363-
import org.apache.sling.distribution.agent.api.DistributionAgentException;
364-
import org.apache.sling.distribution.agent.api.DistributionRequest;
365-
import org.apache.sling.distribution.agent.api.SimpleDistributionRequest;
366-
import org.apache.sling.distribution.agent.api.DistributionRequestType;
363+
import org.apache.sling.distribution.Distributor;
364+
import org.apache.sling.distribution.DistributionRequest;
365+
import org.apache.sling.distribution.DistributionResponse;
366+
import org.apache.sling.distribution.DistributionRequestType;
367+
import org.apache.sling.distribution.SimpleDistributionRequest;
367368
import org.osgi.framework.Constants;
368369
import org.osgi.service.component.annotations.Component;
369370
import org.osgi.service.component.annotations.Reference;
@@ -380,8 +381,9 @@ import java.util.Map;
380381
## Replication/Distribution Checklist
381382

382383
- [ ] No `ReplicationAgent`, `Replicator`, `ReplicationAction`, or `ReplicationResult` remains
383-
- [ ] Uses `DistributionAgent` with `@Reference(target = "(name=agent-name)")`
384-
- [ ] Uses `DistributionRequest` / `SimpleDistributionRequest` with `DistributionRequestType`
384+
- [ ] Uses `Distributor` (`org.apache.sling.distribution`)
385+
- [ ] Uses `SimpleDistributionRequest` with `DistributionRequestType` from `org.apache.sling.distribution`
386+
- [ ] Calls `distributor.distribute("publish", resolver, distributionRequest)` with the service-user resolver
385387
- [ ] [aem-cloud-service-pattern-prerequisites.md](aem-cloud-service-pattern-prerequisites.md) satisfied (SCR→DS, resolver/logging, auth maps)
386388
- [ ] `scheduler.concurrent=false` is set (if using scheduler)
387389
- [ ] Code compiles: `mvn clean compile`

0 commit comments

Comments
 (0)