-
Notifications
You must be signed in to change notification settings - Fork 214
/
ThingCommandStrategies.java
155 lines (136 loc) · 5.83 KB
/
ThingCommandStrategies.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*
* Copyright (c) 2017 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipse.ditto.things.service.persistence.actors.strategies.commands;
import javax.annotation.Nullable;
import org.eclipse.ditto.base.model.signals.commands.Command;
import org.eclipse.ditto.internal.utils.persistentactors.commands.AbstractCommandStrategies;
import org.eclipse.ditto.internal.utils.persistentactors.commands.CommandStrategy;
import org.eclipse.ditto.internal.utils.persistentactors.results.Result;
import org.eclipse.ditto.internal.utils.persistentactors.results.ResultFactory;
import org.eclipse.ditto.things.model.Thing;
import org.eclipse.ditto.things.model.ThingId;
import org.eclipse.ditto.things.model.signals.commands.modify.CreateThing;
import org.eclipse.ditto.things.model.signals.events.ThingEvent;
import org.apache.pekko.actor.ActorSystem;
/**
* The collection of the command strategies of {@code ThingPersistenceActor}.
*/
public final class ThingCommandStrategies
extends AbstractCommandStrategies<Command<?>, Thing, ThingId, ThingEvent<?>> {
@SuppressWarnings("java:S3077") // volatile because of double checked locking pattern
@Nullable
private static volatile ThingCommandStrategies instance;
/**
* Constructs a new {@code ThingCommandReceiveStrategy} object.
*/
private ThingCommandStrategies(final ActorSystem system) {
super(Command.class);
addThingStrategies(system);
addPolicyStrategies();
addAttributesStrategies();
addDefinitionStrategies();
addFeaturesStrategies(system);
addFeatureDefinitionStrategies();
addFeaturePropertiesStrategies();
addFeatureDesiredPropertiesStrategies();
addSudoStrategies();
}
/**
* Returns the <em>singleton</em> instance of {@code ThingReceiveStrategy}.
*
* @param system the Akka ActorSystem to use in order to e.g. dynamically load classes.
* @return the instance.
*/
public static ThingCommandStrategies getInstance(final ActorSystem system) {
ThingCommandStrategies localInstance = instance;
if (null == localInstance) {
synchronized (ThingCommandStrategies.class) {
localInstance = instance;
if (null == localInstance) {
instance = localInstance = new ThingCommandStrategies(system);
}
}
}
return localInstance;
}
/**
* Returns a new instance of {@code CreateThingStrategy}.
*
* @param system the ActorSystem to use.
* @return the instance.
*/
public static CommandStrategy<CreateThing, Thing, ThingId, ThingEvent<?>> getCreateThingStrategy(
final ActorSystem system) {
return new CreateThingStrategy(system);
}
private void addThingStrategies(final ActorSystem system) {
addStrategy(new ThingConflictStrategy());
addStrategy(new ModifyThingStrategy());
addStrategy(new RetrieveThingStrategy(system));
addStrategy(new DeleteThingStrategy());
addStrategy(new MergeThingStrategy());
}
private void addPolicyStrategies() {
addStrategy(new RetrievePolicyIdStrategy());
addStrategy(new ModifyPolicyIdStrategy());
}
private void addAttributesStrategies() {
addStrategy(new ModifyAttributesStrategy());
addStrategy(new ModifyAttributeStrategy());
addStrategy(new RetrieveAttributesStrategy());
addStrategy(new RetrieveAttributeStrategy());
addStrategy(new DeleteAttributesStrategy());
addStrategy(new DeleteAttributeStrategy());
}
private void addDefinitionStrategies() {
addStrategy(new ModifyThingDefinitionStrategy());
addStrategy(new RetrieveThingDefinitionStrategy());
addStrategy(new DeleteThingDefinitionStrategy());
}
private void addFeaturesStrategies(final ActorSystem system) {
addStrategy(new ModifyFeaturesStrategy(system));
addStrategy(new ModifyFeatureStrategy(system));
addStrategy(new RetrieveFeaturesStrategy());
addStrategy(new RetrieveFeatureStrategy(system));
addStrategy(new DeleteFeaturesStrategy());
addStrategy(new DeleteFeatureStrategy());
}
private void addFeatureDefinitionStrategies() {
addStrategy(new ModifyFeatureDefinitionStrategy());
addStrategy(new RetrieveFeatureDefinitionStrategy());
addStrategy(new DeleteFeatureDefinitionStrategy());
}
private void addFeaturePropertiesStrategies() {
addStrategy(new ModifyFeaturePropertiesStrategy());
addStrategy(new ModifyFeaturePropertyStrategy());
addStrategy(new RetrieveFeaturePropertiesStrategy());
addStrategy(new RetrieveFeaturePropertyStrategy());
addStrategy(new DeleteFeaturePropertiesStrategy());
addStrategy(new DeleteFeaturePropertyStrategy());
}
private void addFeatureDesiredPropertiesStrategies() {
addStrategy(new ModifyFeatureDesiredPropertiesStrategy());
addStrategy(new ModifyFeatureDesiredPropertyStrategy());
addStrategy(new RetrieveFeatureDesiredPropertiesStrategy());
addStrategy(new RetrieveFeatureDesiredPropertyStrategy());
addStrategy(new DeleteFeatureDesiredPropertiesStrategy());
addStrategy(new DeleteFeatureDesiredPropertyStrategy());
}
private void addSudoStrategies() {
addStrategy(new SudoRetrieveThingStrategy());
}
@Override
protected Result<ThingEvent<?>> getEmptyResult() {
return ResultFactory.emptyResult();
}
}