Skip to content

Commit 52a4514

Browse files
authored
Merge pull request #378 from Red5/attrs-update
OSRS-15 update for attribute store concurrency and clean up
2 parents 0f31af6 + f0fc288 commit 52a4514

18 files changed

Lines changed: 280 additions & 231 deletions

File tree

client/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<parent>
44
<groupId>org.red5</groupId>
55
<artifactId>red5-parent</artifactId>
6-
<version>2.0.19</version>
6+
<version>2.0.20</version>
77
</parent>
88
<modelVersion>4.0.0</modelVersion>
99
<artifactId>red5-client</artifactId>

client/src/main/java/org/red5/client/Red5Client.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public final class Red5Client {
1818
/**
1919
* Current server version with revision
2020
*/
21-
public static final String VERSION = "Red5 Client 2.0.19";
21+
public static final String VERSION = "Red5 Client 2.0.20";
2222

2323
/**
2424
* Create a new Red5Client object using the connection local to the current thread A bit of magic that lets you access the red5 scope

common/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<parent>
44
<groupId>org.red5</groupId>
55
<artifactId>red5-parent</artifactId>
6-
<version>2.0.19</version>
6+
<version>2.0.20</version>
77
</parent>
88
<modelVersion>4.0.0</modelVersion>
99
<artifactId>red5-server-common</artifactId>
@@ -88,7 +88,7 @@
8888
<dependency>
8989
<groupId>net.engio</groupId>
9090
<artifactId>mbassador</artifactId>
91-
<version>2.0.19</version>
91+
<version>2.0.20</version>
9292
</dependency> -->
9393
</dependencies>
9494
</project>

common/src/main/java/org/red5/server/AttributeStore.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,18 @@ public boolean setAttribute(final Enum<?> enm, final Object value) {
234234
return setAttribute(enm.name(), value);
235235
}
236236

237+
/**
238+
* {@inheritDoc}
239+
*/
240+
public Object setAttributeIfAbsent(final String name, final Object value) {
241+
log.trace("setAttributeIfAbsent({}, {})", name, value);
242+
if (name == null || value == null) {
243+
return null;
244+
}
245+
// putIfAbsent returns the previous value or null if it was absent
246+
return attributes.putIfAbsent(name, value);
247+
}
248+
237249
/**
238250
* {@inheritDoc}
239251
*

common/src/main/java/org/red5/server/adapter/AbstractScopeAdapter.java

Lines changed: 209 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,19 @@
77

88
package org.red5.server.adapter;
99

10+
import java.util.List;
1011
import java.util.Map;
12+
import java.util.Set;
1113

14+
import org.red5.server.api.IAttributeStore;
15+
import org.red5.server.api.ICastingAttributeStore;
1216
import org.red5.server.api.IClient;
1317
import org.red5.server.api.IConnection;
1418
import org.red5.server.api.Red5;
1519
import org.red5.server.api.event.IEvent;
1620
import org.red5.server.api.scope.IBasicScope;
1721
import org.red5.server.api.scope.IScope;
22+
import org.red5.server.api.scope.IScopeAware;
1823
import org.red5.server.api.scope.IScopeHandler;
1924
import org.red5.server.api.service.IServiceCall;
2025

@@ -23,9 +28,12 @@
2328
*
2429
* @author mondain
2530
*/
26-
public abstract class AbstractScopeAdapter implements IScopeHandler {
31+
public abstract class AbstractScopeAdapter implements IScopeAware, IScopeHandler, ICastingAttributeStore {
2732

28-
//private static Logger log = LoggerFactory.getLogger(AbstractScopeAdapter.class);
33+
/**
34+
* Wrapped scope
35+
*/
36+
protected volatile IScope scope;
2937

3038
/**
3139
* Can start flag.
@@ -129,6 +137,27 @@ public abstract class AbstractScopeAdapter implements IScopeHandler {
129137
*/
130138
private boolean canHandleEvent = true;
131139

140+
/**
141+
* Setter for wrapped scope
142+
*
143+
* @param scope
144+
* Scope to wrap
145+
*/
146+
@Override
147+
public void setScope(IScope scope) {
148+
this.scope = scope;
149+
}
150+
151+
/**
152+
* Getter for wrapped scope
153+
*
154+
* @return Wrapped scope
155+
*/
156+
@Override
157+
public IScope getScope() {
158+
return scope;
159+
}
160+
132161
/**
133162
* Setter for can start flag.
134163
*
@@ -297,11 +326,186 @@ public Map<String, Object> checkBandwidthUp(Object[] params) {
297326
return null;
298327
}
299328

329+
/** {@inheritDoc} */
330+
@Override
331+
public Object getAttribute(String name) {
332+
return scope.getAttribute(name);
333+
}
334+
335+
/** {@inheritDoc} */
336+
@Override
337+
public Object getAttribute(Enum<?> enm) {
338+
return getAttribute(enm.name());
339+
}
340+
341+
/** {@inheritDoc} */
342+
@Override
343+
public Object getAttribute(String name, Object defaultValue) {
344+
// this sets the attribute if it does not exist and returns the default value
345+
// if it already existed, the existing value is returned
346+
Object value = scope.setAttributeIfAbsent(name, defaultValue);
347+
if (value == null) {
348+
// if the value was not set, return the default value
349+
return defaultValue;
350+
}
351+
return value;
352+
}
353+
354+
/** {@inheritDoc} */
355+
@Override
356+
public Set<String> getAttributeNames() {
357+
return scope.getAttributeNames();
358+
}
359+
360+
/** {@inheritDoc} */
361+
@Override
362+
public Map<String, Object> getAttributes() {
363+
return scope.getAttributes();
364+
}
365+
366+
/** {@inheritDoc} */
367+
@Override
368+
public boolean hasAttribute(String name) {
369+
return scope.hasAttribute(name);
370+
}
371+
372+
/** {@inheritDoc} */
373+
@Override
374+
public boolean hasAttribute(Enum<?> enm) {
375+
return hasAttribute(enm.name());
376+
}
377+
378+
/** {@inheritDoc} */
379+
@Override
380+
public boolean removeAttribute(String name) {
381+
return scope.removeAttribute(name);
382+
}
383+
384+
/** {@inheritDoc} */
385+
@Override
386+
public boolean removeAttribute(Enum<?> enm) {
387+
return removeAttribute(enm.name());
388+
}
389+
390+
/** {@inheritDoc} */
391+
@Override
392+
public void removeAttributes() {
393+
scope.removeAttributes();
394+
}
395+
396+
/** {@inheritDoc} */
397+
@Override
398+
public boolean setAttribute(String name, Object value) {
399+
return scope.setAttribute(name, value);
400+
}
401+
402+
/** {@inheritDoc} */
403+
@Override
404+
public boolean setAttribute(Enum<?> enm, Object value) {
405+
return setAttribute(enm.name(), value);
406+
}
407+
408+
/** {@inheritDoc} */
409+
@Override
410+
public boolean setAttributes(IAttributeStore attributes) {
411+
int successes = 0;
412+
for (Map.Entry<String, Object> entry : attributes.getAttributes().entrySet()) {
413+
if (scope.setAttribute(entry.getKey(), entry.getValue())) {
414+
successes++;
415+
}
416+
}
417+
// expect every value to have been added
418+
return (successes == attributes.size());
419+
}
420+
300421
/**
301-
* <p>getScope.</p>
422+
* {@inheritDoc}
302423
*
303-
* @return a {@link org.red5.server.api.scope.IScope} object
424+
* @param attributes a {@link java.util.Map} object
425+
* @return a boolean
304426
*/
305-
public abstract IScope getScope();
427+
@Override
428+
public boolean setAttributes(Map<String, Object> attributes) {
429+
int successes = 0;
430+
for (Map.Entry<String, Object> entry : attributes.entrySet()) {
431+
if (scope.setAttribute(entry.getKey(), entry.getValue())) {
432+
successes++;
433+
}
434+
}
435+
// expect every value to have been added
436+
return (successes == attributes.size());
437+
}
438+
439+
/** {@inheritDoc} */
440+
@Override
441+
public Object setAttributeIfAbsent(String name, Object value) {
442+
return scope.setAttributeIfAbsent(name, value);
443+
}
444+
445+
/** {@inheritDoc} */
446+
@Override
447+
public Boolean getBoolAttribute(String name) {
448+
return scope.getBoolAttribute(name);
449+
}
450+
451+
/** {@inheritDoc} */
452+
@Override
453+
public Byte getByteAttribute(String name) {
454+
return scope.getByteAttribute(name);
455+
}
456+
457+
/** {@inheritDoc} */
458+
@Override
459+
public Double getDoubleAttribute(String name) {
460+
return scope.getDoubleAttribute(name);
461+
}
462+
463+
/** {@inheritDoc} */
464+
@Override
465+
public Integer getIntAttribute(String name) {
466+
return scope.getIntAttribute(name);
467+
}
468+
469+
/** {@inheritDoc} */
470+
@Override
471+
public List<?> getListAttribute(String name) {
472+
return scope.getListAttribute(name);
473+
}
474+
475+
/** {@inheritDoc} */
476+
@Override
477+
public Long getLongAttribute(String name) {
478+
return scope.getLongAttribute(name);
479+
}
480+
481+
/** {@inheritDoc} */
482+
@Override
483+
public Map<?, ?> getMapAttribute(String name) {
484+
return scope.getMapAttribute(name);
485+
}
486+
487+
/** {@inheritDoc} */
488+
@Override
489+
public Set<?> getSetAttribute(String name) {
490+
return scope.getSetAttribute(name);
491+
}
492+
493+
/** {@inheritDoc} */
494+
@Override
495+
public Short getShortAttribute(String name) {
496+
return scope.getShortAttribute(name);
497+
}
498+
499+
/** {@inheritDoc} */
500+
@Override
501+
public String getStringAttribute(String name) {
502+
return scope.getStringAttribute(name);
503+
}
504+
505+
/** {@inheritDoc} */
506+
@Override
507+
public int size() {
508+
return scope != null ? scope.getAttributeNames().size() : 0;
509+
}
306510

307511
}

0 commit comments

Comments
 (0)