From ad547cc00ab32bd5339bffcc0a0b7a6e16a04fa9 Mon Sep 17 00:00:00 2001 From: Piotr Olaszewski Date: Mon, 14 Nov 2022 22:35:40 +0100 Subject: [PATCH] Add tests for AgiExecStartEvent --- .../manager/internal/EventBuilderImpl.java | 38 ++++++------ .../manager/internal/ResponseBuilderImpl.java | 32 +++++----- .../EventAttributesHelper.java} | 58 ++++++++++++------- .../manager/event/AgiExecStartEventTest.java | 43 ++++++++++++++ 4 files changed, 118 insertions(+), 53 deletions(-) rename src/main/java/org/asteriskjava/manager/{internal/AbstractBuilder.java => util/EventAttributesHelper.java} (76%) create mode 100644 src/test/java/org/asteriskjava/manager/event/AgiExecStartEventTest.java diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index b6d39812d..e7241e2f0 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -1,22 +1,22 @@ /* - * Copyright 2004-2006 Stefan Reuter + * Copyright 2004-2022 Asterisk-Java contributors * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * http://www.apache.org/licenses/LICENSE-2.0 * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.asteriskjava.manager.internal; import org.asteriskjava.manager.event.*; +import org.asteriskjava.manager.util.EventAttributesHelper; import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; import org.reflections.Reflections; @@ -33,7 +33,7 @@ * @version $Id$ * @see org.asteriskjava.manager.event.ManagerEvent */ -class EventBuilderImpl extends AbstractBuilder implements EventBuilder { +class EventBuilderImpl implements EventBuilder { private static final Set ignoredAttributes = new HashSet<>(Arrays.asList("event")); private Map> registeredEventClasses; private final Set eventClassNegativeCache = new HashSet<>(); @@ -41,7 +41,7 @@ class EventBuilderImpl extends AbstractBuilder implements EventBuilder { private static final Log logger = LogFactory.getLog(EventBuilderImpl.class); private final static Set> knownManagerEventClasses = new Reflections( - "org.asteriskjava.manager.event").getSubTypesOf(ManagerEvent.class); + "org.asteriskjava.manager.event").getSubTypesOf(ManagerEvent.class); EventBuilderImpl() { this.registeredEventClasses = new HashMap<>(); @@ -87,7 +87,7 @@ public final void registerEventClass(Class clazz) throws * @throws IllegalArgumentException if clazz is not a valid event class. */ public final void registerEventClass(String eventType, Class clazz) - throws IllegalArgumentException { + throws IllegalArgumentException { Constructor defaultConstructor; if (Modifier.isAbstract(clazz.getModifiers())) { @@ -131,8 +131,8 @@ public ManagerEvent buildEvent(Object source, Map attributes) { // Convert map of lists to list of maps - one map for each // PeerEntry event int peersAmount = attributes.get("listitems") != null - ? Integer.parseInt((String) attributes.get("listitems")) - : eventNames.size() - 1; // Last event is + ? Integer.parseInt((String) attributes.get("listitems")) + : eventNames.size() - 1; // Last event is // PeerlistComplete List> peersAttributes = new ArrayList<>(); for (Map.Entry attribute : attributes.entrySet()) { @@ -188,7 +188,7 @@ public ManagerEvent buildEvent(Object source, Map attributes) { if (eventClass == null) { if (eventClassNegativeCache.add(eventType)) { logger.info("No event class registered for event type '" + eventType + "', attributes: " + attributes - + ". Please report at https://github.com/asterisk-java/asterisk-java/issues"); + + ". Please report at https://github.com/asterisk-java/asterisk-java/issues"); } return null; } @@ -214,7 +214,7 @@ public ManagerEvent buildEvent(Object source, Map attributes) { // being passed around. for (Map peerAttrs : (List>) attributes.get("peersAttributes")) { PeerEntryEvent peerEntryEvent = new PeerEntryEvent(source); - setAttributes(peerEntryEvent, peerAttrs, ignoredAttributes); + EventAttributesHelper.setAttributes(peerEntryEvent, peerAttrs, ignoredAttributes); List peerEntryEvents = peersEvent.getChildEvents(); if (peerEntryEvents == null) { peerEntryEvents = new ArrayList<>(); @@ -224,7 +224,7 @@ public ManagerEvent buildEvent(Object source, Map attributes) { } peersEvent.setActionId(peersEvent.getChildEvents().get(0).getActionId()); } else { - setAttributes(event, attributes, ignoredAttributes); + EventAttributesHelper.setAttributes(event, attributes, ignoredAttributes); } // ResponseEvents are sent in response to a ManagerAction if the diff --git a/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java index 8d4f5bccd..577843f08 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java @@ -1,27 +1,29 @@ /* - * Copyright 2004-2006 Stefan Reuter + * Copyright 2004-2022 Asterisk-Java contributors * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * http://www.apache.org/licenses/LICENSE-2.0 * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.asteriskjava.manager.internal; import org.asteriskjava.manager.response.CommandResponse; import org.asteriskjava.manager.response.ManagerError; import org.asteriskjava.manager.response.ManagerResponse; +import org.asteriskjava.manager.util.EventAttributesHelper; +import org.slf4j.Logger; import java.util.*; +import static org.slf4j.LoggerFactory.getLogger; /** * Default implementation of the ResponseBuilder interface. @@ -30,9 +32,11 @@ * @version $Id$ * @see org.asteriskjava.manager.response.ManagerResponse */ -class ResponseBuilderImpl extends AbstractBuilder implements ResponseBuilder { +class ResponseBuilderImpl implements ResponseBuilder { + private static final Logger logger = getLogger(ResponseBuilderImpl.class); + private static final Set ignoredAttributes = new HashSet<>(Arrays.asList( - "attributes", "proxyresponse", ManagerReader.COMMAND_RESULT_RESPONSE_KEY)); + "attributes", "proxyresponse", ManagerReader.COMMAND_RESULT_RESPONSE_KEY)); private static final String RESPONSE_KEY = "response"; private static final String PROXY_RESPONSE_KEY = "proxyresponse"; @@ -57,7 +61,7 @@ public ManagerResponse buildResponse(Class responseCl } } - setAttributes(response, attributes, ignoredAttributes); + EventAttributesHelper.setAttributes(response, attributes, ignoredAttributes); if (response instanceof CommandResponse) { final CommandResponse commandResponse = (CommandResponse) response; diff --git a/src/main/java/org/asteriskjava/manager/internal/AbstractBuilder.java b/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java similarity index 76% rename from src/main/java/org/asteriskjava/manager/internal/AbstractBuilder.java rename to src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java index 62262be6e..5d8013dc1 100644 --- a/src/main/java/org/asteriskjava/manager/internal/AbstractBuilder.java +++ b/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java @@ -1,27 +1,45 @@ -package org.asteriskjava.manager.internal; +/* + * Copyright 2004-2022 Asterisk-Java contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.asteriskjava.manager.util; import org.asteriskjava.manager.event.UserEvent; import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.util.AstUtil; -import org.asteriskjava.util.Log; -import org.asteriskjava.util.LogFactory; import org.asteriskjava.util.ReflectionUtil; +import org.slf4j.Logger; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; +import static org.slf4j.LoggerFactory.getLogger; + /** - * Abstract base class for reflection based builders. + * @author Piotr Olaszewski */ -abstract class AbstractBuilder { - protected final Log logger = LogFactory.getLog(getClass()); +public class EventAttributesHelper { + private static final Logger logger = getLogger(EventAttributesHelper.class); + + private EventAttributesHelper() { + } - protected void setAttributes(Object target, Map attributes, Set ignoredAttributes) { + public static void setAttributes(Object target, Map attributes, Set ignoredAttributes) { Map setters; setters = ReflectionUtil.getSetters(target.getClass()); @@ -64,10 +82,10 @@ protected void setAttributes(Object target, Map attributes, Set< // intentional if (setter == null && !(target instanceof UserEvent) && !target.getClass().equals(ManagerResponse.class)) { logger.warn("Unable to set property '" + entry.getKey() + "' to '" + entry.getValue() + "' on " - + target.getClass().getName() - + ": no setter. Please report at https://github.com/asterisk-java/asterisk-java/issues"); + + target.getClass().getName() + + ": no setter. Please report at https://github.com/asterisk-java/asterisk-java/issues"); - for (Entry entry2 : attributes.entrySet()) { + for (Map.Entry entry2 : attributes.entrySet()) { logger.debug("Key: " + entry2.getKey() + " Value: " + entry2.getValue()); } } @@ -100,8 +118,8 @@ protected void setAttributes(Object target, Map attributes, Set< } else value = constructor.newInstance(entry.getValue()); } catch (Exception e) { logger.error("Unable to convert value: Called the constructor of " + dataType + " with value '" - + entry.getValue() + "' for the attribute '" + entry.getKey() + "'\n of event type " - + target.getClass().getName() + " with resulting error: " + e.getMessage(), e); + + entry.getValue() + "' for the attribute '" + entry.getKey() + "'\n of event type " + + target.getClass().getName() + " with resulting error: " + e.getMessage(), e); continue; } } @@ -109,12 +127,12 @@ protected void setAttributes(Object target, Map attributes, Set< setter.invoke(target, value); } catch (Exception e) { logger.error("Unable to set property '" + entry.getKey() + "' to '" + entry.getValue() + "' on " - + target.getClass().getName() + " " + e.getMessage(), e); + + target.getClass().getName() + " " + e.getMessage(), e); } } } - private Integer parseInteger(Entry entry) { + private static Integer parseInteger(Map.Entry entry) { Integer value; String stringValue = (String) entry.getValue(); if (stringValue != null && stringValue.length() > 0) { @@ -126,7 +144,7 @@ private Integer parseInteger(Entry entry) { } @SuppressWarnings("unchecked") - private Map parseMap(Map.Entry entry) { + private static Map parseMap(Map.Entry entry) { Map value; if (entry.getValue() instanceof List) { List list = (List) entry.getValue(); @@ -140,7 +158,7 @@ private Map parseMap(Map.Entry entry) { } @SuppressWarnings("unchecked") - private Object parseString(Map.Entry entry) { + private static Object parseString(Map.Entry entry) { Object value; value = entry.getValue(); if (AstUtil.isNull(value)) { @@ -159,7 +177,7 @@ private Object parseString(Map.Entry entry) { return value; } - private Double parseDouble(Map.Entry entry) { + private static Double parseDouble(Map.Entry entry) { Double value; String stringValue = (String) entry.getValue(); if (stringValue != null && stringValue.length() > 0) { @@ -170,7 +188,7 @@ private Double parseDouble(Map.Entry entry) { return value; } - private Long parseLong(Map.Entry entry) { + private static Long parseLong(Map.Entry entry) { Long value; String stringValue = (String) entry.getValue(); if (stringValue != null && stringValue.length() > 0) { @@ -181,7 +199,7 @@ private Long parseLong(Map.Entry entry) { return value; } - private Map buildMap(String... lines) { + private static Map buildMap(String... lines) { if (lines == null) { return null; } diff --git a/src/test/java/org/asteriskjava/manager/event/AgiExecStartEventTest.java b/src/test/java/org/asteriskjava/manager/event/AgiExecStartEventTest.java new file mode 100644 index 000000000..53861dff8 --- /dev/null +++ b/src/test/java/org/asteriskjava/manager/event/AgiExecStartEventTest.java @@ -0,0 +1,43 @@ +/* + * Copyright 2004-2022 Asterisk-Java contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.asteriskjava.manager.event; + +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.HashSet; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.asteriskjava.manager.util.EventAttributesHelper.setAttributes; + +class AgiExecStartEventTest { + @Test + void shouldCreateEvent() { + //given + AgiExecStartEvent agiExecStartEvent = new AgiExecStartEvent(new Object()); + + HashMap attributes = new HashMap<>(); + attributes.put("linkedid", "1617757665.32"); + attributes.put("language", "en"); + + //when + setAttributes(agiExecStartEvent, attributes, new HashSet<>()); + + //then + assertThat(agiExecStartEvent.getLinkedid()).isEqualTo("1617757665.32"); + assertThat(agiExecStartEvent.getLanguage()).isEqualTo("en"); + } +}