1- /*
2- * Copyright (c) Mirth Corporation. All rights reserved.
3- *
4- * http://www.mirthcorp.com
5- *
6- * The software in this package is published under the terms of the MPL license a copy of which has
7- * been included with this distribution in the LICENSE.txt file.
8- */
1+ // SPDX-License-Identifier: MPL-2.0
2+ // SPDX-FileCopyrightText: Mirth Corporation
3+ // SPDX-FileCopyrightText: 2025 Richard Ogin
94
105package com .mirth .connect .server .userutil ;
116
127import java .util .Collection ;
138import java .util .Collections ;
149import java .util .HashSet ;
10+ import java .util .Iterator ;
1511import java .util .Map ;
12+ import java .util .Optional ;
1613import java .util .Set ;
14+ import java .util .stream .Collectors ;
1715
1816import org .mozilla .javascript .Context ;
1917
2422 * Utility class used in the preprocessor or source filter/transformer to prevent the message from
2523 * being sent to specific destinations.
2624 */
27- public class DestinationSet {
25+ public class DestinationSet implements Set < Integer > {
2826
29- private Map <String , Integer > destinationIdMap ;
27+ private Map <String , Integer > destinationIdMap = Collections . emptyMap () ;
3028 private Set <Integer > metaDataIds ;
3129
3230 /**
@@ -43,6 +41,7 @@ public DestinationSet(ImmutableConnectorMessage connectorMessage) {
4341 this .metaDataIds = (Set <Integer >) connectorMessage .getSourceMap ().get (Constants .DESTINATION_SET_KEY );
4442 }
4543 } catch (Exception e ) {
44+ metaDataIds = new HashSet <>();
4645 }
4746 }
4847
@@ -56,15 +55,7 @@ public DestinationSet(ImmutableConnectorMessage connectorMessage) {
5655 * from processing for this message.
5756 */
5857 public boolean remove (Object metaDataIdOrConnectorName ) {
59- if (metaDataIds != null ) {
60- Integer metaDataId = convertToMetaDataId (metaDataIdOrConnectorName );
61-
62- if (metaDataId != null ) {
63- return metaDataIds .remove (metaDataId );
64- }
65- }
66-
67- return false ;
58+ return remove (Collections .singleton (metaDataIdOrConnectorName ));
6859 }
6960
7061 /**
@@ -77,15 +68,15 @@ public boolean remove(Object metaDataIdOrConnectorName) {
7768 * from processing for this message.
7869 */
7970 public boolean remove (Collection <Object > metaDataIdOrConnectorNames ) {
80- boolean removed = false ;
81-
82- for ( Object metaDataIdOrConnectorName : metaDataIdOrConnectorNames ) {
83- if ( remove ( metaDataIdOrConnectorName )) {
84- removed = true ;
85- }
86- }
87-
88- return removed ;
71+ if ( metaDataIdOrConnectorNames == null ) { return false ; }
72+
73+ return metaDataIdOrConnectorNames . stream ()
74+ . map ( this :: convertToMetaDataId )
75+ . filter ( Optional :: isPresent )
76+ . map ( Optional :: get )
77+ . map ( metaDataIds :: remove )
78+ . filter ( Boolean :: booleanValue )
79+ . count () > 0 ;
8980 }
9081
9182 /**
@@ -98,15 +89,7 @@ public boolean remove(Collection<Object> metaDataIdOrConnectorNames) {
9889 * from processing for this message.
9990 */
10091 public boolean removeAllExcept (Object metaDataIdOrConnectorName ) {
101- if (metaDataIds != null ) {
102- Integer metaDataId = convertToMetaDataId (metaDataIdOrConnectorName );
103-
104- Set <Integer > set = (metaDataId != null ) ? Collections .singleton (metaDataId ) : Collections .emptySet ();
105-
106- return metaDataIds .retainAll (set );
107- }
108-
109- return false ;
92+ return removeAllExcept (Collections .singleton (metaDataIdOrConnectorName ));
11093 }
11194
11295 /**
@@ -119,21 +102,15 @@ public boolean removeAllExcept(Object metaDataIdOrConnectorName) {
119102 * from processing for this message.
120103 */
121104 public boolean removeAllExcept (Collection <Object > metaDataIdOrConnectorNames ) {
122- if (metaDataIds != null ) {
123- Set <Integer > set = new HashSet <Integer >();
124-
125- for (Object metaDataIdOrConnectorName : metaDataIdOrConnectorNames ) {
126- Integer metaDataId = convertToMetaDataId (metaDataIdOrConnectorName );
127-
128- if (metaDataId != null ) {
129- set .add (metaDataId );
130- }
131- }
132-
133- return metaDataIds .retainAll (set );
134- }
135-
136- return false ;
105+ if (metaDataIdOrConnectorNames == null ) { return false ; }
106+
107+ Set <Integer > set = metaDataIdOrConnectorNames .stream ()
108+ .map (this ::convertToMetaDataId )
109+ .filter (Optional ::isPresent )
110+ .map (Optional ::get )
111+ .collect (Collectors .toSet ());
112+
113+ return metaDataIds .retainAll (set );
137114 }
138115
139116 /**
@@ -144,25 +121,102 @@ public boolean removeAllExcept(Collection<Object> metaDataIdOrConnectorNames) {
144121 * from processing for this message.
145122 */
146123 public boolean removeAll () {
147- if (metaDataIds != null && metaDataIds .size () > 0 ) {
148- metaDataIds .clear ();
149- return true ;
150- }
151-
152- return false ;
124+ int origSize = size ();
125+ clear ();
126+ return origSize > 0 ;
153127 }
154128
155- private Integer convertToMetaDataId (Object metaDataIdOrConnectorName ) {
129+ private Optional <Integer > convertToMetaDataId (Object metaDataIdOrConnectorName ) {
130+ Integer result = null ;
131+
156132 if (metaDataIdOrConnectorName != null ) {
157133 if (metaDataIdOrConnectorName instanceof Number ) {
158- return (( Number ) metaDataIdOrConnectorName ).intValue ();
134+ result = Integer . valueOf ((( Number ) metaDataIdOrConnectorName ).intValue () );
159135 } else if (metaDataIdOrConnectorName .getClass ().getName ().equals ("org.mozilla.javascript.NativeNumber" )) {
160- return (Integer ) Context .jsToJava (metaDataIdOrConnectorName , int .class );
161- } else if ( destinationIdMap != null ) {
162- return destinationIdMap .get (metaDataIdOrConnectorName .toString ());
136+ result = (Integer ) Context .jsToJava (metaDataIdOrConnectorName , int .class );
137+ } else {
138+ result = destinationIdMap .get (metaDataIdOrConnectorName .toString ());
163139 }
164140 }
165141
166- return null ;
142+ return Optional .ofNullable (result );
143+ }
144+
145+ @ Override
146+ public int size () {
147+ return metaDataIds .size ();
148+ }
149+
150+ @ Override
151+ public boolean isEmpty () {
152+ return metaDataIds .isEmpty ();
153+ }
154+
155+ @ Override
156+ public boolean contains (Object metaDataIdOrConnectorName ) {
157+ Optional <Integer > m = convertToMetaDataId (metaDataIdOrConnectorName );
158+
159+ return m .isPresent () && metaDataIds .contains (m .get ());
160+ }
161+
162+ @ Override
163+ public Iterator <Integer > iterator () {
164+ return Collections .unmodifiableSet (metaDataIds ).iterator ();
165+ }
166+
167+ @ Override
168+ public Object [] toArray () {
169+ return metaDataIds .toArray ();
170+ }
171+
172+ @ Override
173+ public <T > T [] toArray (T [] a ) {
174+ return metaDataIds .toArray (a );
175+ }
176+
177+ @ Override
178+ public boolean add (Integer metaDataId ) {
179+ return metaDataId != null && metaDataIds .add (metaDataId );
180+ }
181+
182+ @ Override
183+ public boolean containsAll (Collection <?> metaDataIdOrConnectorNames ) {
184+ if (metaDataIdOrConnectorNames == null ) { return false ; }
185+
186+ return metaDataIdOrConnectorNames .stream ()
187+ .map (this ::contains )
188+ .allMatch (Boolean ::booleanValue );
189+ }
190+
191+ @ Override
192+ public boolean addAll (Collection <? extends Integer > metaDataIdOrConnectorNames ) {
193+ boolean changed = false ;
194+
195+ if (metaDataIdOrConnectorNames != null ) {
196+ for (Object item : metaDataIdOrConnectorNames ) {
197+ Optional <Integer > m = convertToMetaDataId (item );
198+
199+ if (m .isPresent () && metaDataIds .add (m .get ())) {
200+ changed = true ;
201+ }
202+ }
203+ }
204+
205+ return changed ;
206+ }
207+
208+ @ Override
209+ public boolean retainAll (Collection <?> metaDataIdOrConnectorNames ) {
210+ return removeAllExcept ((Collection <Object >)metaDataIdOrConnectorNames );
211+ }
212+
213+ @ Override
214+ public boolean removeAll (Collection <?> metaDataIdOrConnectorNames ) {
215+ return remove ((Collection <Object >)metaDataIdOrConnectorNames );
216+ }
217+
218+ @ Override
219+ public void clear () {
220+ metaDataIds .clear ();
167221 }
168222}
0 commit comments