From e567a4439aa3ef1ee7ee9e38cffff0986f6c78c4 Mon Sep 17 00:00:00 2001 From: Piotr Olaszewski Date: Tue, 28 Nov 2023 16:47:12 +0100 Subject: [PATCH 01/10] Move ManagerAction and AbstractManagerAction to AMI module --- asterisk-java-ami/build.gradle | 29 +++++++ .../ami/action/AbstractManagerAction.java | 53 +++++++++++++ .../ami/action/ManagerAction.java | 54 +++++++++++++ build.gradle | 3 + settings.gradle | 1 + .../live/internal/AsteriskServerImpl.java | 1 + .../ManagerCommunicationExceptionMapper.java | 3 +- .../manager/DefaultManagerConnection.java | 2 +- .../manager/ExpectedResponse.java | 3 +- .../manager/ManagerConnection.java | 4 +- .../manager/ManagerConnectionFactory.java | 4 +- .../manager/SendActionCallback.java | 4 +- .../manager/action/AbsoluteTimeoutAction.java | 2 + .../manager/action/AbstractManagerAction.java | 78 ------------------- .../action/AbstractMeetMeMuteAction.java | 2 + .../action/AgentCallbackLoginAction.java | 2 + .../manager/action/AgentLogoffAction.java | 2 + .../manager/action/AgentsAction.java | 1 + .../manager/action/AgiAction.java | 1 + .../manager/action/AtxferAction.java | 2 + .../manager/action/BridgeAction.java | 2 + .../manager/action/ChallengeAction.java | 1 + .../manager/action/ChangeMonitorAction.java | 2 + .../manager/action/CommandAction.java | 1 + .../manager/action/ConfbridgeKickAction.java | 2 + .../manager/action/ConfbridgeListAction.java | 1 + .../action/ConfbridgeListRoomsAction.java | 1 + .../manager/action/ConfbridgeLockAction.java | 2 + .../manager/action/ConfbridgeMuteAction.java | 2 + .../ConfbridgeSetSingleVideoSrcAction.java | 2 + .../action/ConfbridgeStartRecordAction.java | 2 + .../action/ConfbridgeStopRecordAction.java | 2 + .../action/ConfbridgeUnlockAction.java | 2 + .../action/ConfbridgeUnmuteAction.java | 2 + .../manager/action/CoreSettingsAction.java | 1 + .../action/CoreShowChannelsAction.java | 1 + .../manager/action/CoreStatusAction.java | 1 + .../action/DahdiShowChannelsAction.java | 1 + .../manager/action/DbDelAction.java | 2 + .../manager/action/DbDelTreeAction.java | 2 + .../manager/action/DbGetAction.java | 1 + .../manager/action/DbPutAction.java | 2 + .../manager/action/DongleSendSMSAction.java | 2 + .../action/DongleShowDevicesAction.java | 1 + .../manager/action/EventGeneratingAction.java | 1 + .../manager/action/EventsAction.java | 2 + .../manager/action/ExecAction.java | 1 + .../manager/action/ExtensionStateAction.java | 1 + .../manager/action/FilterAction.java | 2 + .../manager/action/GetConfigAction.java | 1 + .../manager/action/GetVarAction.java | 1 + .../manager/action/HangupAction.java | 2 + .../manager/action/IaxPeerListAction.java | 1 + .../manager/action/JabberSendAction.java | 2 + .../manager/action/ListCommandsAction.java | 2 + .../action/LocalOptimizeAwayAction.java | 2 + .../manager/action/LoginAction.java | 2 + .../manager/action/LogoffAction.java | 2 + .../manager/action/MWIDeleteAction.java | 2 + .../manager/action/MWIUpdateAction.java | 2 + .../manager/action/MailboxCountAction.java | 1 + .../manager/action/MailboxStatusAction.java | 1 + .../manager/action/ManagerAction.java | 67 ---------------- .../manager/action/MessageSendAction.java | 2 + .../manager/action/MixMonitorAction.java | 1 + .../manager/action/MixMonitorMuteAction.java | 2 + .../manager/action/ModuleCheckAction.java | 1 + .../manager/action/ModuleLoadAction.java | 2 + .../manager/action/MonitorAction.java | 2 + .../manager/action/MuteAudioAction.java | 2 + .../manager/action/OriginateAction.java | 1 + .../manager/action/PJSIPNotifyAction.java | 3 + .../action/PJSipShowContactsAction.java | 1 + .../action/PJSipShowEndpointAction.java | 1 + .../action/PJSipShowEndpointsAction.java | 1 + .../manager/action/ParkAction.java | 2 + .../manager/action/ParkedCallsAction.java | 1 + .../manager/action/PauseMixMonitorAction.java | 2 + .../manager/action/PauseMonitorAction.java | 2 + .../manager/action/PingAction.java | 1 + .../manager/action/PlayDtmfAction.java | 2 + .../manager/action/QueueAddAction.java | 2 + .../QueueChangePriorityCallerAction.java | 2 + .../manager/action/QueueLogAction.java | 2 + .../action/QueueMemberRingInUseAction.java | 2 + .../manager/action/QueuePauseAction.java | 2 + .../manager/action/QueuePenaltyAction.java | 2 + .../manager/action/QueueRemoveAction.java | 2 + .../manager/action/QueueResetAction.java | 2 + .../manager/action/QueueStatusAction.java | 1 + .../manager/action/QueueSummaryAction.java | 1 + .../manager/action/RedirectAction.java | 2 + .../manager/action/SendTextAction.java | 2 + .../manager/action/SetCdrUserFieldAction.java | 2 + .../manager/action/SetVarAction.java | 2 + .../manager/action/ShowDialplanAction.java | 1 + .../manager/action/SipNotifyAction.java | 2 + .../manager/action/SipPeersAction.java | 1 + .../manager/action/SipShowPeerAction.java | 1 + .../manager/action/SipShowRegistryAction.java | 1 + .../action/SkypeAccountPropertyAction.java | 2 + .../manager/action/SkypeAddBuddyAction.java | 2 + .../manager/action/SkypeBuddiesAction.java | 1 + .../manager/action/SkypeBuddyAction.java | 1 + .../manager/action/SkypeChatSendAction.java | 2 + .../action/SkypeLicenseListAction.java | 1 + .../action/SkypeLicenseStatusAction.java | 1 + .../action/SkypeRemoveBuddyAction.java | 2 + .../manager/action/StatusAction.java | 1 + .../manager/action/StopMixMonitorAction.java | 2 + .../manager/action/StopMonitorAction.java | 2 + .../manager/action/UnpauseMonitorAction.java | 2 + .../manager/action/UpdateConfigAction.java | 2 + .../manager/action/UserEventAction.java | 1 + .../action/VoicemailUsersListAction.java | 1 + .../manager/action/ZapDialOffhookAction.java | 2 + .../manager/action/ZapDndOffAction.java | 2 + .../manager/action/ZapDndOnAction.java | 2 + .../manager/action/ZapHangupAction.java | 2 + .../manager/action/ZapRestartAction.java | 2 + .../manager/action/ZapShowChannelsAction.java | 1 + .../manager/action/ZapTransferAction.java | 2 + .../manager/event/ResponseEvent.java | 6 +- .../manager/internal/ActionBuilder.java | 2 +- .../manager/internal/ActionBuilderImpl.java | 54 +++++++++---- .../internal/ManagerConnectionImpl.java | 1 + .../manager/internal/ManagerWriter.java | 2 +- .../manager/internal/ManagerWriterImpl.java | 2 +- .../manager/response/ManagerResponse.java | 6 +- .../asterisk/wrap/actions/BridgeAction.java | 3 +- .../asterisk/wrap/actions/CommandAction.java | 4 +- .../wrap/actions/ConfbridgeKickAction.java | 4 +- .../wrap/actions/ConfbridgeListAction.java | 2 +- .../asterisk/wrap/actions/DbGetAction.java | 2 +- .../asterisk/wrap/actions/GetVarAction.java | 3 +- .../asterisk/wrap/actions/HangupAction.java | 3 +- .../wrap/actions/ListCommandsAction.java | 4 +- .../asterisk/wrap/actions/ManagerAction.java | 2 +- .../asterisk/wrap/actions/MonitorAction.java | 3 +- .../wrap/actions/OriginateAction.java | 3 +- .../pbx/asterisk/wrap/actions/PingAction.java | 4 +- .../asterisk/wrap/actions/PlayDtmfAction.java | 2 +- .../asterisk/wrap/actions/RedirectAction.java | 3 +- .../asterisk/wrap/actions/SetVarAction.java | 3 +- .../asterisk/wrap/actions/SipPeersAction.java | 4 +- .../wrap/actions/SipShowPeerAction.java | 2 +- .../asterisk/wrap/actions/StatusAction.java | 3 +- .../internal/core/CoherentEventFactory.java | 4 +- .../core/CoherentManagerConnection.java | 2 +- .../internal/ActionBuilderImplTest.java | 7 +- .../manager/internal/AnnotatedAction.java | 2 +- .../manager/internal/ManagerWriterMock.java | 2 +- 152 files changed, 425 insertions(+), 200 deletions(-) create mode 100644 asterisk-java-ami/build.gradle create mode 100644 asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/AbstractManagerAction.java create mode 100644 asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/ManagerAction.java delete mode 100644 src/main/java/org/asteriskjava/manager/action/AbstractManagerAction.java delete mode 100644 src/main/java/org/asteriskjava/manager/action/ManagerAction.java diff --git a/asterisk-java-ami/build.gradle b/asterisk-java-ami/build.gradle new file mode 100644 index 000000000..c7879c593 --- /dev/null +++ b/asterisk-java-ami/build.gradle @@ -0,0 +1,29 @@ +plugins { + id 'java-library' +} + +java { + sourceCompatibility = '17' + targetCompatibility = '17' + + withSourcesJar() + withJavadocJar() +} + +repositories { + mavenCentral() +} + +dependencies { + implementation project(':asterisk-java-core') + + implementation 'org.apache.commons:commons-lang3:3.14.0' + + testImplementation 'org.assertj:assertj-core:3.24.2' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.1' + testImplementation 'org.mockito:mockito-core:5.7.0' +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/AbstractManagerAction.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/AbstractManagerAction.java new file mode 100644 index 000000000..c0cb846ad --- /dev/null +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/AbstractManagerAction.java @@ -0,0 +1,53 @@ +/* + * Copyright 2004-2023 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.ami.action; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.asteriskjava.core.databind.annotation.AsteriskName; + +import java.io.Serial; + +/** + * This class implements the {@link ManagerAction} interface and can serve as the base class for your concrete action + * implementations. + * + * @author Stefan Reuter + * @author Piotr Olaszewski + * @since 1.0.0 + */ +public abstract class AbstractManagerAction implements ManagerAction { + @Serial + private static final long serialVersionUID = -7667827187378395689L; + + private String actionId; + + @AsteriskName("ActionID") + public String getActionId() { + return actionId; + } + + public void setActionId(String actionId) { + this.actionId = actionId; + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("action", getAction()) + .append("actionId", actionId) + .toString(); + } +} diff --git a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/ManagerAction.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/ManagerAction.java new file mode 100644 index 000000000..ec06e4ba3 --- /dev/null +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/ManagerAction.java @@ -0,0 +1,54 @@ +/* + * Copyright 2004-2023 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.ami.action; + +import java.io.Serializable; + +/** + * Interface that all actions that can be sent to the Asterisk server must implement. + *

+ * Instances of this class represent a command sent to Asterisk via AMI, requesting a particular action be performed. + * The number of actions available to the client are determined by the modules presently loaded in the Asterisk engine. + *

+ * There is one concrete subclass of ManagerAction per each supported Asterisk action. + * + * @author Stefan Reuter + * @since 1.0.0 + */ +public interface ManagerAction extends Serializable { + /** + * Asterisk argument: {@code Action}. + */ + String getAction(); + + /** + * Asterisk argument: {@code ActionID}. + */ + String getActionId(); + + /** + * Sets the Asterisk argument: {@code ActionID}. + *

+ * If the {@code ActionID} is set and sent to Asterisk, any response returned by Asterisk will include the same ID. + * This way, the {@code ActionID} can be used to track actions and their corresponding responses and response events. + *

+ * Note that Asterisk Java uses its own internal {@code ActionID} to match actions with the corresponding responses + * and events. Although the internal action is never exposed to the application code, if you want to handle responses + * or response events on your own, your application must set a unique {@code ActionID} using this method. + * Otherwise, the {@code ActionID} of the responses and response event objects passed to your application will be null. + */ + void setActionId(String actionId); +} diff --git a/build.gradle b/build.gradle index f7feed549..012774d9c 100644 --- a/build.gradle +++ b/build.gradle @@ -26,6 +26,9 @@ repositories { } dependencies { + implementation project(':asterisk-java-ami') + implementation project(':asterisk-java-core') + implementation 'com.google.guava:guava:32.1.3-jre' implementation 'org.apache.logging.log4j:log4j-core:2.22.0' implementation 'org.reflections:reflections:0.10.2' diff --git a/settings.gradle b/settings.gradle index ccfa47cbf..b974395f0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,4 @@ rootProject.name = 'asterisk-java' +include 'asterisk-java-ami' include 'asterisk-java-core' diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index 7062e5ad7..7dd4332ee 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -17,6 +17,7 @@ package org.asteriskjava.live.internal; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.config.ConfigFile; import org.asteriskjava.live.*; import org.asteriskjava.lock.Lockable; diff --git a/src/main/java/org/asteriskjava/live/internal/ManagerCommunicationExceptionMapper.java b/src/main/java/org/asteriskjava/live/internal/ManagerCommunicationExceptionMapper.java index 2ed537a59..ff102415c 100644 --- a/src/main/java/org/asteriskjava/live/internal/ManagerCommunicationExceptionMapper.java +++ b/src/main/java/org/asteriskjava/live/internal/ManagerCommunicationExceptionMapper.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.live.internal; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.live.ManagerCommunicationException; import org.asteriskjava.manager.EventTimeoutException; @@ -36,7 +37,7 @@ private ManagerCommunicationExceptionMapper() { /** * Maps exceptions received from * {@link org.asteriskjava.manager.ManagerConnection} when sending a - * {@link org.asteriskjava.manager.action.ManagerAction} to the corresponding + * {@link ManagerAction} to the corresponding * {@link org.asteriskjava.live.ManagerCommunicationException}. * * @param actionName name of the action that has been tried to send diff --git a/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java b/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java index e7c10501e..7f31bbf9c 100644 --- a/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java +++ b/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java @@ -17,8 +17,8 @@ package org.asteriskjava.manager; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.manager.action.EventGeneratingAction; -import org.asteriskjava.manager.action.ManagerAction; import org.asteriskjava.manager.event.ManagerEvent; import org.asteriskjava.manager.internal.ManagerConnectionImpl; import org.asteriskjava.manager.response.ManagerResponse; diff --git a/src/main/java/org/asteriskjava/manager/ExpectedResponse.java b/src/main/java/org/asteriskjava/manager/ExpectedResponse.java index da5c836c6..b91cddb68 100644 --- a/src/main/java/org/asteriskjava/manager/ExpectedResponse.java +++ b/src/main/java/org/asteriskjava/manager/ExpectedResponse.java @@ -1,5 +1,6 @@ package org.asteriskjava.manager; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.manager.response.ManagerResponse; import java.lang.annotation.Retention; @@ -9,7 +10,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; /** - * Indicates that an annotated {@link org.asteriskjava.manager.action.ManagerAction} expects + * Indicates that an annotated {@link ManagerAction} expects * a specific subclass of {@link org.asteriskjava.manager.response.ManagerResponse} when executed * successfully. * diff --git a/src/main/java/org/asteriskjava/manager/ManagerConnection.java b/src/main/java/org/asteriskjava/manager/ManagerConnection.java index 1fdbc8e42..d611f9b18 100644 --- a/src/main/java/org/asteriskjava/manager/ManagerConnection.java +++ b/src/main/java/org/asteriskjava/manager/ManagerConnection.java @@ -17,8 +17,8 @@ package org.asteriskjava.manager; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.manager.action.EventGeneratingAction; -import org.asteriskjava.manager.action.ManagerAction; import org.asteriskjava.manager.event.ManagerEvent; import org.asteriskjava.manager.response.ManagerResponse; @@ -31,7 +31,7 @@ * API. *

* The ManagerConnection repesents a connection to an Asterisk server and is - * capable of sending {@link org.asteriskjava.manager.action.ManagerAction}s and + * capable of sending {@link ManagerAction}s and * receiving {@link org.asteriskjava.manager.response.ManagerResponse}s and * {@link org.asteriskjava.manager.event.ManagerEvent}s. It does not add any * further functionality but rather provides a Java view to Asterisk's Manager diff --git a/src/main/java/org/asteriskjava/manager/ManagerConnectionFactory.java b/src/main/java/org/asteriskjava/manager/ManagerConnectionFactory.java index 9417c96bd..0a4c2963a 100644 --- a/src/main/java/org/asteriskjava/manager/ManagerConnectionFactory.java +++ b/src/main/java/org/asteriskjava/manager/ManagerConnectionFactory.java @@ -16,13 +16,15 @@ */ package org.asteriskjava.manager; +import org.asteriskjava.ami.action.ManagerAction; + /** * This factory is the canonical way to obtain new * {@link org.asteriskjava.manager.ManagerConnection}s.

* It creates new connections in state * {@link org.asteriskjava.manager.ManagerConnectionState#INITIAL}. Before * you can start using such a connection (i.e. sending - * {@link org.asteriskjava.manager.action.ManagerAction}s you must + * {@link ManagerAction}s you must * {@link org.asteriskjava.manager.ManagerConnection#login()} to change its state * to {@link org.asteriskjava.manager.ManagerConnectionState#CONNECTED}.

* Example: diff --git a/src/main/java/org/asteriskjava/manager/SendActionCallback.java b/src/main/java/org/asteriskjava/manager/SendActionCallback.java index 0e315621c..37d554699 100644 --- a/src/main/java/org/asteriskjava/manager/SendActionCallback.java +++ b/src/main/java/org/asteriskjava/manager/SendActionCallback.java @@ -16,11 +16,11 @@ */ package org.asteriskjava.manager; -import org.asteriskjava.manager.action.ManagerAction; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.manager.response.ManagerResponse; /** - * Callback interface to send {@link org.asteriskjava.manager.action.ManagerAction}s + * Callback interface to send {@link ManagerAction}s * asynchronously. * * @author srt diff --git a/src/main/java/org/asteriskjava/manager/action/AbsoluteTimeoutAction.java b/src/main/java/org/asteriskjava/manager/action/AbsoluteTimeoutAction.java index eb6ec8830..74abe9faf 100644 --- a/src/main/java/org/asteriskjava/manager/action/AbsoluteTimeoutAction.java +++ b/src/main/java/org/asteriskjava/manager/action/AbsoluteTimeoutAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The AbsoluteTimeoutAction sets the absolute maximum amount of time permitted * for a call on a given channel, it hangs up the channel after a certain time. diff --git a/src/main/java/org/asteriskjava/manager/action/AbstractManagerAction.java b/src/main/java/org/asteriskjava/manager/action/AbstractManagerAction.java deleted file mode 100644 index 7280ecda2..000000000 --- a/src/main/java/org/asteriskjava/manager/action/AbstractManagerAction.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2004-2006 Stefan Reuter - * - * 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.action; - -import org.asteriskjava.util.ReflectionUtil; - -import java.lang.reflect.Method; -import java.util.Map; - -/** - * This class implements the ManagerAction interface and can serve as base class - * for your concrete Action implementations. - * - * @author srt - * @version $Id$ - * @since 0.2 - */ -public abstract class AbstractManagerAction implements ManagerAction { - /** - * Serializable version identifier. - */ - static final long serialVersionUID = -7667827187378395689L; - - private String actionId; - - public abstract String getAction(); - - public String getActionId() { - return actionId; - } - - public void setActionId(String actionId) { - this.actionId = actionId; - } - - @Override - public String toString() { - StringBuilder sb; - Map getters; - - sb = new StringBuilder(getClass().getName() + "["); - sb.append("action='").append(getAction()).append("',"); - getters = ReflectionUtil.getGetters(getClass()); - for (Map.Entry entry : getters.entrySet()) { - final String attribute = entry.getKey(); - if ("action".equals(attribute) || "class".equals(attribute)) { - continue; - } - - try { - Object value; - value = entry.getValue().invoke(this); - sb.append(attribute).append("='").append(value).append("',"); - } catch (Exception e) // NOPMD - { - // swallow - } - } - sb.append("systemHashcode=").append(System.identityHashCode(this)); - sb.append("]"); - - return sb.toString(); - } -} diff --git a/src/main/java/org/asteriskjava/manager/action/AbstractMeetMeMuteAction.java b/src/main/java/org/asteriskjava/manager/action/AbstractMeetMeMuteAction.java index 684cc562b..eb4b8e033 100644 --- a/src/main/java/org/asteriskjava/manager/action/AbstractMeetMeMuteAction.java +++ b/src/main/java/org/asteriskjava/manager/action/AbstractMeetMeMuteAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * Abstract base class for mute and unmute actions. * diff --git a/src/main/java/org/asteriskjava/manager/action/AgentCallbackLoginAction.java b/src/main/java/org/asteriskjava/manager/action/AgentCallbackLoginAction.java index 10598f07e..e89f45cf1 100644 --- a/src/main/java/org/asteriskjava/manager/action/AgentCallbackLoginAction.java +++ b/src/main/java/org/asteriskjava/manager/action/AgentCallbackLoginAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The AgentCallbackLoginAction sets an agent as logged in with callback.

* You can pass an extentsion (and optionally a context) to specify the diff --git a/src/main/java/org/asteriskjava/manager/action/AgentLogoffAction.java b/src/main/java/org/asteriskjava/manager/action/AgentLogoffAction.java index 940bbe1c4..b9acc9274 100644 --- a/src/main/java/org/asteriskjava/manager/action/AgentLogoffAction.java +++ b/src/main/java/org/asteriskjava/manager/action/AgentLogoffAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The AgentLogoffAction sets an agent as no longer logged in.

* Available since Asterisk 1.2 diff --git a/src/main/java/org/asteriskjava/manager/action/AgentsAction.java b/src/main/java/org/asteriskjava/manager/action/AgentsAction.java index 2077b93ce..8619fff33 100644 --- a/src/main/java/org/asteriskjava/manager/action/AgentsAction.java +++ b/src/main/java/org/asteriskjava/manager/action/AgentsAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.AgentsCompleteEvent; import org.asteriskjava.manager.event.ResponseEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/AgiAction.java b/src/main/java/org/asteriskjava/manager/action/AgiAction.java index 014cefd15..326909881 100644 --- a/src/main/java/org/asteriskjava/manager/action/AgiAction.java +++ b/src/main/java/org/asteriskjava/manager/action/AgiAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.AsyncAgiEvent; import org.asteriskjava.manager.event.ResponseEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/AtxferAction.java b/src/main/java/org/asteriskjava/manager/action/AtxferAction.java index 12b08fc5d..7054962be 100644 --- a/src/main/java/org/asteriskjava/manager/action/AtxferAction.java +++ b/src/main/java/org/asteriskjava/manager/action/AtxferAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * Starts an attended transfer. This action seems to be a bit of a hack. See * http://bugs.digium.com/view.php?id=12158 diff --git a/src/main/java/org/asteriskjava/manager/action/BridgeAction.java b/src/main/java/org/asteriskjava/manager/action/BridgeAction.java index 17121eeda..395bcb3be 100644 --- a/src/main/java/org/asteriskjava/manager/action/BridgeAction.java +++ b/src/main/java/org/asteriskjava/manager/action/BridgeAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The BridgeAction bridges two channels that are currently active on the system.

* It is definied in res/res_features.c.

diff --git a/src/main/java/org/asteriskjava/manager/action/ChallengeAction.java b/src/main/java/org/asteriskjava/manager/action/ChallengeAction.java index 9b0f0a993..357a45bf3 100644 --- a/src/main/java/org/asteriskjava/manager/action/ChallengeAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ChallengeAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.ExpectedResponse; import org.asteriskjava.manager.response.ChallengeResponse; diff --git a/src/main/java/org/asteriskjava/manager/action/ChangeMonitorAction.java b/src/main/java/org/asteriskjava/manager/action/ChangeMonitorAction.java index 1947eadcc..c0242123f 100644 --- a/src/main/java/org/asteriskjava/manager/action/ChangeMonitorAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ChangeMonitorAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The ChangeMonitorAction changes the monitoring filename of a channel. It has * no effect if the channel is not monitored.

diff --git a/src/main/java/org/asteriskjava/manager/action/CommandAction.java b/src/main/java/org/asteriskjava/manager/action/CommandAction.java index 118d8acbd..3d0f36b7e 100644 --- a/src/main/java/org/asteriskjava/manager/action/CommandAction.java +++ b/src/main/java/org/asteriskjava/manager/action/CommandAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.ExpectedResponse; import org.asteriskjava.manager.response.CommandResponse; diff --git a/src/main/java/org/asteriskjava/manager/action/ConfbridgeKickAction.java b/src/main/java/org/asteriskjava/manager/action/ConfbridgeKickAction.java index eb7527d86..0e6a56528 100644 --- a/src/main/java/org/asteriskjava/manager/action/ConfbridgeKickAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ConfbridgeKickAction.java @@ -1,5 +1,7 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The ConfbridgeKickAction kicks a channel out of a conference. * diff --git a/src/main/java/org/asteriskjava/manager/action/ConfbridgeListAction.java b/src/main/java/org/asteriskjava/manager/action/ConfbridgeListAction.java index e22d06589..9a015b4ca 100644 --- a/src/main/java/org/asteriskjava/manager/action/ConfbridgeListAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ConfbridgeListAction.java @@ -1,5 +1,6 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.ConfbridgeListCompleteEvent; import org.asteriskjava.manager.event.ResponseEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/ConfbridgeListRoomsAction.java b/src/main/java/org/asteriskjava/manager/action/ConfbridgeListRoomsAction.java index 024fb6188..e79d9ee3a 100644 --- a/src/main/java/org/asteriskjava/manager/action/ConfbridgeListRoomsAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ConfbridgeListRoomsAction.java @@ -1,5 +1,6 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.ConfbridgeListRoomsCompleteEvent; import org.asteriskjava.manager.event.ResponseEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/ConfbridgeLockAction.java b/src/main/java/org/asteriskjava/manager/action/ConfbridgeLockAction.java index c55b9bfb1..c5e082f7a 100644 --- a/src/main/java/org/asteriskjava/manager/action/ConfbridgeLockAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ConfbridgeLockAction.java @@ -1,5 +1,7 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The ConfbridgeLockAction lockes a specified conference. * diff --git a/src/main/java/org/asteriskjava/manager/action/ConfbridgeMuteAction.java b/src/main/java/org/asteriskjava/manager/action/ConfbridgeMuteAction.java index 86c688cce..7867d6fae 100644 --- a/src/main/java/org/asteriskjava/manager/action/ConfbridgeMuteAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ConfbridgeMuteAction.java @@ -1,5 +1,7 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The ConfbridgeMuteAction mutes a channel in a conference. * diff --git a/src/main/java/org/asteriskjava/manager/action/ConfbridgeSetSingleVideoSrcAction.java b/src/main/java/org/asteriskjava/manager/action/ConfbridgeSetSingleVideoSrcAction.java index 7d6f33e29..c99877082 100644 --- a/src/main/java/org/asteriskjava/manager/action/ConfbridgeSetSingleVideoSrcAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ConfbridgeSetSingleVideoSrcAction.java @@ -1,5 +1,7 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The ConfbridgeSetSingleVideoSrcAction sets a conference user as the single video source distributed to all other video-capable participants. * diff --git a/src/main/java/org/asteriskjava/manager/action/ConfbridgeStartRecordAction.java b/src/main/java/org/asteriskjava/manager/action/ConfbridgeStartRecordAction.java index ff92772c1..93d009a89 100644 --- a/src/main/java/org/asteriskjava/manager/action/ConfbridgeStartRecordAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ConfbridgeStartRecordAction.java @@ -15,6 +15,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The ConfbridgeStartAction starts an audio recording of a conference. * diff --git a/src/main/java/org/asteriskjava/manager/action/ConfbridgeStopRecordAction.java b/src/main/java/org/asteriskjava/manager/action/ConfbridgeStopRecordAction.java index 2a5d8c6ec..d7993d36f 100644 --- a/src/main/java/org/asteriskjava/manager/action/ConfbridgeStopRecordAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ConfbridgeStopRecordAction.java @@ -1,5 +1,7 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The ConfbridgeStopAction stops an audio recording of a conference. * diff --git a/src/main/java/org/asteriskjava/manager/action/ConfbridgeUnlockAction.java b/src/main/java/org/asteriskjava/manager/action/ConfbridgeUnlockAction.java index fb91b522f..8598c76c0 100644 --- a/src/main/java/org/asteriskjava/manager/action/ConfbridgeUnlockAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ConfbridgeUnlockAction.java @@ -1,5 +1,7 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The ConfbridgeUnlockAction unlocks a specified conference. * diff --git a/src/main/java/org/asteriskjava/manager/action/ConfbridgeUnmuteAction.java b/src/main/java/org/asteriskjava/manager/action/ConfbridgeUnmuteAction.java index f6a4845ff..eb57d8e1b 100644 --- a/src/main/java/org/asteriskjava/manager/action/ConfbridgeUnmuteAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ConfbridgeUnmuteAction.java @@ -1,5 +1,7 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The ConfbridgeUnmuteAction unmutes a channel in a conference. * diff --git a/src/main/java/org/asteriskjava/manager/action/CoreSettingsAction.java b/src/main/java/org/asteriskjava/manager/action/CoreSettingsAction.java index 0a81b36b2..e315f0888 100644 --- a/src/main/java/org/asteriskjava/manager/action/CoreSettingsAction.java +++ b/src/main/java/org/asteriskjava/manager/action/CoreSettingsAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.ExpectedResponse; import org.asteriskjava.manager.response.CoreSettingsResponse; diff --git a/src/main/java/org/asteriskjava/manager/action/CoreShowChannelsAction.java b/src/main/java/org/asteriskjava/manager/action/CoreShowChannelsAction.java index b6210c2c2..b090d0c33 100644 --- a/src/main/java/org/asteriskjava/manager/action/CoreShowChannelsAction.java +++ b/src/main/java/org/asteriskjava/manager/action/CoreShowChannelsAction.java @@ -17,6 +17,7 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.CoreShowChannelsCompleteEvent; import org.asteriskjava.manager.event.ResponseEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/CoreStatusAction.java b/src/main/java/org/asteriskjava/manager/action/CoreStatusAction.java index 7a178d5ed..a05f29e6a 100644 --- a/src/main/java/org/asteriskjava/manager/action/CoreStatusAction.java +++ b/src/main/java/org/asteriskjava/manager/action/CoreStatusAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.ExpectedResponse; import org.asteriskjava.manager.response.CoreStatusResponse; diff --git a/src/main/java/org/asteriskjava/manager/action/DahdiShowChannelsAction.java b/src/main/java/org/asteriskjava/manager/action/DahdiShowChannelsAction.java index a52b21cbd..f08014abc 100644 --- a/src/main/java/org/asteriskjava/manager/action/DahdiShowChannelsAction.java +++ b/src/main/java/org/asteriskjava/manager/action/DahdiShowChannelsAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.DahdiShowChannelsCompleteEvent; import org.asteriskjava.manager.event.ResponseEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/DbDelAction.java b/src/main/java/org/asteriskjava/manager/action/DbDelAction.java index 528424fe0..f2435efa7 100644 --- a/src/main/java/org/asteriskjava/manager/action/DbDelAction.java +++ b/src/main/java/org/asteriskjava/manager/action/DbDelAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * Deletes an entry in the Asterisk database for a given family and key.

* Available since Asterisk 1.2 with BRIStuff patches and since Asterisk 1.6 diff --git a/src/main/java/org/asteriskjava/manager/action/DbDelTreeAction.java b/src/main/java/org/asteriskjava/manager/action/DbDelTreeAction.java index 6b21c94d4..ae47f72ff 100644 --- a/src/main/java/org/asteriskjava/manager/action/DbDelTreeAction.java +++ b/src/main/java/org/asteriskjava/manager/action/DbDelTreeAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * Recursivly deletes entries in the Asterisk database for a given family and key.

* Available since Asterisk 1.6 diff --git a/src/main/java/org/asteriskjava/manager/action/DbGetAction.java b/src/main/java/org/asteriskjava/manager/action/DbGetAction.java index 591abf8b0..cfa8670f7 100644 --- a/src/main/java/org/asteriskjava/manager/action/DbGetAction.java +++ b/src/main/java/org/asteriskjava/manager/action/DbGetAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.DbGetResponseEvent; import org.asteriskjava.manager.event.ResponseEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/DbPutAction.java b/src/main/java/org/asteriskjava/manager/action/DbPutAction.java index d91242c50..ccfb9c52c 100644 --- a/src/main/java/org/asteriskjava/manager/action/DbPutAction.java +++ b/src/main/java/org/asteriskjava/manager/action/DbPutAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * Adds or updates an entry in the Asterisk database for a given family, key, * and value.

diff --git a/src/main/java/org/asteriskjava/manager/action/DongleSendSMSAction.java b/src/main/java/org/asteriskjava/manager/action/DongleSendSMSAction.java index a0dde3f58..b8e240351 100644 --- a/src/main/java/org/asteriskjava/manager/action/DongleSendSMSAction.java +++ b/src/main/java/org/asteriskjava/manager/action/DongleSendSMSAction.java @@ -1,5 +1,7 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + public class DongleSendSMSAction extends AbstractManagerAction { static final long serialVersionUID = 8194597741743334704L; private String device; diff --git a/src/main/java/org/asteriskjava/manager/action/DongleShowDevicesAction.java b/src/main/java/org/asteriskjava/manager/action/DongleShowDevicesAction.java index c2418b717..2d82a66bf 100644 --- a/src/main/java/org/asteriskjava/manager/action/DongleShowDevicesAction.java +++ b/src/main/java/org/asteriskjava/manager/action/DongleShowDevicesAction.java @@ -1,5 +1,6 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.DongleShowDevicesCompleteEvent; import org.asteriskjava.manager.event.ResponseEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/EventGeneratingAction.java b/src/main/java/org/asteriskjava/manager/action/EventGeneratingAction.java index acd4bf04e..36437a168 100644 --- a/src/main/java/org/asteriskjava/manager/action/EventGeneratingAction.java +++ b/src/main/java/org/asteriskjava/manager/action/EventGeneratingAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.manager.event.ResponseEvent; /** diff --git a/src/main/java/org/asteriskjava/manager/action/EventsAction.java b/src/main/java/org/asteriskjava/manager/action/EventsAction.java index 953a47ce8..86b8ed1c9 100644 --- a/src/main/java/org/asteriskjava/manager/action/EventsAction.java +++ b/src/main/java/org/asteriskjava/manager/action/EventsAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * With the EventsAction you can specify what kind of events should be sent to * this manager connection. diff --git a/src/main/java/org/asteriskjava/manager/action/ExecAction.java b/src/main/java/org/asteriskjava/manager/action/ExecAction.java index 7fa229e13..d623428cc 100644 --- a/src/main/java/org/asteriskjava/manager/action/ExecAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ExecAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.ExpectedResponse; import org.asteriskjava.manager.response.CommandResponse; diff --git a/src/main/java/org/asteriskjava/manager/action/ExtensionStateAction.java b/src/main/java/org/asteriskjava/manager/action/ExtensionStateAction.java index b3062022a..45ec6984a 100644 --- a/src/main/java/org/asteriskjava/manager/action/ExtensionStateAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ExtensionStateAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.ExpectedResponse; import org.asteriskjava.manager.response.ExtensionStateResponse; diff --git a/src/main/java/org/asteriskjava/manager/action/FilterAction.java b/src/main/java/org/asteriskjava/manager/action/FilterAction.java index ec4ddcc32..78aab42e6 100644 --- a/src/main/java/org/asteriskjava/manager/action/FilterAction.java +++ b/src/main/java/org/asteriskjava/manager/action/FilterAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The FilterAction dynamically adds filters for the current user in a manager session. * The filters added are only used for the current session. Once the connection is closed the filters are removed. diff --git a/src/main/java/org/asteriskjava/manager/action/GetConfigAction.java b/src/main/java/org/asteriskjava/manager/action/GetConfigAction.java index e64de5148..51671e747 100644 --- a/src/main/java/org/asteriskjava/manager/action/GetConfigAction.java +++ b/src/main/java/org/asteriskjava/manager/action/GetConfigAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.ExpectedResponse; import org.asteriskjava.manager.response.GetConfigResponse; diff --git a/src/main/java/org/asteriskjava/manager/action/GetVarAction.java b/src/main/java/org/asteriskjava/manager/action/GetVarAction.java index 6d0f14727..fe42071da 100644 --- a/src/main/java/org/asteriskjava/manager/action/GetVarAction.java +++ b/src/main/java/org/asteriskjava/manager/action/GetVarAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.ExpectedResponse; import org.asteriskjava.manager.response.GetVarResponse; diff --git a/src/main/java/org/asteriskjava/manager/action/HangupAction.java b/src/main/java/org/asteriskjava/manager/action/HangupAction.java index 2ea1fc3af..30369e5ba 100644 --- a/src/main/java/org/asteriskjava/manager/action/HangupAction.java +++ b/src/main/java/org/asteriskjava/manager/action/HangupAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The HangupAction causes Asterisk to hang up a given channel.

* Hangup with a cause code is only supported by Asterisk versions later than 1.6.2. diff --git a/src/main/java/org/asteriskjava/manager/action/IaxPeerListAction.java b/src/main/java/org/asteriskjava/manager/action/IaxPeerListAction.java index 3463ce453..58425c3a6 100644 --- a/src/main/java/org/asteriskjava/manager/action/IaxPeerListAction.java +++ b/src/main/java/org/asteriskjava/manager/action/IaxPeerListAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.PeerlistCompleteEvent; import org.asteriskjava.manager.event.ResponseEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/JabberSendAction.java b/src/main/java/org/asteriskjava/manager/action/JabberSendAction.java index 17bb9519f..d09e60ebc 100644 --- a/src/main/java/org/asteriskjava/manager/action/JabberSendAction.java +++ b/src/main/java/org/asteriskjava/manager/action/JabberSendAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The JabberSendAction sends a Jabber (XMPP) message to a recipient.

* Available since Asterisk 1.6.0 diff --git a/src/main/java/org/asteriskjava/manager/action/ListCommandsAction.java b/src/main/java/org/asteriskjava/manager/action/ListCommandsAction.java index 916324ff3..182a358e9 100644 --- a/src/main/java/org/asteriskjava/manager/action/ListCommandsAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ListCommandsAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The ListCommandsAction returns possible commands in the Manager interface. *

diff --git a/src/main/java/org/asteriskjava/manager/action/LocalOptimizeAwayAction.java b/src/main/java/org/asteriskjava/manager/action/LocalOptimizeAwayAction.java index d307c53d5..70087c2bb 100644 --- a/src/main/java/org/asteriskjava/manager/action/LocalOptimizeAwayAction.java +++ b/src/main/java/org/asteriskjava/manager/action/LocalOptimizeAwayAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * LocalOptimizeAway action -- Optimize away a local channel when possible. *

diff --git a/src/main/java/org/asteriskjava/manager/action/LoginAction.java b/src/main/java/org/asteriskjava/manager/action/LoginAction.java index 0a9f61f39..ed1b7800d 100644 --- a/src/main/java/org/asteriskjava/manager/action/LoginAction.java +++ b/src/main/java/org/asteriskjava/manager/action/LoginAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The LoginAction authenticates the connection.

* A successful login is the precondition for sending any other action except diff --git a/src/main/java/org/asteriskjava/manager/action/LogoffAction.java b/src/main/java/org/asteriskjava/manager/action/LogoffAction.java index a5ef175af..0f218d61f 100644 --- a/src/main/java/org/asteriskjava/manager/action/LogoffAction.java +++ b/src/main/java/org/asteriskjava/manager/action/LogoffAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The LogoffAction causes the server to close the connection. * diff --git a/src/main/java/org/asteriskjava/manager/action/MWIDeleteAction.java b/src/main/java/org/asteriskjava/manager/action/MWIDeleteAction.java index 646f95a4a..5a5d0bfc4 100644 --- a/src/main/java/org/asteriskjava/manager/action/MWIDeleteAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MWIDeleteAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + public class MWIDeleteAction extends AbstractManagerAction { static final long serialVersionUID = 1L; private String mailbox; diff --git a/src/main/java/org/asteriskjava/manager/action/MWIUpdateAction.java b/src/main/java/org/asteriskjava/manager/action/MWIUpdateAction.java index a9adfe154..dccb20e83 100644 --- a/src/main/java/org/asteriskjava/manager/action/MWIUpdateAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MWIUpdateAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + public class MWIUpdateAction extends AbstractManagerAction { static final long serialVersionUID = 1L; private String mailbox; diff --git a/src/main/java/org/asteriskjava/manager/action/MailboxCountAction.java b/src/main/java/org/asteriskjava/manager/action/MailboxCountAction.java index 7a2bb7e84..0fdec87d1 100644 --- a/src/main/java/org/asteriskjava/manager/action/MailboxCountAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MailboxCountAction.java @@ -5,6 +5,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.ExpectedResponse; import org.asteriskjava.manager.response.MailboxCountResponse; diff --git a/src/main/java/org/asteriskjava/manager/action/MailboxStatusAction.java b/src/main/java/org/asteriskjava/manager/action/MailboxStatusAction.java index a9091058d..3fe34cdf2 100644 --- a/src/main/java/org/asteriskjava/manager/action/MailboxStatusAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MailboxStatusAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.ExpectedResponse; import org.asteriskjava.manager.response.MailboxStatusResponse; diff --git a/src/main/java/org/asteriskjava/manager/action/ManagerAction.java b/src/main/java/org/asteriskjava/manager/action/ManagerAction.java deleted file mode 100644 index 93c578dab..000000000 --- a/src/main/java/org/asteriskjava/manager/action/ManagerAction.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2004-2006 Stefan Reuter - * - * 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.action; - -import java.io.Serializable; - -/** - * Interface that all Actions that can be sent to the Asterisk server must - * impement.

- * Instances of this class represent a command sent to Asterisk via Manager API, - * requesting a particular Action be performed. The number of actions available - * to the client are determined by the modules presently loaded in the Asterisk - * engine.

- * There is one conrete subclass of ManagerAction per each supported Asterisk - * Action. - * - * @author srt - * @version $Id$ - */ -public interface ManagerAction extends Serializable { - /** - * Returns the name of the action for example "Hangup". - */ - String getAction(); - - /** - * Returns the action id. - * - * @return the user provied action id. - */ - String getActionId(); - - /** - * Sets the action id.

- * If the action id is set and sent to the asterisk server any response - * returned by the Asterisk server will include the same id. This way - * the action id can be used to track actions and their corresponding - * responses and response events.

- * Note that Asterisk-Java uses its own internal action id to match - * actions with the corresponding responses and events. Though the internal - * action is never exposed to the application code. So if you want to - * handle reponses or response events on your own your application must - * set a unique action id using this method otherwise the action id of - * the reponse and response event objects passed to your application - * will be null. - * - * @param actionId the user provided action id to set. - * @see org.asteriskjava.manager.response.ManagerResponse#getActionId() - * @see org.asteriskjava.manager.event.ResponseEvent#getActionId() - */ - void setActionId(String actionId); - -} diff --git a/src/main/java/org/asteriskjava/manager/action/MessageSendAction.java b/src/main/java/org/asteriskjava/manager/action/MessageSendAction.java index b13218c65..1dcbc0e0a 100644 --- a/src/main/java/org/asteriskjava/manager/action/MessageSendAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MessageSendAction.java @@ -1,5 +1,7 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + import java.util.LinkedHashMap; import java.util.Map; diff --git a/src/main/java/org/asteriskjava/manager/action/MixMonitorAction.java b/src/main/java/org/asteriskjava/manager/action/MixMonitorAction.java index fa7bc94c5..63303bc37 100644 --- a/src/main/java/org/asteriskjava/manager/action/MixMonitorAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MixMonitorAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.ExpectedResponse; import org.asteriskjava.manager.response.MixMonitorResponse; diff --git a/src/main/java/org/asteriskjava/manager/action/MixMonitorMuteAction.java b/src/main/java/org/asteriskjava/manager/action/MixMonitorMuteAction.java index 1110c239c..7fe589bba 100644 --- a/src/main/java/org/asteriskjava/manager/action/MixMonitorMuteAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MixMonitorMuteAction.java @@ -15,6 +15,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * MixMonitorMute can be used to mute and un-mute an existing recording. * diff --git a/src/main/java/org/asteriskjava/manager/action/ModuleCheckAction.java b/src/main/java/org/asteriskjava/manager/action/ModuleCheckAction.java index 3c368d3aa..dce93732d 100644 --- a/src/main/java/org/asteriskjava/manager/action/ModuleCheckAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ModuleCheckAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.ExpectedResponse; import org.asteriskjava.manager.response.ModuleCheckResponse; diff --git a/src/main/java/org/asteriskjava/manager/action/ModuleLoadAction.java b/src/main/java/org/asteriskjava/manager/action/ModuleLoadAction.java index 632b28bff..e242c6669 100644 --- a/src/main/java/org/asteriskjava/manager/action/ModuleLoadAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ModuleLoadAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The ModuleLoadAction loads, unloads or reloads Asterisk modules.

* Available since Asterisk 1.6 diff --git a/src/main/java/org/asteriskjava/manager/action/MonitorAction.java b/src/main/java/org/asteriskjava/manager/action/MonitorAction.java index dfd47f6f2..344ebfd70 100644 --- a/src/main/java/org/asteriskjava/manager/action/MonitorAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MonitorAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The MonitorAction starts monitoring (recording) a channel.

* It is implemented in res/res_monitor.c diff --git a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java index 0b49c16b0..c037efc9a 100644 --- a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * Action: MuteAudio Synopsis: Mute an audio stream Privilege: system,all * Description: Mute an incoming or outbound audio stream in a channel. diff --git a/src/main/java/org/asteriskjava/manager/action/OriginateAction.java b/src/main/java/org/asteriskjava/manager/action/OriginateAction.java index 964e2b77e..c48e2d26d 100644 --- a/src/main/java/org/asteriskjava/manager/action/OriginateAction.java +++ b/src/main/java/org/asteriskjava/manager/action/OriginateAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.OriginateResponseEvent; import org.asteriskjava.manager.event.ResponseEvent; import org.asteriskjava.util.Log; diff --git a/src/main/java/org/asteriskjava/manager/action/PJSIPNotifyAction.java b/src/main/java/org/asteriskjava/manager/action/PJSIPNotifyAction.java index 40dd386b8..ba356c7e1 100644 --- a/src/main/java/org/asteriskjava/manager/action/PJSIPNotifyAction.java +++ b/src/main/java/org/asteriskjava/manager/action/PJSIPNotifyAction.java @@ -16,6 +16,9 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; +import org.asteriskjava.ami.action.ManagerAction; + import java.util.LinkedHashMap; import java.util.Map; diff --git a/src/main/java/org/asteriskjava/manager/action/PJSipShowContactsAction.java b/src/main/java/org/asteriskjava/manager/action/PJSipShowContactsAction.java index bc899dc48..564ce865c 100644 --- a/src/main/java/org/asteriskjava/manager/action/PJSipShowContactsAction.java +++ b/src/main/java/org/asteriskjava/manager/action/PJSipShowContactsAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.ContactListComplete; import org.asteriskjava.manager.event.ResponseEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/PJSipShowEndpointAction.java b/src/main/java/org/asteriskjava/manager/action/PJSipShowEndpointAction.java index 78c643be3..ea5ded353 100644 --- a/src/main/java/org/asteriskjava/manager/action/PJSipShowEndpointAction.java +++ b/src/main/java/org/asteriskjava/manager/action/PJSipShowEndpointAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.EndpointDetailComplete; import org.asteriskjava.manager.event.ResponseEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/PJSipShowEndpointsAction.java b/src/main/java/org/asteriskjava/manager/action/PJSipShowEndpointsAction.java index 71c738724..97a1140f5 100644 --- a/src/main/java/org/asteriskjava/manager/action/PJSipShowEndpointsAction.java +++ b/src/main/java/org/asteriskjava/manager/action/PJSipShowEndpointsAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.EndpointListComplete; import org.asteriskjava.manager.event.ResponseEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/ParkAction.java b/src/main/java/org/asteriskjava/manager/action/ParkAction.java index ed6d30855..1e9533b6b 100644 --- a/src/main/java/org/asteriskjava/manager/action/ParkAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ParkAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The ParkAction parks a channel using Asterisk's park feature. *

diff --git a/src/main/java/org/asteriskjava/manager/action/ParkedCallsAction.java b/src/main/java/org/asteriskjava/manager/action/ParkedCallsAction.java index 0f519e0de..ceb34f78c 100644 --- a/src/main/java/org/asteriskjava/manager/action/ParkedCallsAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ParkedCallsAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.ParkedCallsCompleteEvent; import org.asteriskjava.manager.event.ResponseEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/PauseMixMonitorAction.java b/src/main/java/org/asteriskjava/manager/action/PauseMixMonitorAction.java index 31992b30c..940d88ae1 100644 --- a/src/main/java/org/asteriskjava/manager/action/PauseMixMonitorAction.java +++ b/src/main/java/org/asteriskjava/manager/action/PauseMixMonitorAction.java @@ -17,6 +17,8 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The PauseMixMonitorAction temporarily stop/start monitoring (recording) a/both channel(s). *

diff --git a/src/main/java/org/asteriskjava/manager/action/PauseMonitorAction.java b/src/main/java/org/asteriskjava/manager/action/PauseMonitorAction.java index 041ee56e3..72caefefc 100644 --- a/src/main/java/org/asteriskjava/manager/action/PauseMonitorAction.java +++ b/src/main/java/org/asteriskjava/manager/action/PauseMonitorAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The PauseMonitorAction temporarily stop monitoring (recording) a channel. *

diff --git a/src/main/java/org/asteriskjava/manager/action/PingAction.java b/src/main/java/org/asteriskjava/manager/action/PingAction.java index 58be89a06..236e90a0a 100644 --- a/src/main/java/org/asteriskjava/manager/action/PingAction.java +++ b/src/main/java/org/asteriskjava/manager/action/PingAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.ExpectedResponse; import org.asteriskjava.manager.response.PingResponse; diff --git a/src/main/java/org/asteriskjava/manager/action/PlayDtmfAction.java b/src/main/java/org/asteriskjava/manager/action/PlayDtmfAction.java index c0b71995c..e0a2b7846 100644 --- a/src/main/java/org/asteriskjava/manager/action/PlayDtmfAction.java +++ b/src/main/java/org/asteriskjava/manager/action/PlayDtmfAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The PlayDTMFAction plays a DTMF digit on the specified channel. *

diff --git a/src/main/java/org/asteriskjava/manager/action/QueueAddAction.java b/src/main/java/org/asteriskjava/manager/action/QueueAddAction.java index 61c394ec9..2d22039ef 100644 --- a/src/main/java/org/asteriskjava/manager/action/QueueAddAction.java +++ b/src/main/java/org/asteriskjava/manager/action/QueueAddAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The QueueAddAction adds a new member to a queue.

* It is implemented in apps/app_queue.c

diff --git a/src/main/java/org/asteriskjava/manager/action/QueueChangePriorityCallerAction.java b/src/main/java/org/asteriskjava/manager/action/QueueChangePriorityCallerAction.java index a0f0ac2e9..9e56a4c90 100644 --- a/src/main/java/org/asteriskjava/manager/action/QueueChangePriorityCallerAction.java +++ b/src/main/java/org/asteriskjava/manager/action/QueueChangePriorityCallerAction.java @@ -1,5 +1,7 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The QueueChangePriorityCallerAction requests to change priority of caller. * Priority cannot be less than 0. diff --git a/src/main/java/org/asteriskjava/manager/action/QueueLogAction.java b/src/main/java/org/asteriskjava/manager/action/QueueLogAction.java index ce72f7a4f..c9630a978 100644 --- a/src/main/java/org/asteriskjava/manager/action/QueueLogAction.java +++ b/src/main/java/org/asteriskjava/manager/action/QueueLogAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The QueueLogAction adds a custom log entry to the queue_log.

* It is implemented in apps/app_queue.c

diff --git a/src/main/java/org/asteriskjava/manager/action/QueueMemberRingInUseAction.java b/src/main/java/org/asteriskjava/manager/action/QueueMemberRingInUseAction.java index 347ffbb74..1708de96a 100644 --- a/src/main/java/org/asteriskjava/manager/action/QueueMemberRingInUseAction.java +++ b/src/main/java/org/asteriskjava/manager/action/QueueMemberRingInUseAction.java @@ -1,5 +1,7 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The QueueMemberRingInUseAction requests to change RingInUse value of queue member. */ diff --git a/src/main/java/org/asteriskjava/manager/action/QueuePauseAction.java b/src/main/java/org/asteriskjava/manager/action/QueuePauseAction.java index 654d5520c..0c8372cfc 100644 --- a/src/main/java/org/asteriskjava/manager/action/QueuePauseAction.java +++ b/src/main/java/org/asteriskjava/manager/action/QueuePauseAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The QueuePauseAction makes a queue member temporarily unavailabe (or * available again).

diff --git a/src/main/java/org/asteriskjava/manager/action/QueuePenaltyAction.java b/src/main/java/org/asteriskjava/manager/action/QueuePenaltyAction.java index 4d3405f16..37a254cdb 100644 --- a/src/main/java/org/asteriskjava/manager/action/QueuePenaltyAction.java +++ b/src/main/java/org/asteriskjava/manager/action/QueuePenaltyAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The QueuePenaltyAction sets the penalty for a queue member.

* It is implemented in apps/app_queue.c

diff --git a/src/main/java/org/asteriskjava/manager/action/QueueRemoveAction.java b/src/main/java/org/asteriskjava/manager/action/QueueRemoveAction.java index b474715f2..7ab93ef01 100644 --- a/src/main/java/org/asteriskjava/manager/action/QueueRemoveAction.java +++ b/src/main/java/org/asteriskjava/manager/action/QueueRemoveAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The QueueRemoveAction removes a member from a queue.

* It is implemented in apps/app_queue.c diff --git a/src/main/java/org/asteriskjava/manager/action/QueueResetAction.java b/src/main/java/org/asteriskjava/manager/action/QueueResetAction.java index c9158d1e3..777584e70 100644 --- a/src/main/java/org/asteriskjava/manager/action/QueueResetAction.java +++ b/src/main/java/org/asteriskjava/manager/action/QueueResetAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The QueueResetAction resets all statistical data of a given queue or all queues.

* It is implemented in apps/app_queue.c

diff --git a/src/main/java/org/asteriskjava/manager/action/QueueStatusAction.java b/src/main/java/org/asteriskjava/manager/action/QueueStatusAction.java index d92958778..7f9bc227a 100644 --- a/src/main/java/org/asteriskjava/manager/action/QueueStatusAction.java +++ b/src/main/java/org/asteriskjava/manager/action/QueueStatusAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.QueueStatusCompleteEvent; import org.asteriskjava.manager.event.ResponseEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/QueueSummaryAction.java b/src/main/java/org/asteriskjava/manager/action/QueueSummaryAction.java index c1a5520ec..12e13d5bf 100644 --- a/src/main/java/org/asteriskjava/manager/action/QueueSummaryAction.java +++ b/src/main/java/org/asteriskjava/manager/action/QueueSummaryAction.java @@ -1,5 +1,6 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.QueueSummaryCompleteEvent; import org.asteriskjava.manager.event.QueueSummaryEvent; import org.asteriskjava.manager.event.ResponseEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/RedirectAction.java b/src/main/java/org/asteriskjava/manager/action/RedirectAction.java index 0632ed4ec..f787beac1 100644 --- a/src/main/java/org/asteriskjava/manager/action/RedirectAction.java +++ b/src/main/java/org/asteriskjava/manager/action/RedirectAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * Redirects a given channel (and an optional additional channel) to a new * extension. diff --git a/src/main/java/org/asteriskjava/manager/action/SendTextAction.java b/src/main/java/org/asteriskjava/manager/action/SendTextAction.java index 8d9ea69d4..48be8e2f5 100644 --- a/src/main/java/org/asteriskjava/manager/action/SendTextAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SendTextAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * Sends a text message to a given channel while in a call. * An active channel and a text message are required in order to success.

diff --git a/src/main/java/org/asteriskjava/manager/action/SetCdrUserFieldAction.java b/src/main/java/org/asteriskjava/manager/action/SetCdrUserFieldAction.java index d9ffcb5e3..3f37408ee 100644 --- a/src/main/java/org/asteriskjava/manager/action/SetCdrUserFieldAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SetCdrUserFieldAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The SetCDRUserFieldAction causes the user field of the call detail record for * the given channel to be changed.

diff --git a/src/main/java/org/asteriskjava/manager/action/SetVarAction.java b/src/main/java/org/asteriskjava/manager/action/SetVarAction.java index 120e996ac..e3fde9d88 100644 --- a/src/main/java/org/asteriskjava/manager/action/SetVarAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SetVarAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The SetVarAction sets the value of a global or local channel variable.

* Setting global variables is supported since Asterisk 1.2. diff --git a/src/main/java/org/asteriskjava/manager/action/ShowDialplanAction.java b/src/main/java/org/asteriskjava/manager/action/ShowDialplanAction.java index d7b96f85b..a9c30f381 100644 --- a/src/main/java/org/asteriskjava/manager/action/ShowDialplanAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ShowDialplanAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.ResponseEvent; import org.asteriskjava.manager.event.ShowDialplanCompleteEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/SipNotifyAction.java b/src/main/java/org/asteriskjava/manager/action/SipNotifyAction.java index 13cef02dc..b5a4097ef 100644 --- a/src/main/java/org/asteriskjava/manager/action/SipNotifyAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SipNotifyAction.java @@ -1,5 +1,7 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + import java.util.LinkedHashMap; import java.util.Map; diff --git a/src/main/java/org/asteriskjava/manager/action/SipPeersAction.java b/src/main/java/org/asteriskjava/manager/action/SipPeersAction.java index 212ea7e89..1f2dcae26 100644 --- a/src/main/java/org/asteriskjava/manager/action/SipPeersAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SipPeersAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.PeerlistCompleteEvent; import org.asteriskjava.manager.event.ResponseEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/SipShowPeerAction.java b/src/main/java/org/asteriskjava/manager/action/SipShowPeerAction.java index 6c6428c3f..9334bbcdc 100644 --- a/src/main/java/org/asteriskjava/manager/action/SipShowPeerAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SipShowPeerAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.ExpectedResponse; import org.asteriskjava.manager.response.SipShowPeerResponse; diff --git a/src/main/java/org/asteriskjava/manager/action/SipShowRegistryAction.java b/src/main/java/org/asteriskjava/manager/action/SipShowRegistryAction.java index 2809e83d4..af96baaec 100644 --- a/src/main/java/org/asteriskjava/manager/action/SipShowRegistryAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SipShowRegistryAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.RegistrationsCompleteEvent; import org.asteriskjava.manager.event.RegistryEntryEvent; import org.asteriskjava.manager.event.ResponseEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/SkypeAccountPropertyAction.java b/src/main/java/org/asteriskjava/manager/action/SkypeAccountPropertyAction.java index e3367485e..5d30c33a3 100644 --- a/src/main/java/org/asteriskjava/manager/action/SkypeAccountPropertyAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SkypeAccountPropertyAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/org/asteriskjava/manager/action/SkypeAddBuddyAction.java b/src/main/java/org/asteriskjava/manager/action/SkypeAddBuddyAction.java index dacea3a9f..90cb1330b 100644 --- a/src/main/java/org/asteriskjava/manager/action/SkypeAddBuddyAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SkypeAddBuddyAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The SkypeAddBuddyAction adds a buddy to the buddy list of a Skype for Asterisk user.

* Available with Skype for Asterisk. diff --git a/src/main/java/org/asteriskjava/manager/action/SkypeBuddiesAction.java b/src/main/java/org/asteriskjava/manager/action/SkypeBuddiesAction.java index f7610ba07..292a39ae0 100644 --- a/src/main/java/org/asteriskjava/manager/action/SkypeBuddiesAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SkypeBuddiesAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.ResponseEvent; import org.asteriskjava.manager.event.SkypeBuddyListCompleteEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/SkypeBuddyAction.java b/src/main/java/org/asteriskjava/manager/action/SkypeBuddyAction.java index a45acc1f2..f08895dc7 100644 --- a/src/main/java/org/asteriskjava/manager/action/SkypeBuddyAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SkypeBuddyAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.ExpectedResponse; import org.asteriskjava.manager.response.SkypeBuddyResponse; diff --git a/src/main/java/org/asteriskjava/manager/action/SkypeChatSendAction.java b/src/main/java/org/asteriskjava/manager/action/SkypeChatSendAction.java index 76a961bd0..5454308bb 100644 --- a/src/main/java/org/asteriskjava/manager/action/SkypeChatSendAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SkypeChatSendAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The SkypeChatSendAction sends a Skype Chat message to a buddy of a Skype for Asterisk user.

* Available with Skype for Asterisk. diff --git a/src/main/java/org/asteriskjava/manager/action/SkypeLicenseListAction.java b/src/main/java/org/asteriskjava/manager/action/SkypeLicenseListAction.java index c8787a7e3..490c7c5ea 100644 --- a/src/main/java/org/asteriskjava/manager/action/SkypeLicenseListAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SkypeLicenseListAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.ResponseEvent; import org.asteriskjava.manager.event.SkypeBuddyListCompleteEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/SkypeLicenseStatusAction.java b/src/main/java/org/asteriskjava/manager/action/SkypeLicenseStatusAction.java index 87aff086c..63f4281b7 100644 --- a/src/main/java/org/asteriskjava/manager/action/SkypeLicenseStatusAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SkypeLicenseStatusAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.ExpectedResponse; import org.asteriskjava.manager.response.SkypeLicenseStatusResponse; diff --git a/src/main/java/org/asteriskjava/manager/action/SkypeRemoveBuddyAction.java b/src/main/java/org/asteriskjava/manager/action/SkypeRemoveBuddyAction.java index 80fce7212..4cdfb517c 100644 --- a/src/main/java/org/asteriskjava/manager/action/SkypeRemoveBuddyAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SkypeRemoveBuddyAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The SkypeRemoveBuddyAction removes a buddy from the buddy list of a Skype for Asterisk user.

* Available with Skype for Asterisk. diff --git a/src/main/java/org/asteriskjava/manager/action/StatusAction.java b/src/main/java/org/asteriskjava/manager/action/StatusAction.java index a3e728d58..f353165db 100644 --- a/src/main/java/org/asteriskjava/manager/action/StatusAction.java +++ b/src/main/java/org/asteriskjava/manager/action/StatusAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.ResponseEvent; import org.asteriskjava.manager.event.StatusCompleteEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/StopMixMonitorAction.java b/src/main/java/org/asteriskjava/manager/action/StopMixMonitorAction.java index 5e5047f19..12b1cb188 100644 --- a/src/main/java/org/asteriskjava/manager/action/StopMixMonitorAction.java +++ b/src/main/java/org/asteriskjava/manager/action/StopMixMonitorAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * Stop the specified MixMonitor on the specified channel. *

diff --git a/src/main/java/org/asteriskjava/manager/action/StopMonitorAction.java b/src/main/java/org/asteriskjava/manager/action/StopMonitorAction.java index 5e5ca8c37..a8e718a4d 100644 --- a/src/main/java/org/asteriskjava/manager/action/StopMonitorAction.java +++ b/src/main/java/org/asteriskjava/manager/action/StopMonitorAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The StopMonitorAction ends monitoring (recording) a channel.

* It is implemented in res/res_monitor.c diff --git a/src/main/java/org/asteriskjava/manager/action/UnpauseMonitorAction.java b/src/main/java/org/asteriskjava/manager/action/UnpauseMonitorAction.java index 62821291d..304b0013e 100644 --- a/src/main/java/org/asteriskjava/manager/action/UnpauseMonitorAction.java +++ b/src/main/java/org/asteriskjava/manager/action/UnpauseMonitorAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The PauseMonitorAction re-enables monitoring (recording) of a channel after * calling PauseMonitor. diff --git a/src/main/java/org/asteriskjava/manager/action/UpdateConfigAction.java b/src/main/java/org/asteriskjava/manager/action/UpdateConfigAction.java index f3fd0ad43..637b3e237 100644 --- a/src/main/java/org/asteriskjava/manager/action/UpdateConfigAction.java +++ b/src/main/java/org/asteriskjava/manager/action/UpdateConfigAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/org/asteriskjava/manager/action/UserEventAction.java b/src/main/java/org/asteriskjava/manager/action/UserEventAction.java index f9131a5f7..f145380d7 100644 --- a/src/main/java/org/asteriskjava/manager/action/UserEventAction.java +++ b/src/main/java/org/asteriskjava/manager/action/UserEventAction.java @@ -1,5 +1,6 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.UserEvent; /** diff --git a/src/main/java/org/asteriskjava/manager/action/VoicemailUsersListAction.java b/src/main/java/org/asteriskjava/manager/action/VoicemailUsersListAction.java index 247c97350..8a5bd4d68 100644 --- a/src/main/java/org/asteriskjava/manager/action/VoicemailUsersListAction.java +++ b/src/main/java/org/asteriskjava/manager/action/VoicemailUsersListAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.ResponseEvent; import org.asteriskjava.manager.event.VoicemailUserEntryCompleteEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/ZapDialOffhookAction.java b/src/main/java/org/asteriskjava/manager/action/ZapDialOffhookAction.java index d561a0a3c..93b4aad2f 100644 --- a/src/main/java/org/asteriskjava/manager/action/ZapDialOffhookAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ZapDialOffhookAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The ZapDialOffhookAction dials a number on a zap channel while offhook. * diff --git a/src/main/java/org/asteriskjava/manager/action/ZapDndOffAction.java b/src/main/java/org/asteriskjava/manager/action/ZapDndOffAction.java index 4cfb4f386..47be0d29f 100644 --- a/src/main/java/org/asteriskjava/manager/action/ZapDndOffAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ZapDndOffAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The ZapDNDOnAction switches a zap channel "Do Not Disturb" status off. * diff --git a/src/main/java/org/asteriskjava/manager/action/ZapDndOnAction.java b/src/main/java/org/asteriskjava/manager/action/ZapDndOnAction.java index f1c87c33b..0f55cc778 100644 --- a/src/main/java/org/asteriskjava/manager/action/ZapDndOnAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ZapDndOnAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The ZapDNDOnAction switches a zap channel "Do Not Disturb" status on. * diff --git a/src/main/java/org/asteriskjava/manager/action/ZapHangupAction.java b/src/main/java/org/asteriskjava/manager/action/ZapHangupAction.java index ee1a4a15f..29d4e3ed6 100644 --- a/src/main/java/org/asteriskjava/manager/action/ZapHangupAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ZapHangupAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The ZapHangupAction hangs up a zap channel. * diff --git a/src/main/java/org/asteriskjava/manager/action/ZapRestartAction.java b/src/main/java/org/asteriskjava/manager/action/ZapRestartAction.java index 30c3ee96a..fead5d77f 100644 --- a/src/main/java/org/asteriskjava/manager/action/ZapRestartAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ZapRestartAction.java @@ -1,5 +1,7 @@ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * Fully restarts all zaptel channels and terminates any calls on Zap * interfaces. diff --git a/src/main/java/org/asteriskjava/manager/action/ZapShowChannelsAction.java b/src/main/java/org/asteriskjava/manager/action/ZapShowChannelsAction.java index 9ba259fc9..1f04e1913 100644 --- a/src/main/java/org/asteriskjava/manager/action/ZapShowChannelsAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ZapShowChannelsAction.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.event.ResponseEvent; import org.asteriskjava.manager.event.ZapShowChannelsCompleteEvent; diff --git a/src/main/java/org/asteriskjava/manager/action/ZapTransferAction.java b/src/main/java/org/asteriskjava/manager/action/ZapTransferAction.java index e34ceb3dd..d8b693a7e 100644 --- a/src/main/java/org/asteriskjava/manager/action/ZapTransferAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ZapTransferAction.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; + /** * The ZapTransferAction transfers a zap channel. * diff --git a/src/main/java/org/asteriskjava/manager/event/ResponseEvent.java b/src/main/java/org/asteriskjava/manager/event/ResponseEvent.java index cd7f1312a..30e0c4fd4 100644 --- a/src/main/java/org/asteriskjava/manager/event/ResponseEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ResponseEvent.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.event; +import org.asteriskjava.ami.action.ManagerAction; + /** * Abstract base class for events triggered in response to a ManagerAction. *

@@ -24,7 +26,7 @@ * * @author srt * @version $Id$ - * @see org.asteriskjava.manager.action.ManagerAction + * @see ManagerAction */ public abstract class ResponseEvent extends ManagerEvent { private static final long serialVersionUID = 1L; @@ -42,7 +44,7 @@ public ResponseEvent(Object source) { * * @return the action id of the ManagerAction that caused this event or * null if none was set. - * @see org.asteriskjava.manager.action.ManagerAction#setActionId(String) + * @see ManagerAction#setActionId(String) */ public final String getActionId() { return actionId; diff --git a/src/main/java/org/asteriskjava/manager/internal/ActionBuilder.java b/src/main/java/org/asteriskjava/manager/internal/ActionBuilder.java index eb7bd69ba..252bb6a20 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ActionBuilder.java +++ b/src/main/java/org/asteriskjava/manager/internal/ActionBuilder.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.internal; import org.asteriskjava.AsteriskVersion; -import org.asteriskjava.manager.action.ManagerAction; +import org.asteriskjava.ami.action.ManagerAction; /** diff --git a/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java index 77f05d445..fe27e6692 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java @@ -17,8 +17,9 @@ package org.asteriskjava.manager.internal; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.action.ManagerAction; +import org.asteriskjava.core.databind.AsteriskObjectMapper; import org.asteriskjava.manager.AsteriskMapping; -import org.asteriskjava.manager.action.ManagerAction; import org.asteriskjava.manager.action.UserEventAction; import org.asteriskjava.manager.event.UserEvent; import org.asteriskjava.util.Log; @@ -29,6 +30,8 @@ import java.lang.reflect.Method; import java.util.*; +import static org.asteriskjava.core.databind.AsteriskObjectMapper.builder; + /** * Default implementation of the ActionBuilder interface. * @@ -47,6 +50,27 @@ class ActionBuilderImpl implements ActionBuilder { private AsteriskVersion targetVersion; private final Set membersToIgnore = new HashSet<>(); + private final AsteriskObjectMapper asteriskObjectMapper = builder() + .crlfNewlineDelimiter() + .fieldNamesComparator(new ActionFieldsComparator()) + .build(); + + static class ActionFieldsComparator implements Comparator { + @Override + public int compare(String o1, String o2) { + if (o1.equals(o2)) { + return 0; + } + if (o1.equalsIgnoreCase("Action") && o2.equalsIgnoreCase("ActionID") || (o1.equalsIgnoreCase("ActionID") && o2.equalsIgnoreCase("Action"))) { + return 1; + } + if (o1.equalsIgnoreCase("Action") || o1.equalsIgnoreCase("ActionID")) { + return -1; + } + return 1; + } + } + /** * Creates a new ActionBuilder for Asterisk 1.0. */ @@ -73,20 +97,20 @@ public String buildAction(final ManagerAction action) { @SuppressWarnings("unchecked") public String buildAction(final ManagerAction action, final String internalActionId) { + String actionId = internalActionId != null ? ManagerUtil.addInternalActionId(action.getActionId(), internalActionId) : action.getActionId(); + + if (action.getClass().getPackageName().contains("org.asteriskjava.ami.action")) { + return asteriskObjectMapper.writeValue(action); + } + StringBuilder sb = new StringBuilder(); sb.append("action: "); sb.append(action.getAction()); sb.append(LINE_SEPARATOR); - if (internalActionId != null) { - sb.append("actionid: "); - sb.append(ManagerUtil.addInternalActionId(action.getActionId(), internalActionId)); - sb.append(LINE_SEPARATOR); - } else if (action.getActionId() != null) { - sb.append("actionid: "); - sb.append(action.getActionId()); - sb.append(LINE_SEPARATOR); - } + sb.append("actionid: "); + sb.append(actionId); + sb.append(LINE_SEPARATOR); Map getters; @@ -122,7 +146,7 @@ public String buildAction(final ManagerAction action, final String internalActio Map attributes = (Map) value; for (Map.Entry entry : attributes.entrySet()) { appendString(sb, entry.getKey() == null ? "null" : entry.getKey().toString(), - entry.getValue() == null ? "null" : entry.getValue().toString()); + entry.getValue() == null ? "null" : entry.getValue().toString()); } } } @@ -259,7 +283,7 @@ private static String mapToAsterisk(Method getter) { // check annotation of getter method annotation - = getter.getAnnotation(AsteriskMapping.class + = getter.getAnnotation(AsteriskMapping.class ); if (annotation != null) { return annotation.value(); @@ -270,7 +294,7 @@ private static String mapToAsterisk(Method getter) { try { Method setter = getter.getDeclaringClass().getDeclaredMethod(setterName, getter.getReturnType()); annotation - = setter.getAnnotation(AsteriskMapping.class + = setter.getAnnotation(AsteriskMapping.class ); if (annotation != null) { return annotation.value(); @@ -284,7 +308,7 @@ private static String mapToAsterisk(Method getter) { try { Field field = getter.getDeclaringClass().getDeclaredField(fieldName); annotation - = field.getAnnotation(AsteriskMapping.class + = field.getAnnotation(AsteriskMapping.class ); if (annotation != null) { return annotation.value(); @@ -330,6 +354,6 @@ private static String lcFirst(String s) { } return Character.toLowerCase(s.charAt(0)) - + (s.length() == 1 ? "" : s.substring(1)); + + (s.length() == 1 ? "" : s.substring(1)); } } diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index 7cfbb8a7c..fa05c9dd7 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -16,6 +16,7 @@ package org.asteriskjava.manager.internal; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.lock.Lockable; import org.asteriskjava.lock.LockableList; import org.asteriskjava.lock.LockableMap; diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerWriter.java b/src/main/java/org/asteriskjava/manager/internal/ManagerWriter.java index 94d844870..f7c04dccf 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerWriter.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerWriter.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.internal; import org.asteriskjava.AsteriskVersion; -import org.asteriskjava.manager.action.ManagerAction; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.util.SocketConnectionFacade; import java.io.IOException; diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerWriterImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerWriterImpl.java index d1d8f01e1..d94776dc5 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerWriterImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerWriterImpl.java @@ -17,9 +17,9 @@ package org.asteriskjava.manager.internal; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.lock.Lockable; import org.asteriskjava.lock.Locker.LockCloser; -import org.asteriskjava.manager.action.ManagerAction; import org.asteriskjava.util.SocketConnectionFacade; import java.io.IOException; diff --git a/src/main/java/org/asteriskjava/manager/response/ManagerResponse.java b/src/main/java/org/asteriskjava/manager/response/ManagerResponse.java index cb8e5c53c..e8c5b86ac 100644 --- a/src/main/java/org/asteriskjava/manager/response/ManagerResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/ManagerResponse.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.ManagerAction; + import java.io.Serializable; import java.util.Date; import java.util.Locale; @@ -31,7 +33,7 @@ * * @author srt * @version $Id$ - * @see org.asteriskjava.manager.action.ManagerAction + * @see ManagerAction */ public class ManagerResponse implements Serializable { private static final long serialVersionUID = 1L; @@ -131,7 +133,7 @@ public void setDateReceived(Date dateReceived) { * * @return the action id of the ManagerAction that caused this response or * null if none was set. - * @see org.asteriskjava.manager.action.ManagerAction#setActionId(String) + * @see ManagerAction#setActionId(String) */ public String getActionId() { return actionId; diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/BridgeAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/BridgeAction.java index b0bd14a69..650fc4ce5 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/BridgeAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/BridgeAction.java @@ -1,5 +1,6 @@ package org.asteriskjava.pbx.asterisk.wrap.actions; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.pbx.Channel; public class BridgeAction extends AbstractManagerAction { @@ -13,7 +14,7 @@ public BridgeAction(final Channel lhs, final Channel rhs) { } @Override - public org.asteriskjava.manager.action.ManagerAction getAJAction() { + public ManagerAction getAJAction() { final org.asteriskjava.manager.action.BridgeAction action = new org.asteriskjava.manager.action.BridgeAction(); action.setActionId(this.getActionId()); action.setChannel1(this._lhs.getChannelName()); diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/CommandAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/CommandAction.java index 128fa5b44..2b6acb163 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/CommandAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/CommandAction.java @@ -1,5 +1,7 @@ package org.asteriskjava.pbx.asterisk.wrap.actions; +import org.asteriskjava.ami.action.ManagerAction; + public class CommandAction extends AbstractManagerAction { private String _command; @@ -12,7 +14,7 @@ public CommandAction() { } @Override - public org.asteriskjava.manager.action.ManagerAction getAJAction() { + public ManagerAction getAJAction() { final org.asteriskjava.manager.action.CommandAction action = new org.asteriskjava.manager.action.CommandAction(); action.setCommand(this._command); action.setActionId(this.getActionId()); diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/ConfbridgeKickAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/ConfbridgeKickAction.java index 21d813898..b5ef3409d 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/ConfbridgeKickAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/ConfbridgeKickAction.java @@ -1,5 +1,7 @@ package org.asteriskjava.pbx.asterisk.wrap.actions; +import org.asteriskjava.ami.action.ManagerAction; + public class ConfbridgeKickAction extends AbstractManagerAction { private final String channel; @@ -11,7 +13,7 @@ public ConfbridgeKickAction(final String room, String channel) { } @Override - public org.asteriskjava.manager.action.ManagerAction getAJAction() { + public ManagerAction getAJAction() { final org.asteriskjava.manager.action.ConfbridgeKickAction action = new org.asteriskjava.manager.action.ConfbridgeKickAction(); action.setActionId(this.getActionId()); action.setChannel(channel); diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/ConfbridgeListAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/ConfbridgeListAction.java index 7be64573b..4f6ec7938 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/ConfbridgeListAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/ConfbridgeListAction.java @@ -1,6 +1,6 @@ package org.asteriskjava.pbx.asterisk.wrap.actions; -import org.asteriskjava.manager.action.ManagerAction; +import org.asteriskjava.ami.action.ManagerAction; public class ConfbridgeListAction extends AbstractManagerAction implements EventGeneratingAction { diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/DbGetAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/DbGetAction.java index 549cc25d6..06e6648be 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/DbGetAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/DbGetAction.java @@ -1,6 +1,6 @@ package org.asteriskjava.pbx.asterisk.wrap.actions; -import org.asteriskjava.manager.action.ManagerAction; +import org.asteriskjava.ami.action.ManagerAction; public class DbGetAction extends AbstractManagerAction { diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/GetVarAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/GetVarAction.java index 1680df51f..e899b0f39 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/GetVarAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/GetVarAction.java @@ -1,5 +1,6 @@ package org.asteriskjava.pbx.asterisk.wrap.actions; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.pbx.Channel; public class GetVarAction extends AbstractManagerAction { @@ -13,7 +14,7 @@ public GetVarAction(final Channel channel, String variableName) { } @Override - public org.asteriskjava.manager.action.ManagerAction getAJAction() { + public ManagerAction getAJAction() { final org.asteriskjava.manager.action.GetVarAction action = new org.asteriskjava.manager.action.GetVarAction(); action.setActionId(this.getActionId()); action.setChannel(this._channel.getChannelName()); diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/HangupAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/HangupAction.java index bbbcfdc73..3ad525359 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/HangupAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/HangupAction.java @@ -1,5 +1,6 @@ package org.asteriskjava.pbx.asterisk.wrap.actions; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.pbx.Channel; public class HangupAction extends AbstractManagerAction { @@ -12,7 +13,7 @@ public HangupAction(final Channel channel) { } @Override - public org.asteriskjava.manager.action.ManagerAction getAJAction() { + public ManagerAction getAJAction() { final org.asteriskjava.manager.action.HangupAction action = new org.asteriskjava.manager.action.HangupAction(); action.setActionId(this.getActionId()); action.setCause(this._cause); diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/ListCommandsAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/ListCommandsAction.java index df9d7f195..7b0bc324a 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/ListCommandsAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/ListCommandsAction.java @@ -1,9 +1,11 @@ package org.asteriskjava.pbx.asterisk.wrap.actions; +import org.asteriskjava.ami.action.ManagerAction; + public class ListCommandsAction extends AbstractManagerAction { @Override - public org.asteriskjava.manager.action.ManagerAction getAJAction() { + public ManagerAction getAJAction() { final org.asteriskjava.manager.action.ListCommandsAction action = new org.asteriskjava.manager.action.ListCommandsAction(); action.setActionId(this.getActionId()); diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/ManagerAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/ManagerAction.java index 66dd34fbf..6ddf3ecce 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/ManagerAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/ManagerAction.java @@ -3,6 +3,6 @@ public interface ManagerAction { // Converts an iManagerAction into an asterisk-java ManagerAction. - org.asteriskjava.manager.action.ManagerAction getAJAction(); + org.asteriskjava.ami.action.ManagerAction getAJAction(); } diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/MonitorAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/MonitorAction.java index 521a68804..2cb16f786 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/MonitorAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/MonitorAction.java @@ -1,5 +1,6 @@ package org.asteriskjava.pbx.asterisk.wrap.actions; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.pbx.Channel; public class MonitorAction extends AbstractManagerAction { @@ -17,7 +18,7 @@ public MonitorAction(final Channel channel, final String file, final String form } @Override - public org.asteriskjava.manager.action.ManagerAction getAJAction() { + public ManagerAction getAJAction() { final org.asteriskjava.manager.action.MonitorAction action = new org.asteriskjava.manager.action.MonitorAction( this._channel.getChannelName(), this._file, this._format, this._mix); action.setActionId(this.getActionId()); diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/OriginateAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/OriginateAction.java index 75184235c..a822beb16 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/OriginateAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/OriginateAction.java @@ -1,5 +1,6 @@ package org.asteriskjava.pbx.asterisk.wrap.actions; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.pbx.CallerID; import org.asteriskjava.pbx.Channel; import org.asteriskjava.pbx.EndPoint; @@ -47,7 +48,7 @@ public String toString() { } @Override - public org.asteriskjava.manager.action.ManagerAction getAJAction() { + public ManagerAction getAJAction() { final org.asteriskjava.manager.action.OriginateAction action = new org.asteriskjava.manager.action.OriginateAction(); action.setActionId(getActionId()); diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/PingAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/PingAction.java index 9c2e46b02..835001b1d 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/PingAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/PingAction.java @@ -1,9 +1,11 @@ package org.asteriskjava.pbx.asterisk.wrap.actions; +import org.asteriskjava.ami.action.ManagerAction; + public class PingAction extends AbstractManagerAction { @Override - public org.asteriskjava.manager.action.ManagerAction getAJAction() { + public ManagerAction getAJAction() { final org.asteriskjava.manager.action.PingAction action = new org.asteriskjava.manager.action.PingAction(); action.setActionId(this.getActionId()); return action; diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/PlayDtmfAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/PlayDtmfAction.java index 7c0082fc5..b6059bf0f 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/PlayDtmfAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/PlayDtmfAction.java @@ -1,6 +1,6 @@ package org.asteriskjava.pbx.asterisk.wrap.actions; -import org.asteriskjava.manager.action.ManagerAction; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.pbx.Channel; import org.asteriskjava.pbx.DTMFTone; diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/RedirectAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/RedirectAction.java index d2dd82d2f..f9991121d 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/RedirectAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/RedirectAction.java @@ -1,5 +1,6 @@ package org.asteriskjava.pbx.asterisk.wrap.actions; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.pbx.Channel; import org.asteriskjava.pbx.EndPoint; @@ -41,7 +42,7 @@ public String toString() { } @Override - public org.asteriskjava.manager.action.ManagerAction getAJAction() { + public ManagerAction getAJAction() { final org.asteriskjava.manager.action.RedirectAction action = new org.asteriskjava.manager.action.RedirectAction(); action.setActionId(this.getActionId()); action.setChannel(this._channel.getChannelName().toLowerCase()); diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/SetVarAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/SetVarAction.java index 9657f32aa..2928c6c01 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/SetVarAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/SetVarAction.java @@ -1,5 +1,6 @@ package org.asteriskjava.pbx.asterisk.wrap.actions; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.pbx.Channel; public class SetVarAction extends AbstractManagerAction { @@ -15,7 +16,7 @@ public SetVarAction(final Channel channel, final String variableName, final Stri } @Override - public org.asteriskjava.manager.action.ManagerAction getAJAction() { + public ManagerAction getAJAction() { final org.asteriskjava.manager.action.SetVarAction action = new org.asteriskjava.manager.action.SetVarAction(); action.setActionId(this.getActionId()); action.setChannel(this._channel.getChannelName()); diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/SipPeersAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/SipPeersAction.java index 4ff04c8f0..aeb50d200 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/SipPeersAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/SipPeersAction.java @@ -1,12 +1,14 @@ package org.asteriskjava.pbx.asterisk.wrap.actions; +import org.asteriskjava.ami.action.ManagerAction; + public class SipPeersAction extends AbstractManagerAction implements EventGeneratingAction { public SipPeersAction() { } @Override - public org.asteriskjava.manager.action.ManagerAction getAJAction() { + public ManagerAction getAJAction() { return new org.asteriskjava.manager.action.SipPeersAction(); } diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/SipShowPeerAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/SipShowPeerAction.java index 1b524b8e1..84a6646f8 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/SipShowPeerAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/SipShowPeerAction.java @@ -1,6 +1,6 @@ package org.asteriskjava.pbx.asterisk.wrap.actions; -import org.asteriskjava.manager.action.ManagerAction; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.pbx.EndPoint; public class SipShowPeerAction extends AbstractManagerAction { diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/StatusAction.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/StatusAction.java index be7ab9b1f..db257fef8 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/StatusAction.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/actions/StatusAction.java @@ -1,6 +1,7 @@ package org.asteriskjava.pbx.asterisk.wrap.actions; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.pbx.Channel; import org.asteriskjava.pbx.PBXFactory; import org.asteriskjava.pbx.internal.core.AsteriskPBX; @@ -23,7 +24,7 @@ public StatusAction(Channel channel) { this._channel = null; } - public org.asteriskjava.manager.action.ManagerAction getAJAction() { + public ManagerAction getAJAction() { final org.asteriskjava.manager.action.StatusAction action; if (_channel == null) action = new org.asteriskjava.manager.action.StatusAction(); diff --git a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java index 22941bf19..102bd761e 100644 --- a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java +++ b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java @@ -149,8 +149,8 @@ public static ManagerResponse build(org.asteriskjava.manager.response.ManagerRes } - public static org.asteriskjava.manager.action.ManagerAction build(ManagerAction action) { - org.asteriskjava.manager.action.ManagerAction result = null; + public static org.asteriskjava.ami.action.ManagerAction build(ManagerAction action) { + org.asteriskjava.ami.action.ManagerAction result = null; // final Class // target = CoherentEventFactory.mapActions.get(action.getClass()); diff --git a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentManagerConnection.java b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentManagerConnection.java index fd73f2fd8..1b5f39f33 100644 --- a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentManagerConnection.java +++ b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentManagerConnection.java @@ -282,7 +282,7 @@ public static ManagerResponse sendAction(final ManagerAction action, final int t CoherentManagerConnection.getInstance(); if ((CoherentManagerConnection.managerConnection != null) && (CoherentManagerConnection.managerConnection.getState() == ManagerConnectionState.CONNECTED)) { - final org.asteriskjava.manager.action.ManagerAction ajAction = action.getAJAction(); + final org.asteriskjava.ami.action.ManagerAction ajAction = action.getAJAction(); org.asteriskjava.manager.response.ManagerResponse response = CoherentManagerConnection.managerConnection .sendAction(ajAction, timeout); diff --git a/src/test/java/org/asteriskjava/manager/internal/ActionBuilderImplTest.java b/src/test/java/org/asteriskjava/manager/internal/ActionBuilderImplTest.java index a36214a46..c15b17772 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ActionBuilderImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/ActionBuilderImplTest.java @@ -17,6 +17,7 @@ package org.asteriskjava.manager.internal; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.action.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -40,6 +41,7 @@ void testBuildAction() { String actual; myAction = new MyAction(); + myAction.setActionId("id-1"); myAction.setFirstProperty("first value"); myAction.setSecondProperty(2); myAction.setNonPublicProperty("private"); @@ -50,7 +52,7 @@ void testBuildAction() { assertTrue(actual.indexOf("firstproperty: first value\r\n") >= 0, "First property missing"); assertTrue(actual.indexOf("secondproperty: 2\r\n") >= 0, "Second property missing"); assertTrue(actual.endsWith("\r\n\r\n"), "Missing trailing CRNL CRNL"); - assertEquals(61, actual.length(), "Incorrect length"); + assertEquals(77, actual.length(), "Incorrect length"); } @Test @@ -59,6 +61,7 @@ void testBuildActionWithNullValue() { String actual; myAction = new MyAction(); + myAction.setActionId("id-1"); myAction.setFirstProperty("first value"); actual = actionBuilder.buildAction(myAction); @@ -66,7 +69,7 @@ void testBuildActionWithNullValue() { assertTrue(actual.indexOf("action: My\r\n") >= 0, "Action name missing"); assertTrue(actual.indexOf("firstproperty: first value\r\n") >= 0, "First property missing"); assertTrue(actual.endsWith("\r\n\r\n"), "Missing trailing CRNL CRNL"); - assertEquals(42, actual.length(), "Incorrect length"); + assertEquals(58, actual.length(), "Incorrect length"); } @Test diff --git a/src/test/java/org/asteriskjava/manager/internal/AnnotatedAction.java b/src/test/java/org/asteriskjava/manager/internal/AnnotatedAction.java index c68cd2e9c..3c4720a36 100644 --- a/src/test/java/org/asteriskjava/manager/internal/AnnotatedAction.java +++ b/src/test/java/org/asteriskjava/manager/internal/AnnotatedAction.java @@ -16,8 +16,8 @@ */ package org.asteriskjava.manager.internal; +import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.manager.AsteriskMapping; -import org.asteriskjava.manager.action.AbstractManagerAction; public class AnnotatedAction extends AbstractManagerAction { private static final long serialVersionUID = 1L; diff --git a/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java b/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java index 6dedf480c..c76011b8d 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java @@ -17,10 +17,10 @@ package org.asteriskjava.manager.internal; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.manager.action.ChallengeAction; import org.asteriskjava.manager.action.LoginAction; import org.asteriskjava.manager.action.LogoffAction; -import org.asteriskjava.manager.action.ManagerAction; import org.asteriskjava.manager.event.ProtocolIdentifierReceivedEvent; import org.asteriskjava.manager.response.ChallengeResponse; import org.asteriskjava.manager.response.ManagerError; From 2082a0e50b4bd9b6298fbdbaffef4de83fd57661 Mon Sep 17 00:00:00 2001 From: Piotr Olaszewski Date: Tue, 28 Nov 2023 17:06:20 +0100 Subject: [PATCH 02/10] Move ExpectedResponse and ManagerResponse --- .../action/annotation/ExpectedResponse.java | 41 +++++++++++++++++++ .../ami/action}/response/ManagerResponse.java | 37 ++++++++--------- .../fastagi/internal/AsyncAgiWriter.java | 2 +- .../live/internal/AsteriskChannelImpl.java | 2 +- .../internal/AsteriskQueueMemberImpl.java | 2 +- .../live/internal/AsteriskServerImpl.java | 1 + .../live/internal/MeetMeManager.java | 2 +- .../manager/DefaultManagerConnection.java | 2 +- .../manager/ExpectedResponse.java | 23 ----------- .../manager/ManagerConnection.java | 4 +- .../org/asteriskjava/manager/PingThread.java | 2 +- .../asteriskjava/manager/ResponseEvents.java | 4 +- .../manager/SendActionCallback.java | 2 +- .../SendEventGeneratingActionCallback.java | 2 +- .../manager/action/ChallengeAction.java | 2 +- .../manager/action/CommandAction.java | 2 +- .../manager/action/CoreSettingsAction.java | 2 +- .../manager/action/CoreStatusAction.java | 2 +- .../manager/action/ExecAction.java | 2 +- .../manager/action/ExtensionStateAction.java | 2 +- .../manager/action/GetConfigAction.java | 2 +- .../manager/action/GetVarAction.java | 7 ++-- .../manager/action/ListCommandsAction.java | 3 +- .../manager/action/MailboxCountAction.java | 2 +- .../manager/action/MailboxStatusAction.java | 2 +- .../manager/action/MixMonitorAction.java | 2 +- .../manager/action/ModuleCheckAction.java | 2 +- .../manager/action/PingAction.java | 2 +- .../manager/action/SipShowPeerAction.java | 5 ++- .../manager/action/SkypeBuddyAction.java | 2 +- .../action/SkypeLicenseStatusAction.java | 2 +- .../manager/internal/AsyncEventPump.java | 2 +- .../manager/internal/Dispatcher.java | 2 +- .../internal/ManagerConnectionImpl.java | 7 +++- .../manager/internal/ManagerReader.java | 2 +- .../manager/internal/ManagerReaderImpl.java | 2 +- .../manager/internal/ResponseBuilder.java | 4 +- .../manager/internal/ResponseBuilderImpl.java | 4 +- .../manager/internal/ResponseEventsImpl.java | 2 +- .../manager/response/ChallengeResponse.java | 2 + .../manager/response/CommandResponse.java | 2 + .../response/CoreSettingsResponse.java | 2 + .../manager/response/CoreStatusResponse.java | 1 + .../response/ExtensionStateResponse.java | 2 + .../manager/response/GetConfigResponse.java | 2 + .../manager/response/GetVarResponse.java | 2 + .../response/MailboxCountResponse.java | 2 + .../response/MailboxStatusResponse.java | 2 + .../manager/response/ManagerError.java | 2 + .../manager/response/MixMonitorResponse.java | 2 + .../manager/response/ModuleCheckResponse.java | 2 + .../manager/response/PingResponse.java | 2 + .../manager/response/SipShowPeerResponse.java | 2 + .../manager/response/SkypeBuddyResponse.java | 2 + .../response/SkypeLicenseStatusResponse.java | 2 + .../manager/util/EventAttributesHelper.java | 2 +- .../wrap/response/CommandResponse.java | 2 +- .../asterisk/wrap/response/ManagerError.java | 4 +- .../wrap/response/ManagerResponse.java | 2 +- .../internal/core/CoherentEventFactory.java | 2 +- .../core/CoherentManagerConnection.java | 2 +- .../internal/ManagerConnectionImplTest.java | 2 +- .../internal/ManagerReaderImplTest.java | 2 +- .../manager/internal/ManagerReaderMock.java | 2 +- .../manager/internal/ManagerWriterMock.java | 2 +- .../internal/ResponseBuilderImplTest.java | 1 + 66 files changed, 154 insertions(+), 94 deletions(-) create mode 100644 asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/annotation/ExpectedResponse.java rename {src/main/java/org/asteriskjava/manager => asterisk-java-ami/src/main/java/org/asteriskjava/ami/action}/response/ManagerResponse.java (89%) delete mode 100644 src/main/java/org/asteriskjava/manager/ExpectedResponse.java diff --git a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/annotation/ExpectedResponse.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/annotation/ExpectedResponse.java new file mode 100644 index 000000000..c1000a678 --- /dev/null +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/annotation/ExpectedResponse.java @@ -0,0 +1,41 @@ +/* + * Copyright 2004-2023 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.ami.action.annotation; + +import org.asteriskjava.ami.action.ManagerAction; +import org.asteriskjava.ami.action.response.ManagerResponse; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * Indicates that an annotated {@link ManagerAction} expects a specific subclass of {@link ManagerResponse} when + * executed successfully. + * + * @author Stefan Reuter + * @since 1.0.0 + */ +@Target(TYPE) +@Retention(RUNTIME) +public @interface ExpectedResponse { + /** + * {@link ManagerResponse} subclass, to handle {@link ManagerAction} response. + */ + Class value(); +} diff --git a/src/main/java/org/asteriskjava/manager/response/ManagerResponse.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ManagerResponse.java similarity index 89% rename from src/main/java/org/asteriskjava/manager/response/ManagerResponse.java rename to asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ManagerResponse.java index e8c5b86ac..d45fae97e 100644 --- a/src/main/java/org/asteriskjava/manager/response/ManagerResponse.java +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ManagerResponse.java @@ -1,41 +1,40 @@ /* - * Copyright 2004-2006 Stefan Reuter + * Copyright 2004-2023 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.response; +package org.asteriskjava.ami.action.response; import org.asteriskjava.ami.action.ManagerAction; +import java.io.Serial; import java.io.Serializable; import java.util.Date; import java.util.Locale; import java.util.Map; /** - * Represents a response received from the Asterisk server as the result of a - * previously sent ManagerAction. + * Represents a response received from the Asterisk server as the result of a previously sent {@link ManagerAction}. *

- * The response can be linked with the action that caused it by looking the - * action id attribute that will match the action id of the corresponding - * action. + * The response can be linked with the action that caused it by looking at the {@code ActionID} attribute, which will + * match the action id of the corresponding action. * - * @author srt - * @version $Id$ + * @author Stefan Reuter * @see ManagerAction + * @since 1.0.0 */ public class ManagerResponse implements Serializable { + @Serial private static final long serialVersionUID = 1L; private Date dateReceived; diff --git a/src/main/java/org/asteriskjava/fastagi/internal/AsyncAgiWriter.java b/src/main/java/org/asteriskjava/fastagi/internal/AsyncAgiWriter.java index bfe44849e..8966b6972 100644 --- a/src/main/java/org/asteriskjava/fastagi/internal/AsyncAgiWriter.java +++ b/src/main/java/org/asteriskjava/fastagi/internal/AsyncAgiWriter.java @@ -1,5 +1,6 @@ package org.asteriskjava.fastagi.internal; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.fastagi.AgiException; import org.asteriskjava.fastagi.AgiWriter; import org.asteriskjava.fastagi.command.AgiCommand; @@ -7,7 +8,6 @@ import org.asteriskjava.manager.TimeoutException; import org.asteriskjava.manager.action.AgiAction; import org.asteriskjava.manager.response.ManagerError; -import org.asteriskjava.manager.response.ManagerResponse; import java.io.IOException; diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java index ff1015708..c09b96128 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java @@ -16,13 +16,13 @@ */ package org.asteriskjava.live.internal; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.live.*; import org.asteriskjava.lock.LockableList; import org.asteriskjava.lock.LockableMap; import org.asteriskjava.lock.Locker.LockCloser; import org.asteriskjava.manager.action.*; import org.asteriskjava.manager.response.ManagerError; -import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.util.MixMonitorDirection; import java.util.*; diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java index e37a44f61..734bba59c 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java @@ -16,12 +16,12 @@ */ package org.asteriskjava.live.internal; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.live.*; import org.asteriskjava.lock.Locker.LockCloser; import org.asteriskjava.manager.action.QueuePauseAction; import org.asteriskjava.manager.action.QueuePenaltyAction; import org.asteriskjava.manager.response.ManagerError; -import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.util.AstUtil; /** diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index 7dd4332ee..8cfc2b05a 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -18,6 +18,7 @@ import org.asteriskjava.AsteriskVersion; import org.asteriskjava.ami.action.ManagerAction; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.config.ConfigFile; import org.asteriskjava.live.*; import org.asteriskjava.lock.Lockable; diff --git a/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java b/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java index 42f2230cc..5aa1e4437 100644 --- a/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java +++ b/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.live.internal; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.live.ManagerCommunicationException; import org.asteriskjava.live.MeetMeRoom; import org.asteriskjava.lock.LockableMap; @@ -27,7 +28,6 @@ import org.asteriskjava.manager.event.MeetMeTalkingEvent; import org.asteriskjava.manager.response.CommandResponse; import org.asteriskjava.manager.response.ManagerError; -import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.util.DateUtil; import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; diff --git a/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java b/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java index 7f31bbf9c..7a1cfe5b5 100644 --- a/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java +++ b/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java @@ -18,10 +18,10 @@ import org.asteriskjava.AsteriskVersion; import org.asteriskjava.ami.action.ManagerAction; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.manager.action.EventGeneratingAction; import org.asteriskjava.manager.event.ManagerEvent; import org.asteriskjava.manager.internal.ManagerConnectionImpl; -import org.asteriskjava.manager.response.ManagerResponse; import java.io.IOException; import java.net.InetAddress; diff --git a/src/main/java/org/asteriskjava/manager/ExpectedResponse.java b/src/main/java/org/asteriskjava/manager/ExpectedResponse.java deleted file mode 100644 index b91cddb68..000000000 --- a/src/main/java/org/asteriskjava/manager/ExpectedResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.asteriskjava.manager; - -import org.asteriskjava.ami.action.ManagerAction; -import org.asteriskjava.manager.response.ManagerResponse; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -/** - * Indicates that an annotated {@link ManagerAction} expects - * a specific subclass of {@link org.asteriskjava.manager.response.ManagerResponse} when executed - * successfully. - * - * @since 1.0.0 - */ -@Target(TYPE) -@Retention(RUNTIME) -public @interface ExpectedResponse { - Class value(); -} diff --git a/src/main/java/org/asteriskjava/manager/ManagerConnection.java b/src/main/java/org/asteriskjava/manager/ManagerConnection.java index d611f9b18..e67231496 100644 --- a/src/main/java/org/asteriskjava/manager/ManagerConnection.java +++ b/src/main/java/org/asteriskjava/manager/ManagerConnection.java @@ -18,9 +18,9 @@ import org.asteriskjava.AsteriskVersion; import org.asteriskjava.ami.action.ManagerAction; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.manager.action.EventGeneratingAction; import org.asteriskjava.manager.event.ManagerEvent; -import org.asteriskjava.manager.response.ManagerResponse; import java.io.IOException; import java.net.InetAddress; @@ -32,7 +32,7 @@ *

* The ManagerConnection repesents a connection to an Asterisk server and is * capable of sending {@link ManagerAction}s and - * receiving {@link org.asteriskjava.manager.response.ManagerResponse}s and + * receiving {@link ManagerResponse}s and * {@link org.asteriskjava.manager.event.ManagerEvent}s. It does not add any * further functionality but rather provides a Java view to Asterisk's Manager * API (freeing you from TCP/IP connection and parsing stuff). diff --git a/src/main/java/org/asteriskjava/manager/PingThread.java b/src/main/java/org/asteriskjava/manager/PingThread.java index 862f882be..f7c599515 100644 --- a/src/main/java/org/asteriskjava/manager/PingThread.java +++ b/src/main/java/org/asteriskjava/manager/PingThread.java @@ -16,10 +16,10 @@ */ package org.asteriskjava.manager; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.lock.LockableSet; import org.asteriskjava.lock.Locker.LockCloser; import org.asteriskjava.manager.action.PingAction; -import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; diff --git a/src/main/java/org/asteriskjava/manager/ResponseEvents.java b/src/main/java/org/asteriskjava/manager/ResponseEvents.java index a271d733f..bd4628797 100644 --- a/src/main/java/org/asteriskjava/manager/ResponseEvents.java +++ b/src/main/java/org/asteriskjava/manager/ResponseEvents.java @@ -16,8 +16,8 @@ */ package org.asteriskjava.manager; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.manager.event.ResponseEvent; -import org.asteriskjava.manager.response.ManagerResponse; import java.util.Collection; @@ -25,7 +25,7 @@ /** * Contains the result of executing an * {@link org.asteriskjava.manager.action.EventGeneratingAction}, that is the - * {@link org.asteriskjava.manager.response.ManagerResponse} and any received + * {@link ManagerResponse} and any received * {@link org.asteriskjava.manager.event.ManagerEvent}s. * * @author srt diff --git a/src/main/java/org/asteriskjava/manager/SendActionCallback.java b/src/main/java/org/asteriskjava/manager/SendActionCallback.java index 37d554699..07b21a579 100644 --- a/src/main/java/org/asteriskjava/manager/SendActionCallback.java +++ b/src/main/java/org/asteriskjava/manager/SendActionCallback.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager; import org.asteriskjava.ami.action.ManagerAction; -import org.asteriskjava.manager.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerResponse; /** * Callback interface to send {@link ManagerAction}s diff --git a/src/main/java/org/asteriskjava/manager/SendEventGeneratingActionCallback.java b/src/main/java/org/asteriskjava/manager/SendEventGeneratingActionCallback.java index 528e7d643..96e203824 100644 --- a/src/main/java/org/asteriskjava/manager/SendEventGeneratingActionCallback.java +++ b/src/main/java/org/asteriskjava/manager/SendEventGeneratingActionCallback.java @@ -1,7 +1,7 @@ package org.asteriskjava.manager; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.manager.response.ManagerError; -import org.asteriskjava.manager.response.ManagerResponse; /** * Callback interface to send diff --git a/src/main/java/org/asteriskjava/manager/action/ChallengeAction.java b/src/main/java/org/asteriskjava/manager/action/ChallengeAction.java index 357a45bf3..2c2ef6a4f 100644 --- a/src/main/java/org/asteriskjava/manager/action/ChallengeAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ChallengeAction.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; import org.asteriskjava.manager.response.ChallengeResponse; /** diff --git a/src/main/java/org/asteriskjava/manager/action/CommandAction.java b/src/main/java/org/asteriskjava/manager/action/CommandAction.java index 3d0f36b7e..9e90ef49f 100644 --- a/src/main/java/org/asteriskjava/manager/action/CommandAction.java +++ b/src/main/java/org/asteriskjava/manager/action/CommandAction.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; import org.asteriskjava.manager.response.CommandResponse; /** diff --git a/src/main/java/org/asteriskjava/manager/action/CoreSettingsAction.java b/src/main/java/org/asteriskjava/manager/action/CoreSettingsAction.java index e315f0888..b16db8980 100644 --- a/src/main/java/org/asteriskjava/manager/action/CoreSettingsAction.java +++ b/src/main/java/org/asteriskjava/manager/action/CoreSettingsAction.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; import org.asteriskjava.manager.response.CoreSettingsResponse; /** diff --git a/src/main/java/org/asteriskjava/manager/action/CoreStatusAction.java b/src/main/java/org/asteriskjava/manager/action/CoreStatusAction.java index a05f29e6a..fc90e99dc 100644 --- a/src/main/java/org/asteriskjava/manager/action/CoreStatusAction.java +++ b/src/main/java/org/asteriskjava/manager/action/CoreStatusAction.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; import org.asteriskjava.manager.response.CoreStatusResponse; /** diff --git a/src/main/java/org/asteriskjava/manager/action/ExecAction.java b/src/main/java/org/asteriskjava/manager/action/ExecAction.java index d623428cc..ae74418e1 100644 --- a/src/main/java/org/asteriskjava/manager/action/ExecAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ExecAction.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; import org.asteriskjava.manager.response.CommandResponse; /** diff --git a/src/main/java/org/asteriskjava/manager/action/ExtensionStateAction.java b/src/main/java/org/asteriskjava/manager/action/ExtensionStateAction.java index 45ec6984a..2524303c4 100644 --- a/src/main/java/org/asteriskjava/manager/action/ExtensionStateAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ExtensionStateAction.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; import org.asteriskjava.manager.response.ExtensionStateResponse; /** diff --git a/src/main/java/org/asteriskjava/manager/action/GetConfigAction.java b/src/main/java/org/asteriskjava/manager/action/GetConfigAction.java index 51671e747..36f18b6e8 100644 --- a/src/main/java/org/asteriskjava/manager/action/GetConfigAction.java +++ b/src/main/java/org/asteriskjava/manager/action/GetConfigAction.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; import org.asteriskjava.manager.response.GetConfigResponse; /** diff --git a/src/main/java/org/asteriskjava/manager/action/GetVarAction.java b/src/main/java/org/asteriskjava/manager/action/GetVarAction.java index fe42071da..df98673bf 100644 --- a/src/main/java/org/asteriskjava/manager/action/GetVarAction.java +++ b/src/main/java/org/asteriskjava/manager/action/GetVarAction.java @@ -17,7 +17,8 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.manager.response.GetVarResponse; /** @@ -32,8 +33,8 @@ * the Manager API itself.

* GetVarAction returns a {@link org.asteriskjava.manager.response.GetVarResponse}. * To get the actual value from the corresponding - * {@link org.asteriskjava.manager.response.ManagerResponse} call - * {@link org.asteriskjava.manager.response.ManagerResponse#getAttribute(String)} + * {@link ManagerResponse} call + * {@link ManagerResponse#getAttribute(String)} * with either the variable name as parameter (for Asterisk 1.0.x) or * with "Value" as parameter (for Asterisk since 1.2).

* Example (for Asterisk 1.2):

diff --git a/src/main/java/org/asteriskjava/manager/action/ListCommandsAction.java b/src/main/java/org/asteriskjava/manager/action/ListCommandsAction.java index 182a358e9..2052012f8 100644 --- a/src/main/java/org/asteriskjava/manager/action/ListCommandsAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ListCommandsAction.java @@ -17,6 +17,7 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; +import org.asteriskjava.ami.action.response.ManagerResponse; /** * The ListCommandsAction returns possible commands in the Manager interface. @@ -24,7 +25,7 @@ * Use the getAttributes method on the ManagerResponse for a map of commands and explanations. * * @author martins - * @see org.asteriskjava.manager.response.ManagerResponse#getAttributes() + * @see ManagerResponse#getAttributes() * @since 0.3 */ public class ListCommandsAction extends AbstractManagerAction { diff --git a/src/main/java/org/asteriskjava/manager/action/MailboxCountAction.java b/src/main/java/org/asteriskjava/manager/action/MailboxCountAction.java index 0fdec87d1..28c5a6dba 100644 --- a/src/main/java/org/asteriskjava/manager/action/MailboxCountAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MailboxCountAction.java @@ -6,7 +6,7 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; import org.asteriskjava.manager.response.MailboxCountResponse; /** diff --git a/src/main/java/org/asteriskjava/manager/action/MailboxStatusAction.java b/src/main/java/org/asteriskjava/manager/action/MailboxStatusAction.java index 3fe34cdf2..39a674b47 100644 --- a/src/main/java/org/asteriskjava/manager/action/MailboxStatusAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MailboxStatusAction.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; import org.asteriskjava.manager.response.MailboxStatusResponse; /** diff --git a/src/main/java/org/asteriskjava/manager/action/MixMonitorAction.java b/src/main/java/org/asteriskjava/manager/action/MixMonitorAction.java index 63303bc37..e92a41a94 100644 --- a/src/main/java/org/asteriskjava/manager/action/MixMonitorAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MixMonitorAction.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; import org.asteriskjava.manager.response.MixMonitorResponse; /** diff --git a/src/main/java/org/asteriskjava/manager/action/ModuleCheckAction.java b/src/main/java/org/asteriskjava/manager/action/ModuleCheckAction.java index dce93732d..4f4890822 100644 --- a/src/main/java/org/asteriskjava/manager/action/ModuleCheckAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ModuleCheckAction.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; import org.asteriskjava.manager.response.ModuleCheckResponse; /** diff --git a/src/main/java/org/asteriskjava/manager/action/PingAction.java b/src/main/java/org/asteriskjava/manager/action/PingAction.java index 236e90a0a..97fecb8dd 100644 --- a/src/main/java/org/asteriskjava/manager/action/PingAction.java +++ b/src/main/java/org/asteriskjava/manager/action/PingAction.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; import org.asteriskjava.manager.response.PingResponse; /** diff --git a/src/main/java/org/asteriskjava/manager/action/SipShowPeerAction.java b/src/main/java/org/asteriskjava/manager/action/SipShowPeerAction.java index 9334bbcdc..6036b513b 100644 --- a/src/main/java/org/asteriskjava/manager/action/SipShowPeerAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SipShowPeerAction.java @@ -17,13 +17,14 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.manager.response.SipShowPeerResponse; /** * Retrieves a the details about a given SIP peer.

* The result is returned in the response received in reply to this action.

- * Use {@link org.asteriskjava.manager.response.ManagerResponse#getAttribute(String)} + * Use {@link ManagerResponse#getAttribute(String)} * to retrieve the properties. Consider using {@link org.asteriskjava.manager.action.SipPeersAction} * instead.

* Available since Asterisk 1.2 diff --git a/src/main/java/org/asteriskjava/manager/action/SkypeBuddyAction.java b/src/main/java/org/asteriskjava/manager/action/SkypeBuddyAction.java index f08895dc7..b0a9ffdb5 100644 --- a/src/main/java/org/asteriskjava/manager/action/SkypeBuddyAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SkypeBuddyAction.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; import org.asteriskjava.manager.response.SkypeBuddyResponse; /** diff --git a/src/main/java/org/asteriskjava/manager/action/SkypeLicenseStatusAction.java b/src/main/java/org/asteriskjava/manager/action/SkypeLicenseStatusAction.java index 63f4281b7..0516c56df 100644 --- a/src/main/java/org/asteriskjava/manager/action/SkypeLicenseStatusAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SkypeLicenseStatusAction.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; import org.asteriskjava.manager.response.SkypeLicenseStatusResponse; /** diff --git a/src/main/java/org/asteriskjava/manager/internal/AsyncEventPump.java b/src/main/java/org/asteriskjava/manager/internal/AsyncEventPump.java index d17b6ae4c..2eed9df38 100644 --- a/src/main/java/org/asteriskjava/manager/internal/AsyncEventPump.java +++ b/src/main/java/org/asteriskjava/manager/internal/AsyncEventPump.java @@ -1,9 +1,9 @@ package org.asteriskjava.manager.internal; import com.google.common.util.concurrent.RateLimiter; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.lock.Locker; import org.asteriskjava.manager.event.ManagerEvent; -import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.pbx.util.LogTime; import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; diff --git a/src/main/java/org/asteriskjava/manager/internal/Dispatcher.java b/src/main/java/org/asteriskjava/manager/internal/Dispatcher.java index 95f36efe0..c941a8d2b 100644 --- a/src/main/java/org/asteriskjava/manager/internal/Dispatcher.java +++ b/src/main/java/org/asteriskjava/manager/internal/Dispatcher.java @@ -16,8 +16,8 @@ */ package org.asteriskjava.manager.internal; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.manager.event.ManagerEvent; -import org.asteriskjava.manager.response.ManagerResponse; /** * The Dispatcher defines the interface used for communication between diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index fa05c9dd7..9be1b46bd 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -17,6 +17,8 @@ import org.asteriskjava.AsteriskVersion; import org.asteriskjava.ami.action.ManagerAction; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.lock.Lockable; import org.asteriskjava.lock.LockableList; import org.asteriskjava.lock.LockableMap; @@ -24,7 +26,10 @@ import org.asteriskjava.manager.*; import org.asteriskjava.manager.action.*; import org.asteriskjava.manager.event.*; -import org.asteriskjava.manager.response.*; +import org.asteriskjava.manager.response.ChallengeResponse; +import org.asteriskjava.manager.response.CommandResponse; +import org.asteriskjava.manager.response.CoreSettingsResponse; +import org.asteriskjava.manager.response.ManagerError; import org.asteriskjava.pbx.util.LogTime; import org.asteriskjava.util.DateUtil; import org.asteriskjava.util.Log; diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerReader.java b/src/main/java/org/asteriskjava/manager/internal/ManagerReader.java index 2b3e46c19..4f25ab69c 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerReader.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerReader.java @@ -16,8 +16,8 @@ */ package org.asteriskjava.manager.internal; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.manager.event.ManagerEvent; -import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.util.SocketConnectionFacade; import java.io.IOException; diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerReaderImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerReaderImpl.java index efbc00535..c6404865b 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerReaderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerReaderImpl.java @@ -17,11 +17,11 @@ package org.asteriskjava.manager.internal; import com.google.common.util.concurrent.RateLimiter; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.manager.event.DisconnectEvent; import org.asteriskjava.manager.event.ManagerEvent; import org.asteriskjava.manager.event.ProtocolIdentifierReceivedEvent; import org.asteriskjava.manager.internal.backwardsCompatibility.BackwardsCompatibilityForManagerEvents; -import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.pbx.util.LogTime; import org.asteriskjava.util.DateUtil; import org.asteriskjava.util.Log; diff --git a/src/main/java/org/asteriskjava/manager/internal/ResponseBuilder.java b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilder.java index b3c940409..8cd82e97f 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ResponseBuilder.java +++ b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilder.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.internal; -import org.asteriskjava.manager.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerResponse; import java.util.Map; @@ -26,7 +26,7 @@ * * @author srt * @version $Id$ - * @see org.asteriskjava.manager.response.ManagerResponse + * @see ManagerResponse */ interface ResponseBuilder { /** diff --git a/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java index 577843f08..5fa099229 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java @@ -15,9 +15,9 @@ */ package org.asteriskjava.manager.internal; +import org.asteriskjava.ami.action.response.ManagerResponse; 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; @@ -30,7 +30,7 @@ * * @author srt * @version $Id$ - * @see org.asteriskjava.manager.response.ManagerResponse + * @see ManagerResponse */ class ResponseBuilderImpl implements ResponseBuilder { private static final Logger logger = getLogger(ResponseBuilderImpl.class); diff --git a/src/main/java/org/asteriskjava/manager/internal/ResponseEventsImpl.java b/src/main/java/org/asteriskjava/manager/internal/ResponseEventsImpl.java index 7507f7598..e860edfa7 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ResponseEventsImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ResponseEventsImpl.java @@ -16,11 +16,11 @@ */ package org.asteriskjava.manager.internal; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.lock.LockableList; import org.asteriskjava.lock.Locker.LockCloser; import org.asteriskjava.manager.ResponseEvents; import org.asteriskjava.manager.event.ResponseEvent; -import org.asteriskjava.manager.response.ManagerResponse; import java.util.ArrayList; import java.util.Collection; diff --git a/src/main/java/org/asteriskjava/manager/response/ChallengeResponse.java b/src/main/java/org/asteriskjava/manager/response/ChallengeResponse.java index 662668784..520960270 100644 --- a/src/main/java/org/asteriskjava/manager/response/ChallengeResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/ChallengeResponse.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerResponse; + /** * Corresponds to a ChallengeAction and contains the challenge needed to log in using * challenge/response. diff --git a/src/main/java/org/asteriskjava/manager/response/CommandResponse.java b/src/main/java/org/asteriskjava/manager/response/CommandResponse.java index f1e640dde..68bdf4938 100644 --- a/src/main/java/org/asteriskjava/manager/response/CommandResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/CommandResponse.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerResponse; + import java.util.List; /** diff --git a/src/main/java/org/asteriskjava/manager/response/CoreSettingsResponse.java b/src/main/java/org/asteriskjava/manager/response/CoreSettingsResponse.java index e7e233922..d92282e95 100644 --- a/src/main/java/org/asteriskjava/manager/response/CoreSettingsResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/CoreSettingsResponse.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerResponse; + /** * Corresponds to a CoreSettingsAction and contains the current settings summary of the * Asterisk server. diff --git a/src/main/java/org/asteriskjava/manager/response/CoreStatusResponse.java b/src/main/java/org/asteriskjava/manager/response/CoreStatusResponse.java index cc2f8237a..2cb58843d 100644 --- a/src/main/java/org/asteriskjava/manager/response/CoreStatusResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/CoreStatusResponse.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.util.DateUtil; import java.util.Date; diff --git a/src/main/java/org/asteriskjava/manager/response/ExtensionStateResponse.java b/src/main/java/org/asteriskjava/manager/response/ExtensionStateResponse.java index e9afcb964..11f434c5c 100644 --- a/src/main/java/org/asteriskjava/manager/response/ExtensionStateResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/ExtensionStateResponse.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerResponse; + /** * Response to an {@link org.asteriskjava.manager.action.ExtensionStateAction}. * diff --git a/src/main/java/org/asteriskjava/manager/response/GetConfigResponse.java b/src/main/java/org/asteriskjava/manager/response/GetConfigResponse.java index da4ec4a02..b036d8531 100644 --- a/src/main/java/org/asteriskjava/manager/response/GetConfigResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/GetConfigResponse.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerResponse; + import java.util.Locale; import java.util.Map; import java.util.Map.Entry; diff --git a/src/main/java/org/asteriskjava/manager/response/GetVarResponse.java b/src/main/java/org/asteriskjava/manager/response/GetVarResponse.java index 8758a6da7..f759ee2f1 100644 --- a/src/main/java/org/asteriskjava/manager/response/GetVarResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/GetVarResponse.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerResponse; + /** * Corresponds to a GetVarAction and contains the value of the requested variable. * diff --git a/src/main/java/org/asteriskjava/manager/response/MailboxCountResponse.java b/src/main/java/org/asteriskjava/manager/response/MailboxCountResponse.java index 66bdae04e..833200064 100644 --- a/src/main/java/org/asteriskjava/manager/response/MailboxCountResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/MailboxCountResponse.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerResponse; + /** * A MailboxCountResponse is sent in response to a MailboxCountAction and contains the number of old * and new messages in a mailbox. diff --git a/src/main/java/org/asteriskjava/manager/response/MailboxStatusResponse.java b/src/main/java/org/asteriskjava/manager/response/MailboxStatusResponse.java index c0e245d0d..47b57017c 100644 --- a/src/main/java/org/asteriskjava/manager/response/MailboxStatusResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/MailboxStatusResponse.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerResponse; + /** * A MailboxStatusResponse is sent in response to a MailboxStatusAction and indicates if a set * of mailboxes contains waiting messages. diff --git a/src/main/java/org/asteriskjava/manager/response/ManagerError.java b/src/main/java/org/asteriskjava/manager/response/ManagerError.java index 2b208f72b..faa1cd578 100644 --- a/src/main/java/org/asteriskjava/manager/response/ManagerError.java +++ b/src/main/java/org/asteriskjava/manager/response/ManagerError.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerResponse; + /** * Represents an "Response: Error" response received from the asterisk server. * The cause for the error is given in the message attribute. diff --git a/src/main/java/org/asteriskjava/manager/response/MixMonitorResponse.java b/src/main/java/org/asteriskjava/manager/response/MixMonitorResponse.java index ab8d3997f..04739ecc8 100644 --- a/src/main/java/org/asteriskjava/manager/response/MixMonitorResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/MixMonitorResponse.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerResponse; + /** * A MixMonitorResponse is sent in response to a MixMonitorAction and provides * the ID of the MixMonitor that was started on the referenced channel. diff --git a/src/main/java/org/asteriskjava/manager/response/ModuleCheckResponse.java b/src/main/java/org/asteriskjava/manager/response/ModuleCheckResponse.java index f131a5865..b9948e329 100644 --- a/src/main/java/org/asteriskjava/manager/response/ModuleCheckResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/ModuleCheckResponse.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerResponse; + /** * Corresponds to a ModuleCheckAction and contains the version of the module. * diff --git a/src/main/java/org/asteriskjava/manager/response/PingResponse.java b/src/main/java/org/asteriskjava/manager/response/PingResponse.java index aee7a35b0..035f42aff 100644 --- a/src/main/java/org/asteriskjava/manager/response/PingResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/PingResponse.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerResponse; + /** * Corresponds to a PingAction and contains an additional (yet useless) ping property. * diff --git a/src/main/java/org/asteriskjava/manager/response/SipShowPeerResponse.java b/src/main/java/org/asteriskjava/manager/response/SipShowPeerResponse.java index 1ea7987b7..2d35b7a2f 100644 --- a/src/main/java/org/asteriskjava/manager/response/SipShowPeerResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/SipShowPeerResponse.java @@ -15,6 +15,8 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerResponse; + import java.util.Map; /** diff --git a/src/main/java/org/asteriskjava/manager/response/SkypeBuddyResponse.java b/src/main/java/org/asteriskjava/manager/response/SkypeBuddyResponse.java index 87f40ff72..a751d8466 100644 --- a/src/main/java/org/asteriskjava/manager/response/SkypeBuddyResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/SkypeBuddyResponse.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerResponse; + /** * Corresponds to a SkypeBuddyAction and contains the details of a Skype buddy. * diff --git a/src/main/java/org/asteriskjava/manager/response/SkypeLicenseStatusResponse.java b/src/main/java/org/asteriskjava/manager/response/SkypeLicenseStatusResponse.java index 7bdaaab88..4549a9342 100644 --- a/src/main/java/org/asteriskjava/manager/response/SkypeLicenseStatusResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/SkypeLicenseStatusResponse.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerResponse; + /** * Corresponds to a SkypeLicenseStatusAction and contains the number of licensed Skype calls. * diff --git a/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java b/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java index e78a4a628..7f9541d45 100644 --- a/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java +++ b/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java @@ -15,9 +15,9 @@ */ package org.asteriskjava.manager.util; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.manager.event.CdrEvent; import org.asteriskjava.manager.event.UserEvent; -import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.util.AstUtil; import org.asteriskjava.util.ReflectionUtil; import org.slf4j.Logger; diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/CommandResponse.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/CommandResponse.java index 135e76138..c9a4e1675 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/CommandResponse.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/CommandResponse.java @@ -8,7 +8,7 @@ public class CommandResponse extends ManagerResponse { private List result; private boolean error; - public CommandResponse(org.asteriskjava.manager.response.ManagerResponse response) { + public CommandResponse(org.asteriskjava.ami.action.response.ManagerResponse response) { super(response); if (response instanceof org.asteriskjava.manager.response.CommandResponse) { diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerError.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerError.java index 68479b634..455057476 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerError.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerError.java @@ -1,8 +1,10 @@ package org.asteriskjava.pbx.asterisk.wrap.response; +import org.asteriskjava.ami.action.response.ManagerResponse; + public class ManagerError extends CommandResponse { - public ManagerError(org.asteriskjava.manager.response.ManagerResponse error) { + public ManagerError(ManagerResponse error) { super(error); } diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerResponse.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerResponse.java index bd5715997..c979264b5 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerResponse.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerResponse.java @@ -22,7 +22,7 @@ public class ManagerResponse { final private String _uniqueId; final private Map _attributes; - public ManagerResponse(org.asteriskjava.manager.response.ManagerResponse response) { + public ManagerResponse(org.asteriskjava.ami.action.response.ManagerResponse response) { this._dateReceived = response.getDateReceived(); this._actionId = response.getActionId(); this._server = response.getServer(); diff --git a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java index 102bd761e..9df47871a 100644 --- a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java +++ b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java @@ -136,7 +136,7 @@ public static ResponseEvent build(org.asteriskjava.manager.event.ResponseEvent e return response; } - public static ManagerResponse build(org.asteriskjava.manager.response.ManagerResponse response) { + public static ManagerResponse build(org.asteriskjava.ami.action.response.ManagerResponse response) { ManagerResponse result; if (response instanceof org.asteriskjava.manager.response.CommandResponse) { result = new CommandResponse(response); diff --git a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentManagerConnection.java b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentManagerConnection.java index 1b5f39f33..068cc77ce 100644 --- a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentManagerConnection.java +++ b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentManagerConnection.java @@ -284,7 +284,7 @@ public static ManagerResponse sendAction(final ManagerAction action, final int t && (CoherentManagerConnection.managerConnection.getState() == ManagerConnectionState.CONNECTED)) { final org.asteriskjava.ami.action.ManagerAction ajAction = action.getAJAction(); - org.asteriskjava.manager.response.ManagerResponse response = CoherentManagerConnection.managerConnection + org.asteriskjava.ami.action.response.ManagerResponse response = CoherentManagerConnection.managerConnection .sendAction(ajAction, timeout); ManagerResponse convertedResponse = null; diff --git a/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java b/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java index 2565925a9..656bf9309 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java @@ -17,6 +17,7 @@ package org.asteriskjava.manager.internal; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.manager.AuthenticationFailedException; import org.asteriskjava.manager.ManagerConnectionState; import org.asteriskjava.manager.ManagerEventListener; @@ -29,7 +30,6 @@ import org.asteriskjava.manager.event.DisconnectEvent; import org.asteriskjava.manager.event.ManagerEvent; import org.asteriskjava.manager.event.NewChannelEvent; -import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.util.SocketConnectionFacade; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java b/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java index eabb78d67..5fb37e8a9 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java @@ -16,9 +16,9 @@ */ package org.asteriskjava.manager.internal; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.manager.event.*; import org.asteriskjava.manager.response.CommandResponse; -import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.util.DateUtil; import org.asteriskjava.util.SocketConnectionFacade; import org.junit.jupiter.api.AfterEach; diff --git a/src/test/java/org/asteriskjava/manager/internal/ManagerReaderMock.java b/src/test/java/org/asteriskjava/manager/internal/ManagerReaderMock.java index e4bc3332b..dff75df80 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerReaderMock.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerReaderMock.java @@ -16,8 +16,8 @@ */ package org.asteriskjava.manager.internal; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.manager.event.ManagerEvent; -import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.util.SocketConnectionFacade; import java.io.IOException; diff --git a/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java b/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java index c76011b8d..6736ab898 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java @@ -18,13 +18,13 @@ import org.asteriskjava.AsteriskVersion; import org.asteriskjava.ami.action.ManagerAction; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.manager.action.ChallengeAction; import org.asteriskjava.manager.action.LoginAction; import org.asteriskjava.manager.action.LogoffAction; import org.asteriskjava.manager.event.ProtocolIdentifierReceivedEvent; import org.asteriskjava.manager.response.ChallengeResponse; import org.asteriskjava.manager.response.ManagerError; -import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.util.DateUtil; import org.asteriskjava.util.SocketConnectionFacade; diff --git a/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java b/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java index 65cd4d8d1..1ff0db457 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java @@ -16,6 +16,7 @@ */ package org.asteriskjava.manager.internal; +import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.manager.response.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; From 63d782eea7e624df3e6893ec1960b5f3896acfab Mon Sep 17 00:00:00 2001 From: Piotr Olaszewski Date: Tue, 28 Nov 2023 20:22:45 +0100 Subject: [PATCH 03/10] Move ChallengeAction and ChallengeResponse --- .editorconfig | 17 +++- .../ami/action/AbstractManagerAction.java | 6 +- .../org/asteriskjava/ami/action/AuthType.java | 27 +++++++ .../ami/action/ChallengeAction.java | 63 +++++++++++++++ .../action/response/ChallengeResponse.java | 45 +++++++++++ asterisk-java-core/build.gradle | 2 + .../core/databind/AsteriskGenerator.java | 1 + .../core/databind/AsteriskObjectMapper.java | 5 +- .../custom/ComaJoiningSerializer.java | 6 +- .../serializer/std/ToStringSerializer.java | 8 +- .../core/databind/utils/ReflectionUtils.java | 12 +-- .../writer/AsteriskObjectMethodWriter.java | 8 +- .../databind/writer/AsteriskObjectWriter.java | 8 +- .../databind/AsteriskObjectMapperTest.java | 4 +- .../custom/VariableSerializerTest.java | 16 ++-- .../std/ToStringSerializerTest.java | 7 +- .../databind/utils/ReflectionUtilsTest.java | 2 +- .../manager/ManagerConnection.java | 5 +- .../manager/action/ChallengeAction.java | 77 ------------------- .../manager/action/LoginAction.java | 3 +- .../manager/internal/ActionBuilderImpl.java | 1 + .../internal/ManagerConnectionImpl.java | 7 +- .../manager/response/ChallengeResponse.java | 48 ------------ .../manager/internal/ManagerWriterMock.java | 9 ++- .../internal/ResponseBuilderImplTest.java | 6 +- 25 files changed, 215 insertions(+), 178 deletions(-) create mode 100644 asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/AuthType.java create mode 100644 asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/ChallengeAction.java create mode 100644 asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ChallengeResponse.java delete mode 100644 src/main/java/org/asteriskjava/manager/action/ChallengeAction.java delete mode 100644 src/main/java/org/asteriskjava/manager/response/ChallengeResponse.java diff --git a/.editorconfig b/.editorconfig index 1dfca740e..03b9d4922 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,8 +1,17 @@ -[*.{java,html}] +root = true + +[*] charset = utf-8 -indent_style = space +end_of_line = lf indent_size = 4 -trim_trailing_whitespace = true +indent_style = space +insert_final_newline = true +max_line_length = 120 +tab_width = 4 +ij_continuation_indent_size = 8 -[*.{yml,yaml}] +[*.{yaml,yml}] indent_size = 2 + +[*.properties] +ij_properties_align_group_field_declarations = false diff --git a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/AbstractManagerAction.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/AbstractManagerAction.java index c0cb846ad..f9145e018 100644 --- a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/AbstractManagerAction.java +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/AbstractManagerAction.java @@ -46,8 +46,8 @@ public void setActionId(String actionId) { @Override public String toString() { return new ToStringBuilder(this) - .append("action", getAction()) - .append("actionId", actionId) - .toString(); + .append("action", getAction()) + .append("actionId", actionId) + .toString(); } } diff --git a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/AuthType.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/AuthType.java new file mode 100644 index 000000000..2cf03147e --- /dev/null +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/AuthType.java @@ -0,0 +1,27 @@ +/* + * Copyright 2004-2023 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.ami.action; + +/** + * Digest algorithms to use in the challenge. + * + * @author Piotr Olaszewski + * @see ChallengeAction + * @since 4.0.0 + */ +public enum AuthType { + MD5, +} diff --git a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/ChallengeAction.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/ChallengeAction.java new file mode 100644 index 000000000..d7d045785 --- /dev/null +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/ChallengeAction.java @@ -0,0 +1,63 @@ +/* + * Copyright 2004-2023 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.ami.action; + +import org.asteriskjava.ami.action.annotation.ExpectedResponse; +import org.asteriskjava.ami.action.response.ChallengeResponse; + +import java.io.Serial; + +/** + * The {@link ChallengeAction} requests a challenge from the server to use when logging in using challenge/response. + * Sending this action to the Asterisk server results in a {@link ChallengeResponse} being received from the server. + *

+ * Supported Asterisk versions: + *

+ * + * @author Stefan Reuter + * @author Piotr Olaszewski + * @see ChallengeResponse + * @since 1.0.0 + */ +@ExpectedResponse(ChallengeResponse.class) +public class ChallengeAction extends AbstractManagerAction { + @Serial + private static final long serialVersionUID = 7240516124871953971L; + + private AuthType authType; + + @Override + public String getAction() { + return "Challenge"; + } + + /** + * Asterisk argument: {@code AuthType}. + */ + public AuthType getAuthType() { + return authType; + } + + /** + * Sets Asterisk argument: {@code AuthType}. + */ + public void setAuthType(AuthType authType) { + this.authType = authType; + } +} diff --git a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ChallengeResponse.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ChallengeResponse.java new file mode 100644 index 000000000..3ec033ee6 --- /dev/null +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ChallengeResponse.java @@ -0,0 +1,45 @@ +/* + * Copyright 2004-2023 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.ami.action.response; + +import org.asteriskjava.ami.action.ChallengeAction; + +import java.io.Serial; + +/** + * Corresponds to a {@link ChallengeAction} and contains the challenge needed to log in using challenge/response. + * + * @author Stefan Reuter + * @see ChallengeAction + * @since 1.0.0 + */ +public class ChallengeResponse extends ManagerResponse { + @Serial + private static final long serialVersionUID = -7253724086340850957L; + + private String challenge; + + /** + * Returns the challenge to use when creating the key for log in. + */ + public String getChallenge() { + return challenge; + } + + public void setChallenge(String challenge) { + this.challenge = challenge; + } +} diff --git a/asterisk-java-core/build.gradle b/asterisk-java-core/build.gradle index b2b4104ed..3000457bb 100644 --- a/asterisk-java-core/build.gradle +++ b/asterisk-java-core/build.gradle @@ -15,6 +15,8 @@ repositories { } dependencies { + implementation 'org.apache.commons:commons-lang3:3.14.0' + testImplementation 'org.assertj:assertj-core:3.24.2' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.1' testImplementation 'org.mockito:mockito-core:5.7.0' diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskGenerator.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskGenerator.java index c899c6ec4..e14be7c7a 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskGenerator.java +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskGenerator.java @@ -43,6 +43,7 @@ public void writeFieldValue(String value) { } public String generate() { + stringBuilder.append(newlineDelimiter.getPattern()); return stringBuilder.toString(); } } diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskObjectMapper.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskObjectMapper.java index 386343571..443afaa3b 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskObjectMapper.java +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskObjectMapper.java @@ -34,10 +34,7 @@ public class AsteriskObjectMapper { private final NewlineDelimiter newlineDelimiter; private final Comparator fieldNamesComparator; - private AsteriskObjectMapper( - NewlineDelimiter newlineDelimiter, - Comparator fieldNamesComparator - ) { + private AsteriskObjectMapper(NewlineDelimiter newlineDelimiter, Comparator fieldNamesComparator) { this.newlineDelimiter = newlineDelimiter; this.fieldNamesComparator = fieldNamesComparator; } diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/custom/ComaJoiningSerializer.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/custom/ComaJoiningSerializer.java index 5871206e9..138d6e392 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/custom/ComaJoiningSerializer.java +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/custom/ComaJoiningSerializer.java @@ -34,9 +34,9 @@ public class ComaJoiningSerializer implements AsteriskSerializer> @Override public void serialize(String fieldName, Collection value, AsteriskGenerator asteriskGenerator) { String fieldValue = value - .stream() - .map(Object::toString) - .collect(joining(COMA_SEPARATOR)); + .stream() + .map(Object::toString) + .collect(joining(COMA_SEPARATOR)); asteriskGenerator.writeFieldValue(fieldValue); } diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializer.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializer.java index 46d4b6b41..08fd668ea 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializer.java +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializer.java @@ -18,6 +18,8 @@ import org.asteriskjava.core.databind.AsteriskGenerator; import org.asteriskjava.core.databind.serializer.AsteriskSerializer; +import static org.apache.commons.lang3.StringUtils.EMPTY; + /** * Base serializer which calls only the toString method on the passed value. * @@ -27,6 +29,10 @@ public class ToStringSerializer implements AsteriskSerializer { @Override public void serialize(String fieldName, Object value, AsteriskGenerator asteriskGenerator) { - asteriskGenerator.writeFieldValue(value.toString()); + if (value == null) { + asteriskGenerator.writeFieldValue(EMPTY); + } else { + asteriskGenerator.writeFieldValue(value.toString()); + } } } diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/ReflectionUtils.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/ReflectionUtils.java index 19fe0ce80..f0ba07852 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/ReflectionUtils.java +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/ReflectionUtils.java @@ -48,12 +48,12 @@ public static Map getGetters(Class clazz, Comparator Method[] methods = clazz.getMethods(); for (Method method : methods) { if (method.getParameterCount() > 0 || - method.getReturnType() == Void.TYPE || - !isPublic(method.getModifiers()) || - isNative(method.getModifiers()) || - isAbstract(method.getModifiers()) || - isStatic(method.getModifiers()) || - method.getName().equals("toString") + method.getReturnType() == Void.TYPE || + !isPublic(method.getModifiers()) || + isNative(method.getModifiers()) || + isAbstract(method.getModifiers()) || + isStatic(method.getModifiers()) || + method.getName().equals("toString") ) { continue; } diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriter.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriter.java index eb33c1dd7..5ee56ca3e 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriter.java +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriter.java @@ -34,10 +34,10 @@ public class AsteriskObjectMethodWriter { private final AsteriskObjectMethodWriterContext asteriskObjectMethodWriterContext; public AsteriskObjectMethodWriter( - Method method, - String name, - AsteriskSerializer asteriskSerializer, - AsteriskObjectMethodWriterContext asteriskObjectMethodWriterContext + Method method, + String name, + AsteriskSerializer asteriskSerializer, + AsteriskObjectMethodWriterContext asteriskObjectMethodWriterContext ) { this.method = method; this.name = name; diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectWriter.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectWriter.java index 91d6ad710..a73bf61c5 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectWriter.java +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectWriter.java @@ -43,10 +43,10 @@ public AsteriskObjectWriter(Class clazz, Comparator fieldNamesCompara public List getAsteriskObjectMethodWriters() { return getGetters(clazz, fieldNamesComparator) - .entrySet() - .stream() - .map(this::getAsteriskObjectMethodWriter) - .toList(); + .entrySet() + .stream() + .map(this::getAsteriskObjectMethodWriter) + .toList(); } private AsteriskObjectMethodWriter getAsteriskObjectMethodWriter(Entry entry) { diff --git a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskObjectMapperTest.java b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskObjectMapperTest.java index de7a0f54a..3b1377582 100644 --- a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskObjectMapperTest.java +++ b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskObjectMapperTest.java @@ -14,8 +14,8 @@ class AsteriskObjectMapperTest { private final AsteriskObjectMapper asteriskObjectMapper = builder() - .crlfNewlineDelimiter() - .build(); + .crlfNewlineDelimiter() + .build(); @Test void shouldGenerateSimpleBean() { diff --git a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/custom/VariableSerializerTest.java b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/custom/VariableSerializerTest.java index 02c69f9d6..c70f10b40 100644 --- a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/custom/VariableSerializerTest.java +++ b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/custom/VariableSerializerTest.java @@ -32,9 +32,9 @@ void shouldSerializeValues() { VariableSerializer variableSerializer = new VariableSerializer(); Map map = Map.of( - "key1", "value1", - "key2", "value2", - "key3", "value3" + "key1", "value1", + "key2", "value2", + "key3", "value3" ); //when @@ -42,10 +42,10 @@ void shouldSerializeValues() { //then assertThat(asteriskGenerator.generate()) - .contains( - "fieldName: key1=value1", - "fieldName: key2=value2", - "fieldName: key3=value3" - ); + .contains( + "fieldName: key1=value1", + "fieldName: key2=value2", + "fieldName: key3=value3" + ); } } diff --git a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializerTest.java b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializerTest.java index 0378e957f..da041a9ca 100644 --- a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializerTest.java +++ b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializerTest.java @@ -44,9 +44,10 @@ void shouldSerializeUsingToString(Object actual, String expected) { private static Stream toStringSerializerArguments() { return Stream.of( - arguments("string", "string"), - arguments(true, "true"), - arguments(1.12, "1.12") + arguments("string", "string"), + arguments(true, "true"), + arguments(1.12, "1.12"), + arguments(null, "") ); } } diff --git a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/utils/ReflectionUtilsTest.java b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/utils/ReflectionUtilsTest.java index 29f9dccbb..a00cfc280 100644 --- a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/utils/ReflectionUtilsTest.java +++ b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/utils/ReflectionUtilsTest.java @@ -138,7 +138,7 @@ public String is() { @Override public String toString() { return new StringJoiner(", ", InvalidClass.class.getSimpleName() + "[", "]") - .toString(); + .toString(); } } diff --git a/src/main/java/org/asteriskjava/manager/ManagerConnection.java b/src/main/java/org/asteriskjava/manager/ManagerConnection.java index e67231496..0fe3a5f23 100644 --- a/src/main/java/org/asteriskjava/manager/ManagerConnection.java +++ b/src/main/java/org/asteriskjava/manager/ManagerConnection.java @@ -17,6 +17,7 @@ package org.asteriskjava.manager; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.action.ChallengeAction; import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.manager.action.EventGeneratingAction; @@ -230,7 +231,7 @@ public interface ManagerConnection { * @throws TimeoutException if a timeout occurs while waiting for the * protocol identifier. The connection is closed in this case. * @see org.asteriskjava.manager.action.LoginAction - * @see org.asteriskjava.manager.action.ChallengeAction + * @see ChallengeAction */ void login() throws IllegalStateException, IOException, AuthenticationFailedException, TimeoutException; @@ -250,7 +251,7 @@ public interface ManagerConnection { * @throws TimeoutException if a timeout occurs while waiting for the * protocol identifier. The connection is closed in this case. * @see org.asteriskjava.manager.action.LoginAction - * @see org.asteriskjava.manager.action.ChallengeAction + * @see ChallengeAction * @since 0.3 */ void login(String events) throws IllegalStateException, IOException, AuthenticationFailedException, TimeoutException; diff --git a/src/main/java/org/asteriskjava/manager/action/ChallengeAction.java b/src/main/java/org/asteriskjava/manager/action/ChallengeAction.java deleted file mode 100644 index 2c2ef6a4f..000000000 --- a/src/main/java/org/asteriskjava/manager/action/ChallengeAction.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2004-2006 Stefan Reuter - * - * 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.action; - -import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.ami.action.annotation.ExpectedResponse; -import org.asteriskjava.manager.response.ChallengeResponse; - -/** - * The ChallengeAction requests a challenge from the server to use when logging - * in using challenge/response. Sending this action to the asterisk server - * results in a ChallengeResponse being received from the server. - * - * @author srt - * @version $Id$ - * @see org.asteriskjava.manager.action.LoginAction - * @see org.asteriskjava.manager.response.ChallengeResponse - */ -@ExpectedResponse(ChallengeResponse.class) -public class ChallengeAction extends AbstractManagerAction { - static final long serialVersionUID = 7240516124871953971L; - private String authType; - - /** - * Creates a new empty ChallengeAction. - */ - public ChallengeAction() { - - } - - /** - * Creates a new ChallengeAction that requests a new login challenge for use - * with the given digest algorithm. - * - * @param authType the digest alogrithm to use. - * @since 0.2 - */ - public ChallengeAction(String authType) { - this.authType = authType; - } - - /** - * Returns Returns the name of this action, i.e. "Challenge". - */ - @Override - public String getAction() { - return "Challenge"; - } - - /** - * Returns the digest alogrithm to use. - */ - public String getAuthType() { - return authType; - } - - /** - * Sets the digest alogrithm to use. Currently asterisk only supports "MD5". - */ - public void setAuthType(String authType) { - this.authType = authType; - } -} diff --git a/src/main/java/org/asteriskjava/manager/action/LoginAction.java b/src/main/java/org/asteriskjava/manager/action/LoginAction.java index ed1b7800d..655ff6624 100644 --- a/src/main/java/org/asteriskjava/manager/action/LoginAction.java +++ b/src/main/java/org/asteriskjava/manager/action/LoginAction.java @@ -17,6 +17,7 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; +import org.asteriskjava.ami.action.ChallengeAction; /** * The LoginAction authenticates the connection.

@@ -28,7 +29,7 @@ * * @author srt * @version $Id$ - * @see org.asteriskjava.manager.action.ChallengeAction + * @see ChallengeAction * @see org.asteriskjava.manager.response.ManagerError */ public class LoginAction extends AbstractManagerAction { diff --git a/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java index fe27e6692..3869ee2c7 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java @@ -100,6 +100,7 @@ public String buildAction(final ManagerAction action, final String internalActio String actionId = internalActionId != null ? ManagerUtil.addInternalActionId(action.getActionId(), internalActionId) : action.getActionId(); if (action.getClass().getPackageName().contains("org.asteriskjava.ami.action")) { + action.setActionId(actionId); return asteriskObjectMapper.writeValue(action); } diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index 9be1b46bd..a1b7af443 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -16,8 +16,11 @@ package org.asteriskjava.manager.internal; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.action.AuthType; +import org.asteriskjava.ami.action.ChallengeAction; import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.ami.action.annotation.ExpectedResponse; +import org.asteriskjava.ami.action.response.ChallengeResponse; import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.lock.Lockable; import org.asteriskjava.lock.LockableList; @@ -26,7 +29,6 @@ import org.asteriskjava.manager.*; import org.asteriskjava.manager.action.*; import org.asteriskjava.manager.event.*; -import org.asteriskjava.manager.response.ChallengeResponse; import org.asteriskjava.manager.response.CommandResponse; import org.asteriskjava.manager.response.CoreSettingsResponse; import org.asteriskjava.manager.response.ManagerError; @@ -498,7 +500,8 @@ protected void doLogin(long timeout, String eventMask) throw new TimeoutException("Timeout waiting for protocol identifier"); } - challengeAction = new ChallengeAction("MD5"); + challengeAction = new ChallengeAction(); + challengeAction.setAuthType(AuthType.MD5); try { challengeResponse = sendAction(challengeAction); } catch (Exception e) { diff --git a/src/main/java/org/asteriskjava/manager/response/ChallengeResponse.java b/src/main/java/org/asteriskjava/manager/response/ChallengeResponse.java deleted file mode 100644 index 520960270..000000000 --- a/src/main/java/org/asteriskjava/manager/response/ChallengeResponse.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2004-2006 Stefan Reuter - * - * 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.response; - -import org.asteriskjava.ami.action.response.ManagerResponse; - -/** - * Corresponds to a ChallengeAction and contains the challenge needed to log in using - * challenge/response. - * - * @author srt - * @version $Id$ - * @see org.asteriskjava.manager.action.ChallengeAction - * @see org.asteriskjava.manager.action.LoginAction - */ -public class ChallengeResponse extends ManagerResponse { - private static final long serialVersionUID = -7253724086340850957L; - - private String challenge; - - /** - * Returns the challenge to use when creating the key for log in. - * - * @return the challenge to use when creating the key for log in. - * @see org.asteriskjava.manager.action.LoginAction#setKey(String) - */ - public String getChallenge() { - return challenge; - } - - public void setChallenge(String challenge) { - this.challenge = challenge; - } -} diff --git a/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java b/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java index 6736ab898..c8fb9bc29 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java @@ -17,13 +17,14 @@ package org.asteriskjava.manager.internal; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.action.AuthType; +import org.asteriskjava.ami.action.ChallengeAction; import org.asteriskjava.ami.action.ManagerAction; +import org.asteriskjava.ami.action.response.ChallengeResponse; import org.asteriskjava.ami.action.response.ManagerResponse; -import org.asteriskjava.manager.action.ChallengeAction; import org.asteriskjava.manager.action.LoginAction; import org.asteriskjava.manager.action.LogoffAction; import org.asteriskjava.manager.event.ProtocolIdentifierReceivedEvent; -import org.asteriskjava.manager.response.ChallengeResponse; import org.asteriskjava.manager.response.ManagerError; import org.asteriskjava.util.DateUtil; import org.asteriskjava.util.SocketConnectionFacade; @@ -96,9 +97,9 @@ public void run() { public void sendAction(ManagerAction action, String internalActionId) throws IOException { if (action instanceof ChallengeAction) { ChallengeAction challengeAction = (ChallengeAction) action; - String authType = challengeAction.getAuthType(); + AuthType authType = challengeAction.getAuthType(); - if (!authType.equals("MD5")) { + if (authType != AuthType.MD5) { throw new RuntimeException("Expected authType 'MD5' got '" + authType + "'"); } diff --git a/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java b/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java index 1ff0db457..52bb3ec54 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java @@ -16,8 +16,12 @@ */ package org.asteriskjava.manager.internal; +import org.asteriskjava.ami.action.response.ChallengeResponse; import org.asteriskjava.ami.action.response.ManagerResponse; -import org.asteriskjava.manager.response.*; +import org.asteriskjava.manager.response.ExtensionStateResponse; +import org.asteriskjava.manager.response.MailboxCountResponse; +import org.asteriskjava.manager.response.MailboxStatusResponse; +import org.asteriskjava.manager.response.ManagerError; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; From 21cab03ea116ec43e954d6b6d1e43c8f4051b723 Mon Sep 17 00:00:00 2001 From: Piotr Olaszewski Date: Tue, 28 Nov 2023 20:48:41 +0100 Subject: [PATCH 04/10] Fix falling tests --- .../asteriskjava/core/databind/AsteriskObjectMapperTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskObjectMapperTest.java b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskObjectMapperTest.java index 3b1377582..3ffae7024 100644 --- a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskObjectMapperTest.java +++ b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskObjectMapperTest.java @@ -32,7 +32,7 @@ void shouldGenerateSimpleBean() { String expected = "Action: SimpleBean" + CRLF.getPattern(); expected += "ActionID: id-1" + CRLF.getPattern(); expected += "AuthType: MD5" + CRLF.getPattern(); - expected += "Codecs: codec1,codec2" + CRLF.getPattern(); + expected += "Codecs: codec1,codec2" + CRLF.getPattern() + CRLF.getPattern(); assertThat(string).isEqualTo(expected); } From e3e40e12d6af129d86351a45f7333f114cebabc1 Mon Sep 17 00:00:00 2001 From: Piotr Olaszewski Date: Wed, 29 Nov 2023 19:55:38 +0100 Subject: [PATCH 05/10] Add response type enum and start working with framework for action testing --- asterisk-java-ami/build.gradle | 10 ++ .../ami/ActionFieldsComparator.java | 40 +++++ .../action/response/ChallengeResponse.java | 1 + .../ami/action/response/ManagerResponse.java | 101 +++++------- .../ami/action/response/ResponseType.java | 29 ++++ .../ami/action/ChallengeActionItTest.java | 86 ++++++++++ .../src/test/resources/manager.conf | 154 ++++++++++++++++++ .../manager/internal/ActionBuilderImpl.java | 23 +-- .../manager/internal/ManagerReaderImpl.java | 2 +- .../manager/internal/ResponseBuilderImpl.java | 3 +- .../internal/ManagerConnectionImplTest.java | 7 +- .../manager/internal/ManagerWriterMock.java | 9 +- 12 files changed, 379 insertions(+), 86 deletions(-) create mode 100644 asterisk-java-ami/src/main/java/org/asteriskjava/ami/ActionFieldsComparator.java create mode 100644 asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ResponseType.java create mode 100644 asterisk-java-ami/src/test/java/org/asteriskjava/ami/action/ChallengeActionItTest.java create mode 100644 asterisk-java-ami/src/test/resources/manager.conf diff --git a/asterisk-java-ami/build.gradle b/asterisk-java-ami/build.gradle index c7879c593..702dab7eb 100644 --- a/asterisk-java-ami/build.gradle +++ b/asterisk-java-ami/build.gradle @@ -22,6 +22,16 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.24.2' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.1' testImplementation 'org.mockito:mockito-core:5.7.0' + testImplementation 'ch.qos.logback:logback-classic:1.4.11' //todo remove + + testImplementation platform('org.testcontainers:testcontainers-bom:1.19.3') + testImplementation 'org.testcontainers:junit-jupiter' + testImplementation 'org.testcontainers:testcontainers' + + //todo only for testing framework + testImplementation 'io.netty:netty-codec:4.1.101.Final' + testImplementation 'io.netty:netty-handler:4.1.101.Final' + testImplementation 'io.netty:netty-transport:4.1.101.Final' } tasks.named('test') { diff --git a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/ActionFieldsComparator.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/ActionFieldsComparator.java new file mode 100644 index 000000000..8c174b982 --- /dev/null +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/ActionFieldsComparator.java @@ -0,0 +1,40 @@ +/* + * Copyright 2004-2023 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.ami; + +import java.util.Comparator; + +/** + * Convenient class to sort Action and ActionID fields in action object. Those fields are first and second retrospectively. + * + * @author Piotr Olaszewski + * @since 4.0.0 + */ +public class ActionFieldsComparator implements Comparator { + @Override + public int compare(String o1, String o2) { + if (o1.equals(o2)) { + return 0; + } + if (o1.equalsIgnoreCase("Action") && o2.equalsIgnoreCase("ActionID") || (o1.equalsIgnoreCase("ActionID") && o2.equalsIgnoreCase("Action"))) { + return 1; + } + if (o1.equalsIgnoreCase("Action") || o1.equalsIgnoreCase("ActionID")) { + return -1; + } + return 1; + } +} diff --git a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ChallengeResponse.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ChallengeResponse.java index 3ec033ee6..978540668 100644 --- a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ChallengeResponse.java +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ChallengeResponse.java @@ -23,6 +23,7 @@ * Corresponds to a {@link ChallengeAction} and contains the challenge needed to log in using challenge/response. * * @author Stefan Reuter + * @author Piotr Olaszewski * @see ChallengeAction * @since 1.0.0 */ diff --git a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ManagerResponse.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ManagerResponse.java index d45fae97e..b631bdf6e 100644 --- a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ManagerResponse.java +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ManagerResponse.java @@ -19,7 +19,7 @@ import java.io.Serial; import java.io.Serializable; -import java.util.Date; +import java.time.Instant; import java.util.Locale; import java.util.Map; @@ -37,15 +37,55 @@ public class ManagerResponse implements Serializable { @Serial private static final long serialVersionUID = 1L; - private Date dateReceived; + private ResponseType response; + + private Instant dateReceived; + private String actionId; + /** + * Asterisk argument: {@code Response}. + */ + public ResponseType getResponse() { + return response; + } + + public void setResponse(ResponseType response) { + this.response = response; + } + + /** + * Returns the point in time when this response was received from the Asterisk server. + */ + public Instant getDateReceived() { + return dateReceived; + } + + public void setDateReceived(Instant dateReceived) { + this.dateReceived = dateReceived; + } + + /** + * Asterisk argument: {@code ActionID}. + *

+ * Returns the user provided action id of the {@link ManagerAction} that caused this response. If the application + * did not set an {@code ActionID} this method returns {@code null}. + */ + public String getActionId() { + return actionId; + } + + public void setActionId(String actionId) { + this.actionId = actionId; + } + + /*---------------*/ + /** * The server from which this response has been received (only used with * AstManProxy). */ private String server; - private String response; private String eventList; private String message; private String uniqueId; @@ -109,35 +149,6 @@ public String getAttribute(String key) { return (String) attributes.get(key.toLowerCase(Locale.ENGLISH)); } - /** - * Returns the point in time this response was received from the asterisk - * server. - */ - public Date getDateReceived() { - return dateReceived; - } - - /** - * Sets the point in time this response was received from the asterisk - * server. - */ - public void setDateReceived(Date dateReceived) { - this.dateReceived = dateReceived; - } - - /** - * Returns the user provided action id of the ManagerAction that caused this - * response. If the application did not set an action id this method returns - * null. - * - * @return the action id of the ManagerAction that caused this response or - * null if none was set. - * @see ManagerAction#setActionId(String) - */ - public String getActionId() { - return actionId; - } - /** * Returns the name of the Asterisk server from which this response has been * received.
@@ -184,16 +195,6 @@ public void setEventList(String eventList) { this.eventList = eventList; } - /** - * Sets the action id of the ManagerAction that caused this response. - * - * @param actionId the action id of the ManagerAction that caused this - * response. - */ - public void setActionId(String actionId) { - this.actionId = actionId; - } - /** * Returns the message received with this response. The content depends on * the action that generated this response. @@ -209,22 +210,6 @@ public void setMessage(String message) { this.message = message; } - /** - * Returns the value of the "Response:" line. This typically a String like - * "Success" or "Error" but depends on the action that generated this - * response. - */ - public String getResponse() { - return response; - } - - /** - * Sets the response. - */ - public void setResponse(String response) { - this.response = response; - } - /** * Returns the unique id received with this response. The unique id is used * to keep track of channels created by the action sent, for example an diff --git a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ResponseType.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ResponseType.java new file mode 100644 index 000000000..48e2cdebc --- /dev/null +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ResponseType.java @@ -0,0 +1,29 @@ +/* + * Copyright 2004-2023 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.ami.action.response; + +/** + * Value of the "Response:" line. This is typically a string like {@code Success} or {@code Error} which is mapped to + * this enum. + * + * @author Piotr Olaszewski + * @since 4.0.0 + */ +public enum ResponseType { + Success, + Error, + Goodbye, +} diff --git a/asterisk-java-ami/src/test/java/org/asteriskjava/ami/action/ChallengeActionItTest.java b/asterisk-java-ami/src/test/java/org/asteriskjava/ami/action/ChallengeActionItTest.java new file mode 100644 index 000000000..7e81b2959 --- /dev/null +++ b/asterisk-java-ami/src/test/java/org/asteriskjava/ami/action/ChallengeActionItTest.java @@ -0,0 +1,86 @@ +package org.asteriskjava.ami.action; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.handler.timeout.IdleStateHandler; +import org.asteriskjava.ami.ActionFieldsComparator; +import org.asteriskjava.core.databind.AsteriskObjectMapper; +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.asteriskjava.ami.action.AuthType.MD5; +import static org.testcontainers.containers.BindMode.READ_ONLY; +import static org.testcontainers.containers.wait.strategy.Wait.forLogMessage; + +@Testcontainers +class ChallengeActionItTest { + @Container + static final GenericContainer asterisk = new GenericContainer<>("andrius/asterisk:alpine-18.15.1") + .withClasspathResourceMapping("manager.conf", "/etc/asterisk/manager.conf", READ_ONLY) + .withAccessToHost(true) + .withExposedPorts(5038) + .waitingFor(forLogMessage(".*Asterisk Ready.*", 1)); + + @Test + void shouldName() throws InterruptedException { + //given + ChallengeAction challengeAction = new ChallengeAction(); + challengeAction.setActionId("id-1"); + challengeAction.setAuthType(MD5); + + AsteriskObjectMapper asteriskObjectMapper = AsteriskObjectMapper + .builder() + .crlfNewlineDelimiter() + .fieldNamesComparator(new ActionFieldsComparator()) + .build(); + + String action = asteriskObjectMapper.writeValue(challengeAction); + + NioEventLoopGroup group = new NioEventLoopGroup(); + Bootstrap bootstrap = new Bootstrap(); + bootstrap + .group(group) + .channel(NioSocketChannel.class) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) { + ch.pipeline() + .addLast("decoder", new StringDecoder()) + .addLast("encoder", new StringEncoder()) + .addLast("actionResponse", new ActionResponseHandler()) + .addLast(new IdleStateHandler(0, 0, 2, SECONDS)); + } + }); + Channel channel = bootstrap.connect(asterisk.getHost(), asterisk.getFirstMappedPort()).sync().channel(); + channel.writeAndFlush(action); + channel.closeFuture().sync(); + + //when + + //then + } + + static class ActionResponseHandler extends SimpleChannelInboundHandler { + @Override + protected void channelRead0(ChannelHandlerContext ctx, String message) { + System.out.println("Received message from Asterisk: " + message); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + cause.printStackTrace(); + ctx.close(); + } + } +} diff --git a/asterisk-java-ami/src/test/resources/manager.conf b/asterisk-java-ami/src/test/resources/manager.conf new file mode 100644 index 000000000..39da70486 --- /dev/null +++ b/asterisk-java-ami/src/test/resources/manager.conf @@ -0,0 +1,154 @@ +[general] +enabled = yes + +port = 5038 +bindaddr = 0.0.0.0 + +; Parameters that control AMI over TLS. ("enabled" must be set too). +; You can open a connection to this socket with e.g. +; +; openssl s_client -connect my_host:5039 +; +;tlsenable=no ; set to YES to enable it +;tlsbindaddr=0.0.0.0:5039 ; address and port to bind to, default to bindaddr and port 5039 +;tlscertfile=/tmp/asterisk.pem ; path to the certificate. +;tlsprivatekey=/tmp/private.pem ; path to the private key, if no private given, + ; if no tlsprivatekey is given, default is to search + ; tlscertfile for private key. +;tlscipher= ; string specifying which SSL ciphers to use or not use +; +;allowmultiplelogin = yes ; IF set to no, rejects manager logins that are already in use. +; ; The default is yes. +; +;displayconnects = yes +; +; Add a Unix epoch timestamp to events (not action responses) +; +;timestampevents = yes + +;brokeneventsaction = yes ; Restore previous behavior that caused the events + ; action to not return a response in certain + ; circumstances. Defaults to 'no'. + +; +; Display certain channel variables every time a channel-oriented +; event is emitted: +; +; Note that this does incur a performance penalty and should be avoided if possible. +; +;channelvars = var1,var2,var3 + +; debug = on ; enable some debugging info in AMI messages (default off). + ; Also accessible through the "manager debug" CLI command. + +; authtimeout specifies the maximum number of seconds a client has to +; authenticate. If the client does not authenticate beofre this timeout +; expires, the client will be disconnected. (default: 30 seconds) + +;authtimeout = 30 + +; authlimit specifies the maximum number of unauthenticated sessions that will +; be allowed to connect at any given time. + +;authlimit = 50 + +;httptimeout = 60 +; a) httptimeout sets the Max-Age of the http cookie +; b) httptimeout is the amount of time the webserver waits +; on a action=waitevent request (actually its httptimeout-10) +; c) httptimeout is also the amount of time the webserver keeps +; a http session alive after completing a successful action +; +; disabledevents specifies AMI events which should be completely globally disabled. +; These events will not be available to any AMI listeners. Use this to disable +; frequent events which are not desired for any listeners. Default +; is no events are globally disabled. Event names are case-sensitive. +; Events disabled in stasis.conf do not also need to be disabled here. +; If you don't want to completely disable an AMI event, also consider the +; filter option available on a per-manager user basis to block unwanted +; events from being received in a stream (as opposed to this option which +; would prevent specified events from being generated at all). + +;disabledevents = Newexten,Varset + +;[mark] +;secret = mysecret +;deny=0.0.0.0/0.0.0.0 +;permit=209.16.236.73/255.255.255.0 +;acl=named_acl_example ; use a named ACL from acl.conf +; +; +;setvar=PBXACCOUNT=edvina +; The setvar option defines channel variables that will be set when this account +; originates a call. You can define multiple setvar= commands for one manager +; user. +; +;eventfilter=Event: Newchannel +;eventfilter=Channel: (PJ)?SIP/(james|jim|john)- +;eventfilter=!Channel: DAHDI/ +; The eventfilter option is used to whitelist or blacklist events per user. +; A filter consists of an (unanchored) regular expression that is run on the +; entire event data. If the first character of the filter is an exclamation +; mark (!), the filter is appended to the blacklist instead of the whitelist. +; After first checking the read access below, the regular expression filters +; are processed as follows: +; - If no filters are configured all events are reported as normal. +; - If there are white filters only: implied black all filter processed first, +; then white filters. +; - If there are black filters only: implied white all filter processed first, +; then black filters. +; - If there are both white and black filters: implied black all filter processed +; first, then white filters, and lastly black filters. + +; +; If the device connected via this user accepts input slowly, +; the timeout for writes to it can be increased to keep it +; from being disconnected (value is in milliseconds) +; +; writetimeout = 100 +; +;displayconnects = yes ; Display on CLI user login/logoff +; +; Authorization for various classes +; +; Read authorization permits you to receive asynchronous events, in general. +; Write authorization permits you to send commands and get back responses. The +; following classes exist: +; +; all - All event classes below (including any we may have missed). +; system - General information about the system and ability to run system +; management commands, such as Shutdown, Restart, and Reload. This +; class also includes dialplan manipulation actions such as +; DialplanExtensionAdd and DialplanExtensionRemove. +; call - Information about channels and ability to set information in a +; running channel. +; log - Logging information. Read-only. (Defined but not yet used.) +; verbose - Verbose information. Read-only. (Defined but not yet used.) +; agent - Information about queues and agents and ability to add queue +; members to a queue. +; user - Permission to send and receive UserEvent. +; config - Ability to read and write configuration files. +; command - Permission to run CLI commands. Write-only. +; dtmf - Receive DTMF events. Read-only. +; reporting - Ability to get information about the system. +; cdr - Output of cdr_manager, if loaded. Read-only. +; dialplan - Receive NewExten and VarSet events. Read-only. +; originate - Permission to originate new calls. Write-only. +; agi - Output AGI commands executed. Input AGI command to execute. +; cc - Call Completion events. Read-only. +; aoc - Permission to send Advice Of Charge messages and receive Advice +; - Of Charge events. +; test - Ability to read TestEvent notifications sent to the Asterisk Test +; Suite. Note that this is only enabled when the TEST_FRAMEWORK +; compiler flag is defined. +; security - Security Events. Read-only. +; message - Permissions to send out of call messages. Write-only +; +;read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan +;write = system,call,agent,user,config,command,reporting,originate,message + +[asterisk-java-it-tests] +secret=123qwe +permit=0.0.0.0/0.0.0.0 +read=all +write=all diff --git a/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java index 3869ee2c7..d93ca80c2 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java @@ -17,6 +17,7 @@ package org.asteriskjava.manager.internal; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.ActionFieldsComparator; import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.core.databind.AsteriskObjectMapper; import org.asteriskjava.manager.AsteriskMapping; @@ -51,25 +52,9 @@ class ActionBuilderImpl implements ActionBuilder { private final Set membersToIgnore = new HashSet<>(); private final AsteriskObjectMapper asteriskObjectMapper = builder() - .crlfNewlineDelimiter() - .fieldNamesComparator(new ActionFieldsComparator()) - .build(); - - static class ActionFieldsComparator implements Comparator { - @Override - public int compare(String o1, String o2) { - if (o1.equals(o2)) { - return 0; - } - if (o1.equalsIgnoreCase("Action") && o2.equalsIgnoreCase("ActionID") || (o1.equalsIgnoreCase("ActionID") && o2.equalsIgnoreCase("Action"))) { - return 1; - } - if (o1.equalsIgnoreCase("Action") || o1.equalsIgnoreCase("ActionID")) { - return -1; - } - return 1; - } - } + .crlfNewlineDelimiter() + .fieldNamesComparator(new ActionFieldsComparator()) + .build(); /** * Creates a new ActionBuilder for Asterisk 1.0. diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerReaderImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerReaderImpl.java index c6404865b..d43e3b218 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerReaderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerReaderImpl.java @@ -352,7 +352,7 @@ private ManagerResponse buildResponse(Map buffer) { final ManagerResponse response = responseBuilder.buildResponse(responseClass, buffer); if (response != null) { - response.setDateReceived(DateUtil.getDate()); + response.setDateReceived(DateUtil.getDate().toInstant()); } return response; diff --git a/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java index 5fa099229..e36cf8946 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java @@ -16,6 +16,7 @@ package org.asteriskjava.manager.internal; import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ResponseType; import org.asteriskjava.manager.response.CommandResponse; import org.asteriskjava.manager.response.ManagerError; import org.asteriskjava.manager.util.EventAttributesHelper; @@ -90,7 +91,7 @@ public ManagerResponse buildResponse(Class responseCl } if (response.getResponse() != null && attributes.get(PROXY_RESPONSE_KEY) != null) { - response.setResponse((String) attributes.get(PROXY_RESPONSE_KEY)); + response.setResponse(ResponseType.valueOf((String) attributes.get(PROXY_RESPONSE_KEY))); } // make the map of all attributes available to the response diff --git a/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java b/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java index 656bf9309..dd034d5eb 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java @@ -18,6 +18,7 @@ import org.asteriskjava.AsteriskVersion; import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ResponseType; import org.asteriskjava.manager.AuthenticationFailedException; import org.asteriskjava.manager.ManagerConnectionState; import org.asteriskjava.manager.ManagerEventListener; @@ -368,7 +369,7 @@ void testDispatchResponseUnexpectedResponse() { response = new ManagerResponse(); // internalActionId: 123_0 response.setActionId("123_0-abc"); - response.setResponse("Success"); + response.setResponse(ResponseType.Success); // expected result is ignoring the response and logging mc.dispatchResponse(response, null); @@ -380,7 +381,7 @@ void testDispatchResponseMissingInternalActionId() { response = new ManagerResponse(); response.setActionId("abc"); - response.setResponse("Success"); + response.setResponse(ResponseType.Success); // expected result is ignoring the response and logging mc.dispatchResponse(response, null); @@ -392,7 +393,7 @@ void testDispatchResponseNullActionId() { response = new ManagerResponse(); response.setActionId(null); - response.setResponse("Success"); + response.setResponse(ResponseType.Success); // expected result is ignoring the response and logging mc.dispatchResponse(response, null); diff --git a/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java b/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java index c8fb9bc29..497ad292d 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java @@ -22,6 +22,7 @@ import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.ami.action.response.ChallengeResponse; import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ResponseType; import org.asteriskjava.manager.action.LoginAction; import org.asteriskjava.manager.action.LogoffAction; import org.asteriskjava.manager.event.ProtocolIdentifierReceivedEvent; @@ -138,10 +139,10 @@ public void sendAction(ManagerAction action, String internalActionId) throws IOE // 3 unsuccessful attempts if (key.equals(expectedKey) || loginActionsSent > 2) { loginResponse = new ManagerResponse(); - loginResponse.setResponse("Success"); + loginResponse.setResponse(ResponseType.Success); } else { loginResponse = new ManagerError(); - loginResponse.setResponse("Error"); + loginResponse.setResponse(ResponseType.Error); loginResponse.setMessage("Authentication failed"); } loginResponse.setActionId(ManagerUtil.addInternalActionId(action.getActionId(), internalActionId)); @@ -155,7 +156,7 @@ public void sendAction(ManagerAction action, String internalActionId) throws IOE response = new ManagerResponse(); response.setActionId(ManagerUtil.addInternalActionId(action.getActionId(), internalActionId)); - response.setResponse("Success"); + response.setResponse(ResponseType.Success); dispatchLater(response); } } else { @@ -166,7 +167,7 @@ public void sendAction(ManagerAction action, String internalActionId) throws IOE response = new ManagerResponse(); response.setActionId(ManagerUtil.addInternalActionId(action.getActionId(), internalActionId)); - response.setResponse("Success"); + response.setResponse(ResponseType.Success); dispatchLater(response); } } From 72163e4488a0fe689db55a8501de5f8f308c4320 Mon Sep 17 00:00:00 2001 From: Piotr Olaszewski Date: Thu, 7 Dec 2023 07:38:22 +0100 Subject: [PATCH 06/10] Add databinder --- .../ami/action/ChallengeActionItTest.java | 2 +- asterisk-java-core/build.gradle | 1 + .../core/databind/AsteriskObjectMapper.java | 24 +- .../core/databind/TypeConversionRegister.java | 88 +++++ .../annotation/AsteriskDeserialize.java | 39 +++ .../deserializer/AsteriskDeserializer.java | 32 ++ .../custom/EqualsSignDeserializer.java | 35 ++ .../databind/reader/AsteriskObjectReader.java | 194 +++++++++++ .../core/databind/utils/AnnotationUtils.java | 36 ++ .../core/databind/utils/Invoker.java | 66 ++++ .../core/databind/utils/ReflectionUtils.java | 52 ++- .../writer/AsteriskObjectMethodWriter.java | 21 +- .../AsteriskObjectMethodWriterContext.java | 2 +- .../databind/writer/AsteriskObjectWriter.java | 28 +- .../databind/AsteriskObjectMapperTest.java | 314 +++++++++++++++++- .../manager/internal/ActionBuilderImpl.java | 2 +- .../manager/util/EventAttributesHelper.java | 6 + .../wrap/response/ManagerResponse.java | 4 +- 18 files changed, 892 insertions(+), 54 deletions(-) create mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/TypeConversionRegister.java create mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/annotation/AsteriskDeserialize.java create mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/deserializer/AsteriskDeserializer.java create mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/deserializer/custom/EqualsSignDeserializer.java create mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/reader/AsteriskObjectReader.java create mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/AnnotationUtils.java create mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/Invoker.java diff --git a/asterisk-java-ami/src/test/java/org/asteriskjava/ami/action/ChallengeActionItTest.java b/asterisk-java-ami/src/test/java/org/asteriskjava/ami/action/ChallengeActionItTest.java index 7e81b2959..4ddbde09c 100644 --- a/asterisk-java-ami/src/test/java/org/asteriskjava/ami/action/ChallengeActionItTest.java +++ b/asterisk-java-ami/src/test/java/org/asteriskjava/ami/action/ChallengeActionItTest.java @@ -45,7 +45,7 @@ void shouldName() throws InterruptedException { .fieldNamesComparator(new ActionFieldsComparator()) .build(); - String action = asteriskObjectMapper.writeValue(challengeAction); + String action = asteriskObjectMapper.writeValueAsString(challengeAction); NioEventLoopGroup group = new NioEventLoopGroup(); Bootstrap bootstrap = new Bootstrap(); diff --git a/asterisk-java-core/build.gradle b/asterisk-java-core/build.gradle index 3000457bb..4ca89799b 100644 --- a/asterisk-java-core/build.gradle +++ b/asterisk-java-core/build.gradle @@ -16,6 +16,7 @@ repositories { dependencies { implementation 'org.apache.commons:commons-lang3:3.14.0' + implementation 'org.slf4j:slf4j-api:2.0.9' testImplementation 'org.assertj:assertj-core:3.24.2' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.1' diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskObjectMapper.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskObjectMapper.java index 443afaa3b..fce4fdfbc 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskObjectMapper.java +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskObjectMapper.java @@ -16,11 +16,11 @@ package org.asteriskjava.core.databind; import org.asteriskjava.core.NewlineDelimiter; -import org.asteriskjava.core.databind.writer.AsteriskObjectMethodWriter; +import org.asteriskjava.core.databind.reader.AsteriskObjectReader; import org.asteriskjava.core.databind.writer.AsteriskObjectWriter; import java.util.Comparator; -import java.util.List; +import java.util.Map; import static java.util.Objects.requireNonNull; import static org.asteriskjava.core.NewlineDelimiter.CRLF; @@ -39,22 +39,14 @@ private AsteriskObjectMapper(NewlineDelimiter newlineDelimiter, Comparator clazz = value.getClass(); - - AsteriskObjectWriter asteriskObjectWriter = new AsteriskObjectWriter(clazz, fieldNamesComparator); - - return writeValue(value, asteriskObjectWriter); + public String writeValueAsString(Object value) { + AsteriskObjectWriter asteriskObjectWriter = new AsteriskObjectWriter(newlineDelimiter, fieldNamesComparator); + return asteriskObjectWriter.write(value); } - private String writeValue(Object value, AsteriskObjectWriter asteriskObjectWriter) { - AsteriskGenerator asteriskGenerator = new AsteriskGenerator(newlineDelimiter); - List asteriskObjectMethodWriters = asteriskObjectWriter.getAsteriskObjectMethodWriters(); - for (AsteriskObjectMethodWriter asteriskObjectMethodWriter : asteriskObjectMethodWriters) { - asteriskObjectMethodWriter.writeName(asteriskGenerator); - asteriskObjectMethodWriter.writeValue(value, asteriskGenerator); - } - return asteriskGenerator.generate(); + public T readValue(Map content, Class clazz) { + AsteriskObjectReader asteriskObjectReader = new AsteriskObjectReader(); + return asteriskObjectReader.read(content, clazz); } public static Builder builder() { diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/TypeConversionRegister.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/TypeConversionRegister.java new file mode 100644 index 000000000..18344f3b6 --- /dev/null +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/TypeConversionRegister.java @@ -0,0 +1,88 @@ +/* + * Copyright 2004-2023 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.core.databind; + +import java.time.Instant; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; + +/** + * Manages different converters for data types. + * + * @author Piotr Olaszewski + * @since 4.0.0 + */ +public class TypeConversionRegister { + public static final Map, Map, Converter>> TYPE_CONVERTERS = new ConcurrentHashMap<>(); + + static { + convertFromString().to(Instant.class).register(Instant::parse); + convertFromString().to(Integer.class).register(Integer::valueOf); + convertFromString().to(String.class).register(Object::toString); + } + + private TypeConversionRegister() { + } + + public static TypeConverter convertFrom(Class sourceType) { + return new TypeConverter<>(sourceType); + } + + public static TypeConverter convertFromString() { + return convertFrom(String.class); + } + + public static class TypeConverter { + private final Class sourceType; + + TypeConverter(Class sourceType) { + this.sourceType = sourceType; + } + + public Registrar to(Class targetType) { + return new Registrar<>(sourceType, targetType); + } + + public static class Registrar { + private final Class sourceType; + private final Class targetType; + + Registrar(Class sourceType, Class targetType) { + this.sourceType = sourceType; + this.targetType = targetType; + } + + public void register(Converter converter) { + TYPE_CONVERTERS.computeIfAbsent(targetType, k -> new HashMap<>()).put(sourceType, converter); + } + } + } + + @FunctionalInterface + public interface Converter extends Function { + T applyWithException(S source) throws Exception; + + default T apply(S source) { + try { + return applyWithException(source); + } catch (Exception ignored) { + return null; + } + } + } +} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/annotation/AsteriskDeserialize.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/annotation/AsteriskDeserialize.java new file mode 100644 index 000000000..0d74e4cee --- /dev/null +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/annotation/AsteriskDeserialize.java @@ -0,0 +1,39 @@ +/* + * Copyright 2004-2023 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.core.databind.annotation; + +import org.asteriskjava.core.databind.deserializer.AsteriskDeserializer; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * Annotation used for configuring deserialization aspects, by attaching to "setter" methods. + * + * @author Piotr Olaszewski + * @since 4.0.0 + */ +@Target({METHOD}) +@Retention(RUNTIME) +public @interface AsteriskDeserialize { + /** + * Deserializer class to use for deserializing associated value. + */ + Class> value(); +} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/deserializer/AsteriskDeserializer.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/deserializer/AsteriskDeserializer.java new file mode 100644 index 000000000..4e4f2b44a --- /dev/null +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/deserializer/AsteriskDeserializer.java @@ -0,0 +1,32 @@ +/* + * Copyright 2004-2023 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.core.databind.deserializer; + +/** + * Interface representing a deserializer for a given type. + * + * @param type of the deserialized value + * @author Piotr Olaszewski + * @since 4.0.0 + */ +public interface AsteriskDeserializer { + /** + * Deserializes object into Asterisk string. + * + * @return deserialized value + */ + T deserialize(String value); +} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/deserializer/custom/EqualsSignDeserializer.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/deserializer/custom/EqualsSignDeserializer.java new file mode 100644 index 000000000..3b4240949 --- /dev/null +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/deserializer/custom/EqualsSignDeserializer.java @@ -0,0 +1,35 @@ +/* + * Copyright 2004-2023 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.core.databind.deserializer.custom; + +import org.apache.commons.lang3.tuple.Pair; +import org.asteriskjava.core.databind.deserializer.AsteriskDeserializer; + +/** + * Deserializer for splitting collection elements using the {@code =} sign. + * + * @author Piotr Olaszewski + * @since 4.0.0 + */ +public class EqualsSignDeserializer implements AsteriskDeserializer> { + private static final String EQUALS_SIGN_SEPARATOR = "="; + + @Override + public Pair deserialize(String value) { + String[] split = value.split(EQUALS_SIGN_SEPARATOR); + return Pair.of(split[0], split[1]); + } +} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/reader/AsteriskObjectReader.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/reader/AsteriskObjectReader.java new file mode 100644 index 000000000..d0cb5dc08 --- /dev/null +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/reader/AsteriskObjectReader.java @@ -0,0 +1,194 @@ +/* + * Copyright 2004-2023 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.core.databind.reader; + +import org.apache.commons.lang3.tuple.Pair; +import org.asteriskjava.core.databind.TypeConversionRegister; +import org.asteriskjava.core.databind.TypeConversionRegister.Converter; +import org.asteriskjava.core.databind.annotation.AsteriskDeserialize; +import org.asteriskjava.core.databind.deserializer.AsteriskDeserializer; +import org.slf4j.Logger; + +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import static java.util.Arrays.stream; +import static java.util.stream.Collectors.toMap; +import static org.asteriskjava.core.databind.utils.AnnotationUtils.getName; +import static org.asteriskjava.core.databind.utils.Invoker.invokeOn; +import static org.asteriskjava.core.databind.utils.ReflectionUtils.getSetters; +import static org.slf4j.LoggerFactory.getLogger; + +/** + * Reader class to read content and transform for the desired object. + * + * @author Piotr Olaszewski + * @since 4.0.0 + */ +public class AsteriskObjectReader { + private static final Logger logger = getLogger(AsteriskObjectReader.class); + + public T read(Map content, Class clazz) { + Map setters = getSetters(clazz) + .entrySet() + .stream() + .collect(toMap(e -> getName(e.getValue(), e.getKey()), Entry::getValue)); + + T resultObject = instantiateResultClass(clazz); + for (Entry entry : content.entrySet()) { + handleEntry(entry, setters, resultObject); + } + return resultObject; + } + + private static T instantiateResultClass(Class clazz) { + try { + return clazz.getConstructor().newInstance(); + } catch (Exception e) { + throw new RuntimeException("Cannot instantiate result class %s".formatted(clazz), e); + } + } + + private static void handleEntry(Entry entry, Map setters, T resultObject) { + Object currentValue = entry.getValue(); + + Method method = setters.getOrDefault(entry.getKey(), null); + if (method == null) { + logger.warn("Unable to set the '{}' property to the value '{}' in the '{}' class. There is no setter method available. " + + "Please report at https://github.com/asterisk-java/asterisk-java/issues.", + entry.getKey(), currentValue, resultObject.getClass().getName()); + return; + } + + Object value = getValue(currentValue, method); + invokeOn(resultObject).method(method).withParameter(value); + } + + private static Object getValue(Object currentValue, Method method) { + Class targetDataType = method.getParameterTypes()[0]; + if (targetDataType.isEnum()) { + return parseEnum(method, currentValue); + } else if (targetDataType.isAssignableFrom(List.class)) { + return parseList(method, currentValue); + } else if (targetDataType.isAssignableFrom(Map.class)) { + return parseMap(method, currentValue); + } else { + return parseOtherType(method, currentValue); + } + } + + private static Enum parseEnum(Method method, Object currentValue) { + Class targetDataType = method.getParameterTypes()[0]; + return (Enum) stream(targetDataType.getEnumConstants()) + .filter(t -> t.toString().equals(String.valueOf(currentValue))) + .findFirst() + .orElse(null); + } + + private static List parseList(Method method, Object currentValue) { + ParameterizedType genericParameter = (ParameterizedType) method.getGenericParameterTypes()[0]; + Class listElementType = (Class) genericParameter.getActualTypeArguments()[0]; + + Map, Converter> conversions = TypeConversionRegister.TYPE_CONVERTERS.get(listElementType); + + return ((List) currentValue) + .stream() + .map(object -> { + @SuppressWarnings("rawtypes") + Converter converter = conversions.get(object.getClass()); + //noinspection unchecked + return converter.apply(object); + }) + .toList(); + } + + private static Map parseMap(Method method, Object currentValue) { + AsteriskDeserializer> asteriskDeserializer = getAsteriskDeserializer(method); + + ParameterizedType genericParameter = (ParameterizedType) method.getGenericParameterTypes()[0]; + Class mapKeyType = (Class) genericParameter.getActualTypeArguments()[0]; + Class mapValueType = (Class) genericParameter.getActualTypeArguments()[1]; + + Map, Converter> keyConversions = TypeConversionRegister.TYPE_CONVERTERS.get(mapKeyType); + Map, Converter> valueConversions = TypeConversionRegister.TYPE_CONVERTERS.get(mapValueType); + + if (currentValue instanceof List) { + Map map = new LinkedHashMap<>(); + for (Object item : (List) currentValue) { + Pair converted = convertMapItem(item, asteriskDeserializer, keyConversions, valueConversions); + map.put(converted.getKey(), converted.getValue()); + } + return map; + } else { + Pair converted = convertMapItem(currentValue, asteriskDeserializer, keyConversions, valueConversions); + return Map.of(converted.getKey(), converted.getValue()); + } + } + + private static Object parseOtherType(Method method, Object currentValue) { + Class sourceType = currentValue.getClass(); + Class targetType = method.getParameterTypes()[0]; + + Map, Converter> conversions = TypeConversionRegister.TYPE_CONVERTERS.get(targetType); + @SuppressWarnings("rawtypes") + Converter converter = conversions.get(sourceType); + //noinspection unchecked + return converter.apply(currentValue); + } + + private static AsteriskDeserializer> getAsteriskDeserializer(Method method) { + AsteriskDeserialize asteriskDeserialize = method.getAnnotation(AsteriskDeserialize.class); + if (asteriskDeserialize == null) { + throw new RuntimeException("Map should have defined deserializer"); + } + + try { + Class> asteriskDeserializerClass = asteriskDeserialize.value(); + //noinspection unchecked + return (AsteriskDeserializer>) asteriskDeserializerClass.getDeclaredConstructor().newInstance(); + } catch (Exception e) { + throw new RuntimeException("Cannot create new instance of deserializer %s".formatted(asteriskDeserialize), e); + } + } + + private static Pair convertMapItem( + Object object, + AsteriskDeserializer> asteriskDeserializer, + Map, Converter> keyConversions, + Map, Converter> valueConversions + ) { + Pair deserialize = asteriskDeserializer.deserialize(String.valueOf(object)); + + @SuppressWarnings("rawtypes") + Converter keyConverter = keyConversions.get(String.class); + @SuppressWarnings("rawtypes") + Converter valueConverter = valueConversions.get(String.class); + + String key = String.valueOf(deserialize.getKey()); + @SuppressWarnings("unchecked") + Object keyValue = keyConverter.apply(key); + + String value = String.valueOf(deserialize.getValue()); + @SuppressWarnings("unchecked") + Object valueValue = valueConverter.apply(value); + + return Pair.of(keyValue, valueValue); + } +} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/AnnotationUtils.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/AnnotationUtils.java new file mode 100644 index 000000000..d0cfebc24 --- /dev/null +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/AnnotationUtils.java @@ -0,0 +1,36 @@ +/* + * Copyright 2004-2023 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.core.databind.utils; + +import org.asteriskjava.core.databind.annotation.AsteriskName; + +import java.lang.reflect.Method; + +/** + * Convenient class for handling annotations. + * + * @author Piotr Olaszewski + * @since 4.0.0 + */ +public final class AnnotationUtils { + private AnnotationUtils() { + } + + public static String getName(Method method, String name) { + AsteriskName asteriskName = method.getAnnotation(AsteriskName.class); + return asteriskName == null ? name : asteriskName.value(); + } +} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/Invoker.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/Invoker.java new file mode 100644 index 000000000..3e873340c --- /dev/null +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/Invoker.java @@ -0,0 +1,66 @@ +/* + * Copyright 2004-2023 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.core.databind.utils; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import static org.asteriskjava.core.databind.utils.Invoker.MethodInvoker.method; + +/** + * Helper for invoking methods via reflection. + *

+ * Examples: + *

+ * invokeOn(object).method(method).withoutParameter();
+ * invokeOn(object).method(method).withParameter("some param");
+ * 
+ * + * @author Piotr Olaszewski + * @since 4.0.0 + */ +@FunctionalInterface +public interface Invoker { + String WITHOUT_PARAMETER_MARKER = ""; + + Object withParameter(Object value); + + default Object withoutParameter() { + return withParameter(WITHOUT_PARAMETER_MARKER); + } + + static MethodInvoker invokeOn(Object object) { + return method -> method(method, object); + } + + @FunctionalInterface + interface MethodInvoker { + Invoker method(Method method); + + static Invoker method(Method method, Object object) { + return value -> { + try { + if (value == WITHOUT_PARAMETER_MARKER) { + return method.invoke(object); + } + return method.invoke(object, value); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + }; + } + } +} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/ReflectionUtils.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/ReflectionUtils.java index f0ba07852..eee2cde55 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/ReflectionUtils.java +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/ReflectionUtils.java @@ -24,12 +24,17 @@ import static java.lang.reflect.Modifier.*; /** - * Convenient class to deal with getters from mapped classes. + * Convenient class to deal with getters and setters from mapped classes. * + * @author Stefan Reuter + * @author Robert Sutton * @author Piotr Olaszewski - * @since 4.0.0 + * @since 1.0.0 */ public final class ReflectionUtils { + private ReflectionUtils() { + } + /** * Returns a {@link Map} of getter methods of the given class. *

@@ -47,24 +52,24 @@ public static Map getGetters(Class clazz, Comparator Method[] methods = clazz.getMethods(); for (Method method : methods) { + String methodName = method.getName(); if (method.getParameterCount() > 0 || method.getReturnType() == Void.TYPE || !isPublic(method.getModifiers()) || isNative(method.getModifiers()) || isAbstract(method.getModifiers()) || isStatic(method.getModifiers()) || - method.getName().equals("toString") + methodName.equals("toString") ) { continue; } String name = null; - String methodName = method.getName(); if (methodName.startsWith("get")) { - name = methodName.substring(3); + name = methodName.substring("get".length()); } else if (methodName.startsWith("is")) { - name = methodName.substring(2); + name = methodName.substring("is".length()); } if (name == null || name.isEmpty()) { @@ -78,7 +83,7 @@ public static Map getGetters(Class clazz, Comparator } /** - * Returns a Map of getter methods of the given class. + * Returns a {@link Map} of getter methods of the given class. * * @param clazz the class to return the getters for * @return a Map of attributes and their accessor methods (getters) @@ -87,4 +92,37 @@ public static Map getGetters(Class clazz, Comparator public static Map getGetters(Class clazz) { return getGetters(clazz, null); } + + /** + * Returns a {@link Map} of setter methods of the given class. + *

+ * The key of the map contains the name of the attribute that can be accessed by the setter, the value the setter + * itself (an instance of {@link Method}). A method is considered a setter if its name starts with 'set', it is + * declared public and takes exactly one argument. + * + * @param clazz the class to return the setters for + * @return a Map of attributes and their accessor methods (setters) + */ + public static Map getSetters(Class clazz) { + Map accessors = new LinkedHashMap<>(); + + Method[] methods = clazz.getMethods(); + for (Method method : methods) { + String methodName = method.getName(); + if (!methodName.startsWith("set") || + method.getParameterCount() != 1 || + !isPublic(method.getModifiers()) || + isNative(method.getModifiers()) || + isAbstract(method.getModifiers()) || + isStatic(method.getModifiers()) || + methodName.equals("toString") + ) { + continue; + } + + String name = methodName.substring("set".length()); + accessors.put(name, method); + } + return accessors; + } } diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriter.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriter.java index 5ee56ca3e..171854ae3 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriter.java +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriter.java @@ -18,22 +18,23 @@ import org.asteriskjava.core.databind.AsteriskGenerator; import org.asteriskjava.core.databind.serializer.AsteriskSerializer; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import static org.asteriskjava.core.databind.utils.Invoker.invokeOn; + /** * Writer class to write field names and serialized values using the {@link AsteriskGenerator}. * * @author Piotr Olaszewski * @since 4.0.0 */ -public class AsteriskObjectMethodWriter { +class AsteriskObjectMethodWriter { private final Method method; private final String name; private final AsteriskSerializer asteriskSerializer; private final AsteriskObjectMethodWriterContext asteriskObjectMethodWriterContext; - public AsteriskObjectMethodWriter( + AsteriskObjectMethodWriter( Method method, String name, AsteriskSerializer asteriskSerializer, @@ -45,22 +46,14 @@ public AsteriskObjectMethodWriter( this.asteriskObjectMethodWriterContext = asteriskObjectMethodWriterContext; } - public void writeName(AsteriskGenerator asteriskGenerator) { + void writeName(AsteriskGenerator asteriskGenerator) { if (!asteriskObjectMethodWriterContext.serializerWriteFieldName()) { asteriskGenerator.writeFieldName(name); } } - public void writeValue(Object obj, AsteriskGenerator asteriskGenerator) { - Object currentValue = getCurrentValue(obj); + void writeValue(Object obj, AsteriskGenerator asteriskGenerator) { + Object currentValue = invokeOn(obj).method(method).withoutParameter(); asteriskSerializer.serialize(name, currentValue, asteriskGenerator); } - - private Object getCurrentValue(Object obj) { - try { - return method.invoke(obj); - } catch (IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException(e); - } - } } diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriterContext.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriterContext.java index 26b03ce59..7d903a6d0 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriterContext.java +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriterContext.java @@ -22,5 +22,5 @@ * @author Piotr Olaszewski * @since 4.0.0 */ -public record AsteriskObjectMethodWriterContext(boolean serializerWriteFieldName) { +record AsteriskObjectMethodWriterContext(boolean serializerWriteFieldName) { } diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectWriter.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectWriter.java index a73bf61c5..1b6d0ddfe 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectWriter.java +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectWriter.java @@ -15,7 +15,8 @@ */ package org.asteriskjava.core.databind.writer; -import org.asteriskjava.core.databind.annotation.AsteriskName; +import org.asteriskjava.core.NewlineDelimiter; +import org.asteriskjava.core.databind.AsteriskGenerator; import org.asteriskjava.core.databind.annotation.AsteriskSerialize; import org.asteriskjava.core.databind.serializer.AsteriskSerializer; import org.asteriskjava.core.databind.serializer.WritableFileName; @@ -26,6 +27,7 @@ import java.util.List; import java.util.Map.Entry; +import static org.asteriskjava.core.databind.utils.AnnotationUtils.getName; import static org.asteriskjava.core.databind.utils.ReflectionUtils.getGetters; /** @@ -33,15 +35,26 @@ * @since 4.0.0 */ public class AsteriskObjectWriter { - private final Class clazz; private final Comparator fieldNamesComparator; + private final NewlineDelimiter newlineDelimiter; - public AsteriskObjectWriter(Class clazz, Comparator fieldNamesComparator) { - this.clazz = clazz; + public AsteriskObjectWriter(NewlineDelimiter newlineDelimiter, Comparator fieldNamesComparator) { this.fieldNamesComparator = fieldNamesComparator; + this.newlineDelimiter = newlineDelimiter; } - public List getAsteriskObjectMethodWriters() { + public String write(Object value) { + Class clazz = value.getClass(); + AsteriskGenerator asteriskGenerator = new AsteriskGenerator(newlineDelimiter); + List asteriskObjectMethodWriters = getAsteriskObjectMethodWriters(clazz); + for (AsteriskObjectMethodWriter asteriskObjectMethodWriter : asteriskObjectMethodWriters) { + asteriskObjectMethodWriter.writeName(asteriskGenerator); + asteriskObjectMethodWriter.writeValue(value, asteriskGenerator); + } + return asteriskGenerator.generate(); + } + + private List getAsteriskObjectMethodWriters(Class clazz) { return getGetters(clazz, fieldNamesComparator) .entrySet() .stream() @@ -62,11 +75,6 @@ private AsteriskObjectMethodWriter getAsteriskObjectMethodWriter(Entry getAsteriskSerializer(Method method) { AsteriskSerialize asteriskSerialize = method.getAnnotation(AsteriskSerialize.class); if (asteriskSerialize == null) { diff --git a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskObjectMapperTest.java b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskObjectMapperTest.java index 3ffae7024..2a6024c4e 100644 --- a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskObjectMapperTest.java +++ b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskObjectMapperTest.java @@ -1,15 +1,38 @@ +/* + * Copyright 2004-2023 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.core.databind; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.asteriskjava.core.databind.annotation.AsteriskDeserialize; import org.asteriskjava.core.databind.annotation.AsteriskName; import org.asteriskjava.core.databind.annotation.AsteriskSerialize; +import org.asteriskjava.core.databind.deserializer.custom.EqualsSignDeserializer; import org.asteriskjava.core.databind.serializer.custom.ComaJoiningSerializer; import org.junit.jupiter.api.Test; +import java.time.Instant; import java.util.List; +import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; import static org.asteriskjava.core.NewlineDelimiter.CRLF; import static org.asteriskjava.core.databind.AsteriskObjectMapper.builder; +import static org.asteriskjava.core.databind.AsteriskObjectMapperTest.Base.ResponseType.Goodbye; import static org.asteriskjava.core.databind.AsteriskObjectMapperTest.SimpleBean.AuthType.MD5; class AsteriskObjectMapperTest { @@ -18,7 +41,7 @@ class AsteriskObjectMapperTest { .build(); @Test - void shouldGenerateSimpleBean() { + void shouldWriteAsStringForSimpleTypes() { //given SimpleBean bean = new SimpleBean(); bean.setActionId("id-1"); @@ -26,7 +49,7 @@ void shouldGenerateSimpleBean() { bean.setCodecs(List.of("codec1", "codec2")); //when - String string = asteriskObjectMapper.writeValue(bean); + String string = asteriskObjectMapper.writeValueAsString(bean); //then String expected = "Action: SimpleBean" + CRLF.getPattern(); @@ -77,4 +100,291 @@ public void setCodecs(List codecs) { this.codecs = codecs; } } + + @Test + void shouldReadForSimpleTypes() { + //given + Instant date = Instant.parse("2023-11-20T20:33:30.002Z"); + + Map content = Map.of( + "ActionID", "id-1", + "DateReceived", date.toString(), + "Challenge", "123456", + "Response", "Goodbye" + ); + + //when + SomeClass someClass = asteriskObjectMapper.readValue(content, SomeClass.class); + + //then + SomeClass expected = new SomeClass(); + expected.setChallenge("123456"); + expected.setActionId("id-1"); + expected.setDateReceived(date); + expected.setResponse(Goodbye); + assertThat(someClass).isEqualTo(expected); + } + + @Test + void shouldReadContentWithList() { + //given + Map content = Map.of( + "Number", List.of("1", "2", "3") + ); + + //when + SomeClass2 someClass = asteriskObjectMapper.readValue(content, SomeClass2.class); + + //then + SomeClass2 expected = new SomeClass2(); + expected.setNumbers(List.of(1, 2, 3)); + assertThat(someClass).isEqualTo(expected); + } + + @Test + void shouldReadContentWithListWhichShouldBeAMap() { + //given + Map content = Map.of( + "Header", List.of("1=name1", "2=name2", "3=name3") + ); + + //when + SomeClass3 someClass = asteriskObjectMapper.readValue(content, SomeClass3.class); + + //then + Map map = Map.of( + 1, "name1", + 2, "name2", + 3, "name3" + ); + SomeClass3 expected = new SomeClass3(); + expected.setHeaders(map); + assertThat(someClass).isEqualTo(expected); + } + + @Test + void shouldReadContentWithMap() { + //given + Map content = Map.of("Header", "1=name1"); + + //when + SomeClass3 someClass = asteriskObjectMapper.readValue(content, SomeClass3.class); + + //then + Map map = Map.of(1, "name1"); + SomeClass3 expected = new SomeClass3(); + expected.setHeaders(map); + assertThat(someClass).isEqualTo(expected); + } + + public static class Base { + public enum ResponseType { + Success, + Error, + Goodbye, + } + + private ResponseType response; + + private Instant dateReceived; + + private String actionId; + + public ResponseType getResponse() { + return response; + } + + public void setResponse(ResponseType response) { + this.response = response; + } + + public Instant getDateReceived() { + return dateReceived; + } + + public void setDateReceived(Instant dateReceived) { + this.dateReceived = dateReceived; + } + + public String getActionId() { + return actionId; + } + + @AsteriskName("ActionID") + public void setActionId(String actionId) { + this.actionId = actionId; + } + + @Override + public boolean equals(Object object) { + if (this == object) { + return true; + } + + if (object == null || getClass() != object.getClass()) { + return false; + } + + Base base = (Base) object; + + return new EqualsBuilder() + .append(response, base.response) + .append(dateReceived, base.dateReceived) + .append(actionId, base.actionId) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(response) + .append(dateReceived) + .append(actionId) + .toHashCode(); + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("response", response) + .append("dateReceived", dateReceived) + .append("actionId", actionId) + .toString(); + } + } + + public static class SomeClass extends Base { + private String challenge; + + public String getChallenge() { + return challenge; + } + + public void setChallenge(String challenge) { + this.challenge = challenge; + } + + @Override + public boolean equals(Object object) { + if (this == object) { + return true; + } + + if (object == null || getClass() != object.getClass()) { + return false; + } + + SomeClass someClass = (SomeClass) object; + + return new EqualsBuilder() + .appendSuper(super.equals(object)) + .append(challenge, someClass.challenge) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .appendSuper(super.hashCode()) + .append(challenge) + .toHashCode(); + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .appendSuper(super.toString()) + .append("challenge", challenge) + .toString(); + } + } + + public static class SomeClass2 { + private List numbers; + + public List getNumbers() { + return numbers; + } + + @AsteriskName("Number") + public void setNumbers(List numbers) { + this.numbers = numbers; + } + + @Override + public boolean equals(Object object) { + if (this == object) { + return true; + } + + if (object == null || getClass() != object.getClass()) { + return false; + } + + SomeClass2 someClass = (SomeClass2) object; + + return new EqualsBuilder() + .append(numbers, someClass.numbers) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(numbers) + .toHashCode(); + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("numbers", numbers) + .toString(); + } + } + + public static class SomeClass3 { + private Map headers; + + public Map getHeaders() { + return headers; + } + + @AsteriskName("Header") + @AsteriskDeserialize(EqualsSignDeserializer.class) + public void setHeaders(Map headers) { + this.headers = headers; + } + + @Override + public boolean equals(Object object) { + if (this == object) { + return true; + } + + if (object == null || getClass() != object.getClass()) { + return false; + } + + SomeClass3 someClass = (SomeClass3) object; + + return new EqualsBuilder() + .append(headers, someClass.headers) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(headers) + .toHashCode(); + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("headers", headers) + .toString(); + } + } } diff --git a/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java index d93ca80c2..ffc752ce1 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java @@ -86,7 +86,7 @@ public String buildAction(final ManagerAction action, final String internalActio if (action.getClass().getPackageName().contains("org.asteriskjava.ami.action")) { action.setActionId(actionId); - return asteriskObjectMapper.writeValue(action); + return asteriskObjectMapper.writeValueAsString(action); } StringBuilder sb = new StringBuilder(); diff --git a/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java b/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java index 7f9541d45..83837959b 100644 --- a/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java +++ b/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java @@ -29,6 +29,7 @@ import java.util.Map; import java.util.Set; +import static java.util.Arrays.stream; import static org.slf4j.LoggerFactory.getLogger; /** @@ -123,6 +124,11 @@ public static void setAttributes(Object target, Map attributes, value = parseLong(entry); } else if (dataType.isAssignableFrom(int.class) || dataType.isAssignableFrom(Integer.class)) { value = parseInteger(entry); + } else if (dataType.isEnum()) { + value = stream(dataType.getEnumConstants()) + .filter(t -> t.toString().equals(entry.getValue())) + .findFirst() + .orElse(null); } else { try { Constructor constructor = dataType.getConstructor(String.class); diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerResponse.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerResponse.java index c979264b5..f81d6cbf0 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerResponse.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerResponse.java @@ -23,10 +23,10 @@ public class ManagerResponse { final private Map _attributes; public ManagerResponse(org.asteriskjava.ami.action.response.ManagerResponse response) { - this._dateReceived = response.getDateReceived(); + this._dateReceived = Date.from(response.getDateReceived()); this._actionId = response.getActionId(); this._server = response.getServer(); - this._response = response.getResponse(); + this._response = response.getResponse().toString(); this._eventList = response.getEventList(); this._uniqueId = response.getUniqueId(); this._attributes = response.getAttributes(); From 95f2d7b80b26d3ed9d4a37dee566ac6edd065df1 Mon Sep 17 00:00:00 2001 From: Piotr Olaszewski Date: Thu, 7 Dec 2023 17:31:30 +0100 Subject: [PATCH 07/10] Fix falling tests --- .../asteriskjava/ami/action/response/ResponseType.java | 2 ++ .../manager/internal/ManagerConnectionImplTest.java | 2 +- .../manager/internal/ManagerReaderImplTest.java | 9 +++++---- .../manager/internal/ResponseBuilderImplTest.java | 5 +++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ResponseType.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ResponseType.java index 48e2cdebc..c89d3835a 100644 --- a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ResponseType.java +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ResponseType.java @@ -26,4 +26,6 @@ public enum ResponseType { Success, Error, Goodbye, + //todo check is sill in use + Follows, } diff --git a/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java b/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java index dd034d5eb..5bb06948f 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java @@ -334,7 +334,7 @@ void testSendAction() throws Exception { assertEquals("123", statusAction.getActionId(), "incorrect actionId in action"); assertEquals("123", response.getActionId(), "incorrect actionId in response"); - assertEquals("Success", response.getResponse(), "incorrect response"); + assertEquals(ResponseType.Success, response.getResponse(), "incorrect response"); assertEquals(1, mockWriter.otherActionsSent, "other actions not sent 1 time"); } diff --git a/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java b/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java index 5fb37e8a9..9ef366c6a 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java @@ -17,6 +17,7 @@ package org.asteriskjava.manager.internal; import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ResponseType; import org.asteriskjava.manager.event.*; import org.asteriskjava.manager.response.CommandResponse; import org.asteriskjava.util.DateUtil; @@ -208,13 +209,13 @@ void testRunReceivingResponse() throws Exception { assertEquals(1, dispatcher.dispatchedResponses.size(), "not exactly one response dispatched"); assertEquals(ManagerResponse.class, dispatcher.dispatchedResponses.get(0).getClass(), "first response must be a ManagerResponse"); - assertEquals("Success", dispatcher.dispatchedResponses.get(0).getResponse(), "ManagerResponse contains incorrect response"); + assertEquals(ResponseType.Success, dispatcher.dispatchedResponses.get(0).getResponse(), "ManagerResponse contains incorrect response"); assertEquals("Authentication accepted", dispatcher.dispatchedResponses.get(0).getMessage(), "ManagerResponse contains incorrect message"); assertEquals("Authentication accepted", dispatcher.dispatchedResponses.get(0).getAttribute("MESSAGE"), "ManagerResponse contains incorrect message (via getAttribute)"); - assertEquals(now, dispatcher.dispatchedResponses.get(0).getDateReceived(), "ManagerResponse contains incorrect dateReceived"); + assertEquals(now, Date.from(dispatcher.dispatchedResponses.get(0).getDateReceived()), "ManagerResponse contains incorrect dateReceived"); assertEquals(1, dispatcher.dispatchedEvents.size(), "not exactly one events dispatched"); @@ -243,7 +244,7 @@ void testRunReceivingCommandResponse() throws Exception { assertEquals(CommandResponse.class, dispatcher.dispatchedResponses.get(0).getClass(), "first response must be a CommandResponse"); - assertEquals("Follows", dispatcher.dispatchedResponses.get(0).getResponse(), "CommandResponse contains incorrect response"); + assertEquals(ResponseType.Follows, dispatcher.dispatchedResponses.get(0).getResponse(), "CommandResponse contains incorrect response"); assertEquals("678#12345", dispatcher.dispatchedResponses.get(0).getActionId(), "CommandResponse contains incorrect actionId"); @@ -251,7 +252,7 @@ void testRunReceivingCommandResponse() throws Exception { assertEquals(result, ((CommandResponse) dispatcher.dispatchedResponses.get(0)).getResult(), "CommandResponse contains incorrect result"); - assertEquals(now, dispatcher.dispatchedResponses.get(0).getDateReceived(), "CommandResponse contains incorrect dateReceived"); + assertEquals(now, Date.from(dispatcher.dispatchedResponses.get(0).getDateReceived()), "CommandResponse contains incorrect dateReceived"); } @Test diff --git a/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java b/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java index 52bb3ec54..43df7c042 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java @@ -18,6 +18,7 @@ import org.asteriskjava.ami.action.response.ChallengeResponse; import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ResponseType; import org.asteriskjava.manager.response.ExtensionStateResponse; import org.asteriskjava.manager.response.MailboxCountResponse; import org.asteriskjava.manager.response.MailboxStatusResponse; @@ -48,7 +49,7 @@ void testBuildResponse() { response = responseBuilder.buildResponse(ManagerResponse.class, attributes); assertEquals(ManagerResponse.class, response.getClass(), "Response of wrong type"); - assertEquals("Success", response.getResponse(), "Response not set correctly"); + assertEquals(ResponseType.Success, response.getResponse(), "Response not set correctly"); } @Test @@ -59,7 +60,7 @@ void testBuildResponseWithoutResponseClass() { response = responseBuilder.buildResponse(null, attributes); assertEquals(ManagerResponse.class, response.getClass(), "Response of wrong type"); - assertEquals("Success", response.getResponse(), "Response not set correctly"); + assertEquals(ResponseType.Success, response.getResponse(), "Response not set correctly"); } @Test From e75a036b814d90bfb2b73188bf2c3143bbb0501f Mon Sep 17 00:00:00 2001 From: Piotr Olaszewski Date: Fri, 8 Dec 2023 18:26:54 +0100 Subject: [PATCH 08/10] Add simple databinder --- .../ami/action/ChallengeActionItTest.java | 15 +- asterisk-java-core/build.gradle | 1 + ...ObjectReader.java => AsteriskDecoder.java} | 122 ++++++------- .../core/databind/AsteriskEncoder.java | 158 +++++++++++++++++ .../core/databind/AsteriskGenerator.java | 49 ------ .../core/databind/AsteriskObjectMapper.java | 82 --------- .../core/databind/TypeConversionRegister.java | 10 +- .../annotation/AsteriskDeserialize.java | 39 ----- .../annotation/AsteriskSerialize.java | 39 ----- .../deserializer/AsteriskDeserializer.java | 32 ---- .../custom/EqualsSignDeserializer.java | 35 ---- .../serializer/AsteriskSerializer.java | 36 ---- .../databind/serializer/WritableFileName.java | 27 --- .../custom/ComaJoiningSerializer.java | 43 ----- .../serializer/custom/VariableSerializer.java | 54 ------ .../serializer/std/ToStringSerializer.java | 38 ---- .../core/databind/utils/ReflectionUtils.java | 26 +-- .../writer/AsteriskObjectMethodWriter.java | 59 ------- .../AsteriskObjectMethodWriterContext.java | 26 --- .../databind/writer/AsteriskObjectWriter.java | 92 ---------- ...pperTest.java => AsteriskDecoderTest.java} | 164 +++++------------- .../core/databind/AsteriskEncoderTest.java | 158 +++++++++++++++++ .../custom/ComaJoiningSerializerTest.java | 63 ------- .../custom/VariableSerializerTest.java | 51 ------ .../std/ToStringSerializerTest.java | 53 ------ .../databind/utils/ReflectionUtilsTest.java | 20 --- .../manager/internal/ActionBuilderImpl.java | 8 +- .../manager/internal/ResponseBuilderImpl.java | 12 +- .../internal/ResponseBuilderImplTest.java | 2 - 29 files changed, 447 insertions(+), 1067 deletions(-) rename asterisk-java-core/src/main/java/org/asteriskjava/core/databind/{reader/AsteriskObjectReader.java => AsteriskDecoder.java} (54%) create mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskEncoder.java delete mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskGenerator.java delete mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskObjectMapper.java delete mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/annotation/AsteriskDeserialize.java delete mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/annotation/AsteriskSerialize.java delete mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/deserializer/AsteriskDeserializer.java delete mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/deserializer/custom/EqualsSignDeserializer.java delete mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/AsteriskSerializer.java delete mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/WritableFileName.java delete mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/custom/ComaJoiningSerializer.java delete mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/custom/VariableSerializer.java delete mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializer.java delete mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriter.java delete mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriterContext.java delete mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectWriter.java rename asterisk-java-core/src/test/java/org/asteriskjava/core/databind/{AsteriskObjectMapperTest.java => AsteriskDecoderTest.java} (61%) create mode 100644 asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskEncoderTest.java delete mode 100644 asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/custom/ComaJoiningSerializerTest.java delete mode 100644 asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/custom/VariableSerializerTest.java delete mode 100644 asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializerTest.java diff --git a/asterisk-java-ami/src/test/java/org/asteriskjava/ami/action/ChallengeActionItTest.java b/asterisk-java-ami/src/test/java/org/asteriskjava/ami/action/ChallengeActionItTest.java index 4ddbde09c..064cea193 100644 --- a/asterisk-java-ami/src/test/java/org/asteriskjava/ami/action/ChallengeActionItTest.java +++ b/asterisk-java-ami/src/test/java/org/asteriskjava/ami/action/ChallengeActionItTest.java @@ -12,40 +12,37 @@ import io.netty.handler.codec.string.StringEncoder; import io.netty.handler.timeout.IdleStateHandler; import org.asteriskjava.ami.ActionFieldsComparator; -import org.asteriskjava.core.databind.AsteriskObjectMapper; -import org.junit.jupiter.api.Test; +import org.asteriskjava.core.databind.AsteriskEncoder; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; import static java.util.concurrent.TimeUnit.SECONDS; import static org.asteriskjava.ami.action.AuthType.MD5; import static org.testcontainers.containers.BindMode.READ_ONLY; import static org.testcontainers.containers.wait.strategy.Wait.forLogMessage; -@Testcontainers +//@Testcontainers class ChallengeActionItTest { - @Container +// @Container static final GenericContainer asterisk = new GenericContainer<>("andrius/asterisk:alpine-18.15.1") .withClasspathResourceMapping("manager.conf", "/etc/asterisk/manager.conf", READ_ONLY) .withAccessToHost(true) .withExposedPorts(5038) .waitingFor(forLogMessage(".*Asterisk Ready.*", 1)); - @Test +// @Test void shouldName() throws InterruptedException { //given ChallengeAction challengeAction = new ChallengeAction(); challengeAction.setActionId("id-1"); challengeAction.setAuthType(MD5); - AsteriskObjectMapper asteriskObjectMapper = AsteriskObjectMapper + AsteriskEncoder asteriskEncoder = AsteriskEncoder .builder() .crlfNewlineDelimiter() .fieldNamesComparator(new ActionFieldsComparator()) .build(); - String action = asteriskObjectMapper.writeValueAsString(challengeAction); + String action = asteriskEncoder.encode(challengeAction); NioEventLoopGroup group = new NioEventLoopGroup(); Bootstrap bootstrap = new Bootstrap(); diff --git a/asterisk-java-core/build.gradle b/asterisk-java-core/build.gradle index 4ca89799b..2550e9805 100644 --- a/asterisk-java-core/build.gradle +++ b/asterisk-java-core/build.gradle @@ -21,6 +21,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.24.2' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.1' testImplementation 'org.mockito:mockito-core:5.7.0' + testImplementation 'org.slf4j:slf4j-simple:2.0.9' } tasks.named('test') { diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/reader/AsteriskObjectReader.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskDecoder.java similarity index 54% rename from asterisk-java-core/src/main/java/org/asteriskjava/core/databind/reader/AsteriskObjectReader.java rename to asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskDecoder.java index d0cb5dc08..558298089 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/reader/AsteriskObjectReader.java +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskDecoder.java @@ -13,13 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.asteriskjava.core.databind.reader; +package org.asteriskjava.core.databind; import org.apache.commons.lang3.tuple.Pair; -import org.asteriskjava.core.databind.TypeConversionRegister; import org.asteriskjava.core.databind.TypeConversionRegister.Converter; -import org.asteriskjava.core.databind.annotation.AsteriskDeserialize; -import org.asteriskjava.core.databind.deserializer.AsteriskDeserializer; import org.slf4j.Logger; import java.lang.reflect.Method; @@ -31,84 +28,96 @@ import static java.util.Arrays.stream; import static java.util.stream.Collectors.toMap; +import static org.asteriskjava.core.databind.TypeConversionRegister.TYPE_CONVERTERS; import static org.asteriskjava.core.databind.utils.AnnotationUtils.getName; import static org.asteriskjava.core.databind.utils.Invoker.invokeOn; import static org.asteriskjava.core.databind.utils.ReflectionUtils.getSetters; import static org.slf4j.LoggerFactory.getLogger; /** - * Reader class to read content and transform for the desired object. - * * @author Piotr Olaszewski * @since 4.0.0 */ -public class AsteriskObjectReader { - private static final Logger logger = getLogger(AsteriskObjectReader.class); +public class AsteriskDecoder { + private static final Logger logger = getLogger(AsteriskDecoder.class); + + private boolean caseSensitive = true; + + public AsteriskDecoder() { + } - public T read(Map content, Class clazz) { - Map setters = getSetters(clazz) + public AsteriskDecoder(boolean caseSensitive) { + this.caseSensitive = caseSensitive; + } + + public T decode(Map source, Class target) { + Map setters = getSetters(target) .entrySet() .stream() - .collect(toMap(e -> getName(e.getValue(), e.getKey()), Entry::getValue)); - - T resultObject = instantiateResultClass(clazz); - for (Entry entry : content.entrySet()) { - handleEntry(entry, setters, resultObject); + .collect(toMap(e -> { + String name = getName(e.getValue(), e.getKey()); + return caseSensitive ? name : name.toLowerCase(); + }, Entry::getValue)); + + T result = instantiateResultClass(target); + for (Entry entry : source.entrySet()) { + handleEntry(entry, setters, result, caseSensitive); } - return resultObject; + return result; } - private static T instantiateResultClass(Class clazz) { + private static T instantiateResultClass(Class target) { try { - return clazz.getConstructor().newInstance(); + return target.getConstructor().newInstance(); } catch (Exception e) { - throw new RuntimeException("Cannot instantiate result class %s".formatted(clazz), e); + throw new RuntimeException("Cannot instantiate class %s".formatted(target), e); } } - private static void handleEntry(Entry entry, Map setters, T resultObject) { - Object currentValue = entry.getValue(); + private static void handleEntry(Entry entry, Map setters, T result, boolean caseSensitive) { + Object value = entry.getValue(); - Method method = setters.getOrDefault(entry.getKey(), null); + String key = caseSensitive ? entry.getKey() : entry.getKey().toLowerCase(); + Method method = setters.getOrDefault(key, null); if (method == null) { logger.warn("Unable to set the '{}' property to the value '{}' in the '{}' class. There is no setter method available. " + "Please report at https://github.com/asterisk-java/asterisk-java/issues.", - entry.getKey(), currentValue, resultObject.getClass().getName()); + entry.getKey(), value, result.getClass().getName()); return; } - Object value = getValue(currentValue, method); - invokeOn(resultObject).method(method).withParameter(value); + Object targetValue = getValue(value, method); + invokeOn(result).method(method).withParameter(targetValue); } - private static Object getValue(Object currentValue, Method method) { + private static Object getValue(Object value, Method method) { Class targetDataType = method.getParameterTypes()[0]; if (targetDataType.isEnum()) { - return parseEnum(method, currentValue); + return parseEnum(method, value); } else if (targetDataType.isAssignableFrom(List.class)) { - return parseList(method, currentValue); + return parseList(method, value); } else if (targetDataType.isAssignableFrom(Map.class)) { - return parseMap(method, currentValue); + return parseMap(method, value); } else { - return parseOtherType(method, currentValue); + return parseOtherType(method, value); } } - private static Enum parseEnum(Method method, Object currentValue) { + private static Enum parseEnum(Method method, Object value) { Class targetDataType = method.getParameterTypes()[0]; return (Enum) stream(targetDataType.getEnumConstants()) - .filter(t -> t.toString().equals(String.valueOf(currentValue))) + .filter(t -> t.toString().equals(String.valueOf(value))) .findFirst() .orElse(null); } - private static List parseList(Method method, Object currentValue) { + private static List parseList(Method method, Object value) { ParameterizedType genericParameter = (ParameterizedType) method.getGenericParameterTypes()[0]; Class listElementType = (Class) genericParameter.getActualTypeArguments()[0]; - Map, Converter> conversions = TypeConversionRegister.TYPE_CONVERTERS.get(listElementType); + Map, Converter> conversions = TYPE_CONVERTERS.get(listElementType); - return ((List) currentValue) + return ((List) value) .stream() .map(object -> { @SuppressWarnings("rawtypes") @@ -119,62 +128,45 @@ private static List parseList(Method method, Object currentValue) { .toList(); } - private static Map parseMap(Method method, Object currentValue) { - AsteriskDeserializer> asteriskDeserializer = getAsteriskDeserializer(method); - + private static Map parseMap(Method method, Object value) { ParameterizedType genericParameter = (ParameterizedType) method.getGenericParameterTypes()[0]; Class mapKeyType = (Class) genericParameter.getActualTypeArguments()[0]; Class mapValueType = (Class) genericParameter.getActualTypeArguments()[1]; - Map, Converter> keyConversions = TypeConversionRegister.TYPE_CONVERTERS.get(mapKeyType); - Map, Converter> valueConversions = TypeConversionRegister.TYPE_CONVERTERS.get(mapValueType); + Map, Converter> keyConversions = TYPE_CONVERTERS.get(mapKeyType); + Map, Converter> valueConversions = TYPE_CONVERTERS.get(mapValueType); - if (currentValue instanceof List) { + if (value instanceof List values) { Map map = new LinkedHashMap<>(); - for (Object item : (List) currentValue) { - Pair converted = convertMapItem(item, asteriskDeserializer, keyConversions, valueConversions); + for (Object item : values) { + Pair converted = convertMapItem(item, keyConversions, valueConversions); map.put(converted.getKey(), converted.getValue()); } return map; } else { - Pair converted = convertMapItem(currentValue, asteriskDeserializer, keyConversions, valueConversions); + Pair converted = convertMapItem(value, keyConversions, valueConversions); return Map.of(converted.getKey(), converted.getValue()); } } - private static Object parseOtherType(Method method, Object currentValue) { - Class sourceType = currentValue.getClass(); + private static Object parseOtherType(Method method, Object value) { + Class sourceType = value.getClass(); Class targetType = method.getParameterTypes()[0]; - Map, Converter> conversions = TypeConversionRegister.TYPE_CONVERTERS.get(targetType); + Map, Converter> conversions = TYPE_CONVERTERS.get(targetType); @SuppressWarnings("rawtypes") Converter converter = conversions.get(sourceType); //noinspection unchecked - return converter.apply(currentValue); - } - - private static AsteriskDeserializer> getAsteriskDeserializer(Method method) { - AsteriskDeserialize asteriskDeserialize = method.getAnnotation(AsteriskDeserialize.class); - if (asteriskDeserialize == null) { - throw new RuntimeException("Map should have defined deserializer"); - } - - try { - Class> asteriskDeserializerClass = asteriskDeserialize.value(); - //noinspection unchecked - return (AsteriskDeserializer>) asteriskDeserializerClass.getDeclaredConstructor().newInstance(); - } catch (Exception e) { - throw new RuntimeException("Cannot create new instance of deserializer %s".formatted(asteriskDeserialize), e); - } + return converter.apply(value); } private static Pair convertMapItem( Object object, - AsteriskDeserializer> asteriskDeserializer, Map, Converter> keyConversions, Map, Converter> valueConversions ) { - Pair deserialize = asteriskDeserializer.deserialize(String.valueOf(object)); + String[] split = String.valueOf(object).split("="); + Pair deserialize = Pair.of(split[0], split[1]); @SuppressWarnings("rawtypes") Converter keyConverter = keyConversions.get(String.class); diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskEncoder.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskEncoder.java new file mode 100644 index 000000000..56fa55028 --- /dev/null +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskEncoder.java @@ -0,0 +1,158 @@ +/* + * Copyright 2004-2023 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.core.databind; + +import org.asteriskjava.core.NewlineDelimiter; + +import java.lang.reflect.Method; +import java.util.*; +import java.util.Map.Entry; + +import static java.util.Objects.requireNonNull; +import static java.util.stream.Collectors.joining; +import static org.asteriskjava.core.NewlineDelimiter.CRLF; +import static org.asteriskjava.core.NewlineDelimiter.LF; +import static org.asteriskjava.core.databind.AsteriskEncoder.EncoderConsts.*; +import static org.asteriskjava.core.databind.utils.AnnotationUtils.getName; +import static org.asteriskjava.core.databind.utils.Invoker.invokeOn; +import static org.asteriskjava.core.databind.utils.ReflectionUtils.getGetters; + +/** + * @author Piotr Olaszewski + * @since 4.0.0 + */ +public class AsteriskEncoder { + private final NewlineDelimiter newlineDelimiter; + private final Comparator fieldNamesComparator; + + public AsteriskEncoder(NewlineDelimiter newlineDelimiter, Comparator fieldNamesComparator) { + this.newlineDelimiter = newlineDelimiter; + this.fieldNamesComparator = fieldNamesComparator; + } + + public AsteriskEncoder(NewlineDelimiter newlineDelimiter) { + this(newlineDelimiter, null); + } + + public String encode(Object source) { + return encode(toMap(source)); + } + + public String encode(Map source) { + source = sortIfNeeded(source); + StringBuilder stringBuilder = new StringBuilder(); + if (!source.isEmpty()) { + for (Entry entry : source.entrySet()) { + String name = entry.getKey(); + Object value = entry.getValue(); + if (value instanceof List values) { + values.forEach(v -> appendFieldNameAndValue(name, v, stringBuilder)); + } else { + appendFieldNameAndValue(name, value, stringBuilder); + } + } + // Trailing delimiter. + stringBuilder.append(newlineDelimiter.getPattern()); + } + return stringBuilder.toString(); + } + + public static Builder builder() { + return new Builder(); + } + + private Map sortIfNeeded(Map source) { + if (fieldNamesComparator == null) { + return source; + } + + Map sourceSortedIfNeeded = new TreeMap<>(fieldNamesComparator); + sourceSortedIfNeeded.putAll(source); + return sourceSortedIfNeeded; + } + + private void appendFieldNameAndValue(String name, Object value, StringBuilder stringBuilder) { + stringBuilder.append(name); + stringBuilder.append(nameValueSeparator); + stringBuilder.append(value); + stringBuilder.append(newlineDelimiter.getPattern()); + } + + private static Map toMap(Object source) { + Map map = new LinkedHashMap<>(); + + Class clazz = source.getClass(); + Map getters = getGetters(clazz); + for (Entry entry : getters.entrySet()) { + Method method = entry.getValue(); + + String name = getName(method, entry.getKey()); + Object value = invokeOn(source).method(method).withoutParameter(); + + if (value instanceof List values) { + value = values + .stream() + .map(Object::toString) + .collect(joining(listSeparator)); + } + + if (value instanceof Map values) { + value = values + .entrySet() + .stream() + .map(e -> mapTemplate.formatted(e.getKey(), e.getValue())) + .toList(); + } + + map.put(name, value); + } + + return map; + } + + public static class Builder { + private NewlineDelimiter newlineDelimiter = CRLF; + private Comparator fieldNamesComparator; + + public Builder newlineDelimiter(NewlineDelimiter newlineDelimiter) { + this.newlineDelimiter = requireNonNull(newlineDelimiter, "newlineDelimiter cannot be null"); + return this; + } + + public Builder crlfNewlineDelimiter() { + return newlineDelimiter(CRLF); + } + + public Builder lfNewlineDelimiter() { + return newlineDelimiter(LF); + } + + public Builder fieldNamesComparator(Comparator fieldNamesComparator) { + this.fieldNamesComparator = requireNonNull(fieldNamesComparator, "fieldNamesComparator cannot be null"); + return this; + } + + public AsteriskEncoder build() { + return new AsteriskEncoder(newlineDelimiter, fieldNamesComparator); + } + } + + static class EncoderConsts { + final static String nameValueSeparator = ": "; + final static String listSeparator = ","; + final static String mapTemplate = "%s=%s"; + } +} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskGenerator.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskGenerator.java deleted file mode 100644 index e14be7c7a..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskGenerator.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2004-2023 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.core.databind; - -import org.asteriskjava.core.NewlineDelimiter; - -/** - * @author Piotr Olaszewski - * @since 4.0.0 - */ -public class AsteriskGenerator { - private static final String FIELD_NAME_VALUE_DELIMITER = ": "; - - private final StringBuilder stringBuilder = new StringBuilder(); - - private final NewlineDelimiter newlineDelimiter; - - public AsteriskGenerator(NewlineDelimiter newlineDelimiter) { - this.newlineDelimiter = newlineDelimiter; - } - - public void writeFieldName(String name) { - stringBuilder.append(name); - stringBuilder.append(FIELD_NAME_VALUE_DELIMITER); - } - - public void writeFieldValue(String value) { - stringBuilder.append(value); - stringBuilder.append(newlineDelimiter.getPattern()); - } - - public String generate() { - stringBuilder.append(newlineDelimiter.getPattern()); - return stringBuilder.toString(); - } -} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskObjectMapper.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskObjectMapper.java deleted file mode 100644 index fce4fdfbc..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskObjectMapper.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2004-2023 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.core.databind; - -import org.asteriskjava.core.NewlineDelimiter; -import org.asteriskjava.core.databind.reader.AsteriskObjectReader; -import org.asteriskjava.core.databind.writer.AsteriskObjectWriter; - -import java.util.Comparator; -import java.util.Map; - -import static java.util.Objects.requireNonNull; -import static org.asteriskjava.core.NewlineDelimiter.CRLF; -import static org.asteriskjava.core.NewlineDelimiter.LF; - -/** - * @author Piotr Olaszewski - * @since 4.0.0 - */ -public class AsteriskObjectMapper { - private final NewlineDelimiter newlineDelimiter; - private final Comparator fieldNamesComparator; - - private AsteriskObjectMapper(NewlineDelimiter newlineDelimiter, Comparator fieldNamesComparator) { - this.newlineDelimiter = newlineDelimiter; - this.fieldNamesComparator = fieldNamesComparator; - } - - public String writeValueAsString(Object value) { - AsteriskObjectWriter asteriskObjectWriter = new AsteriskObjectWriter(newlineDelimiter, fieldNamesComparator); - return asteriskObjectWriter.write(value); - } - - public T readValue(Map content, Class clazz) { - AsteriskObjectReader asteriskObjectReader = new AsteriskObjectReader(); - return asteriskObjectReader.read(content, clazz); - } - - public static Builder builder() { - return new Builder(); - } - - public static class Builder { - private NewlineDelimiter newlineDelimiter = CRLF; - private Comparator fieldNamesComparator; - - public Builder newlineDelimiter(NewlineDelimiter newlineDelimiter) { - this.newlineDelimiter = requireNonNull(newlineDelimiter, "newlineDelimiter cannot be null"); - return this; - } - - public Builder crlfNewlineDelimiter() { - return newlineDelimiter(CRLF); - } - - public Builder lfNewlineDelimiter() { - return newlineDelimiter(LF); - } - - public Builder fieldNamesComparator(Comparator fieldNamesComparator) { - this.fieldNamesComparator = requireNonNull(fieldNamesComparator, "fieldNamesComparator cannot be null"); - return this; - } - - public AsteriskObjectMapper build() { - return new AsteriskObjectMapper(newlineDelimiter, fieldNamesComparator); - } - } -} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/TypeConversionRegister.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/TypeConversionRegister.java index 18344f3b6..4404e4935 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/TypeConversionRegister.java +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/TypeConversionRegister.java @@ -31,9 +31,9 @@ public class TypeConversionRegister { public static final Map, Map, Converter>> TYPE_CONVERTERS = new ConcurrentHashMap<>(); static { - convertFromString().to(Instant.class).register(Instant::parse); - convertFromString().to(Integer.class).register(Integer::valueOf); - convertFromString().to(String.class).register(Object::toString); + convertFrom(String.class).to(Instant.class).register(Instant::parse); + convertFrom(String.class).to(Integer.class).register(Integer::valueOf); + convertFrom(String.class).to(String.class).register(Object::toString); } private TypeConversionRegister() { @@ -43,10 +43,6 @@ public static TypeConverter convertFrom(Class sourceType) { return new TypeConverter<>(sourceType); } - public static TypeConverter convertFromString() { - return convertFrom(String.class); - } - public static class TypeConverter { private final Class sourceType; diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/annotation/AsteriskDeserialize.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/annotation/AsteriskDeserialize.java deleted file mode 100644 index 0d74e4cee..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/annotation/AsteriskDeserialize.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2004-2023 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.core.databind.annotation; - -import org.asteriskjava.core.databind.deserializer.AsteriskDeserializer; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -/** - * Annotation used for configuring deserialization aspects, by attaching to "setter" methods. - * - * @author Piotr Olaszewski - * @since 4.0.0 - */ -@Target({METHOD}) -@Retention(RUNTIME) -public @interface AsteriskDeserialize { - /** - * Deserializer class to use for deserializing associated value. - */ - Class> value(); -} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/annotation/AsteriskSerialize.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/annotation/AsteriskSerialize.java deleted file mode 100644 index c63d7a6a9..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/annotation/AsteriskSerialize.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2004-2023 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.core.databind.annotation; - -import org.asteriskjava.core.databind.serializer.AsteriskSerializer; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -/** - * Annotation used for configuring serialization aspects, by attaching to "getter" methods. - * - * @author Piotr Olaszewski - * @since 4.0.0 - */ -@Target({METHOD}) -@Retention(RUNTIME) -public @interface AsteriskSerialize { - /** - * Serializer class to use for serializing associated value. - */ - Class> value(); -} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/deserializer/AsteriskDeserializer.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/deserializer/AsteriskDeserializer.java deleted file mode 100644 index 4e4f2b44a..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/deserializer/AsteriskDeserializer.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2004-2023 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.core.databind.deserializer; - -/** - * Interface representing a deserializer for a given type. - * - * @param type of the deserialized value - * @author Piotr Olaszewski - * @since 4.0.0 - */ -public interface AsteriskDeserializer { - /** - * Deserializes object into Asterisk string. - * - * @return deserialized value - */ - T deserialize(String value); -} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/deserializer/custom/EqualsSignDeserializer.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/deserializer/custom/EqualsSignDeserializer.java deleted file mode 100644 index 3b4240949..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/deserializer/custom/EqualsSignDeserializer.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2004-2023 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.core.databind.deserializer.custom; - -import org.apache.commons.lang3.tuple.Pair; -import org.asteriskjava.core.databind.deserializer.AsteriskDeserializer; - -/** - * Deserializer for splitting collection elements using the {@code =} sign. - * - * @author Piotr Olaszewski - * @since 4.0.0 - */ -public class EqualsSignDeserializer implements AsteriskDeserializer> { - private static final String EQUALS_SIGN_SEPARATOR = "="; - - @Override - public Pair deserialize(String value) { - String[] split = value.split(EQUALS_SIGN_SEPARATOR); - return Pair.of(split[0], split[1]); - } -} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/AsteriskSerializer.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/AsteriskSerializer.java deleted file mode 100644 index f885a27e2..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/AsteriskSerializer.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2004-2023 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.core.databind.serializer; - -import org.asteriskjava.core.databind.AsteriskGenerator; - -/** - * Interface representing a serializer for a given type. - * - * @param type of the serialized value - * @author Piotr Olaszewski - * @since 4.0.0 - */ -public interface AsteriskSerializer { - /** - * Serializes object into Asterisk string. - * - * @param fieldName field name of the currently serialized object - * @param value object to serialize - * @param asteriskGenerator generator used to write a Java object to an Asterisk string - */ - void serialize(String fieldName, T value, AsteriskGenerator asteriskGenerator); -} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/WritableFileName.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/WritableFileName.java deleted file mode 100644 index e97aa3399..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/WritableFileName.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2004-2023 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.core.databind.serializer; - -import org.asteriskjava.core.databind.AsteriskGenerator; - -/** - * Marker interface for writing the field name in the serializer implementation instead of {@link AsteriskGenerator}. - * - * @author Piotr Olaszewski - * @since 4.0.0 - */ -public interface WritableFileName { -} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/custom/ComaJoiningSerializer.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/custom/ComaJoiningSerializer.java deleted file mode 100644 index 138d6e392..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/custom/ComaJoiningSerializer.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2004-2023 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.core.databind.serializer.custom; - -import org.asteriskjava.core.databind.AsteriskGenerator; -import org.asteriskjava.core.databind.serializer.AsteriskSerializer; - -import java.util.Collection; - -import static java.util.stream.Collectors.joining; - -/** - * Serializer for joining collection elements by calling their toString method, using a comma as the 'glue'. - * - * @author Piotr Olaszewski - * @since 4.0.0 - */ -public class ComaJoiningSerializer implements AsteriskSerializer> { - private static final String COMA_SEPARATOR = ","; - - @Override - public void serialize(String fieldName, Collection value, AsteriskGenerator asteriskGenerator) { - String fieldValue = value - .stream() - .map(Object::toString) - .collect(joining(COMA_SEPARATOR)); - - asteriskGenerator.writeFieldValue(fieldValue); - } -} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/custom/VariableSerializer.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/custom/VariableSerializer.java deleted file mode 100644 index 9acb02f86..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/custom/VariableSerializer.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2004-2023 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.core.databind.serializer.custom; - -import org.asteriskjava.core.databind.AsteriskGenerator; -import org.asteriskjava.core.databind.serializer.AsteriskSerializer; -import org.asteriskjava.core.databind.serializer.WritableFileName; - -import java.util.Map; - -import static java.lang.String.format; - -/** - * Serializer for key=value pairs with an additional field name writer. - *

- * Following code: - *

- * @AsteriskSerialize(VariableSerializer.class)
- * public Map<String, String> getVariable() {
- *     ...
- * }
- * 
- * would produce: - *
- * Variable: key1=value1
- * Variable: key2=value2
- * Variable: key3=value3
- * 
- * - * @author Piotr Olaszewski - * @since 4.0.0 - */ -public class VariableSerializer implements AsteriskSerializer>, WritableFileName { - @Override - public void serialize(String fieldName, Map value, AsteriskGenerator asteriskGenerator) { - value.forEach((key, v) -> { - asteriskGenerator.writeFieldName(fieldName); - asteriskGenerator.writeFieldValue(format("%s=%s", key, v)); - }); - } -} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializer.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializer.java deleted file mode 100644 index 08fd668ea..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializer.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2004-2023 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.core.databind.serializer.std; - -import org.asteriskjava.core.databind.AsteriskGenerator; -import org.asteriskjava.core.databind.serializer.AsteriskSerializer; - -import static org.apache.commons.lang3.StringUtils.EMPTY; - -/** - * Base serializer which calls only the toString method on the passed value. - * - * @author Piotr Olaszewski - * @since 4.0.0 - */ -public class ToStringSerializer implements AsteriskSerializer { - @Override - public void serialize(String fieldName, Object value, AsteriskGenerator asteriskGenerator) { - if (value == null) { - asteriskGenerator.writeFieldValue(EMPTY); - } else { - asteriskGenerator.writeFieldValue(value.toString()); - } - } -} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/ReflectionUtils.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/ReflectionUtils.java index eee2cde55..3bfdcf693 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/ReflectionUtils.java +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/ReflectionUtils.java @@ -16,10 +16,8 @@ package org.asteriskjava.core.databind.utils; import java.lang.reflect.Method; -import java.util.Comparator; import java.util.LinkedHashMap; import java.util.Map; -import java.util.TreeMap; import static java.lang.reflect.Modifier.*; @@ -42,13 +40,11 @@ private ReflectionUtils() { * getter itself (an instance of Method). A method is considered a getter if its name starts with 'get' or 'is'. * It is declared public and takes no arguments. * - * @param clazz the class to return the getters for - * @param comparator the comparator for sorting properties + * @param clazz the class to return the getters for * @return a Map of attributes and their accessor methods (getters) - * @see #getGetters(Class) */ - public static Map getGetters(Class clazz, Comparator comparator) { - Map accessors = comparator != null ? new TreeMap<>(comparator) : new LinkedHashMap<>(); + public static Map getGetters(Class clazz) { + Map accessors = new LinkedHashMap<>(); Method[] methods = clazz.getMethods(); for (Method method : methods) { @@ -82,17 +78,6 @@ public static Map getGetters(Class clazz, Comparator return accessors; } - /** - * Returns a {@link Map} of getter methods of the given class. - * - * @param clazz the class to return the getters for - * @return a Map of attributes and their accessor methods (getters) - * @see #getGetters(Class, Comparator) - */ - public static Map getGetters(Class clazz) { - return getGetters(clazz, null); - } - /** * Returns a {@link Map} of setter methods of the given class. *

@@ -121,6 +106,11 @@ public static Map getSetters(Class clazz) { } String name = methodName.substring("set".length()); + + if (name.isEmpty()) { + continue; + } + accessors.put(name, method); } return accessors; diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriter.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriter.java deleted file mode 100644 index 171854ae3..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriter.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2004-2023 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.core.databind.writer; - -import org.asteriskjava.core.databind.AsteriskGenerator; -import org.asteriskjava.core.databind.serializer.AsteriskSerializer; - -import java.lang.reflect.Method; - -import static org.asteriskjava.core.databind.utils.Invoker.invokeOn; - -/** - * Writer class to write field names and serialized values using the {@link AsteriskGenerator}. - * - * @author Piotr Olaszewski - * @since 4.0.0 - */ -class AsteriskObjectMethodWriter { - private final Method method; - private final String name; - private final AsteriskSerializer asteriskSerializer; - private final AsteriskObjectMethodWriterContext asteriskObjectMethodWriterContext; - - AsteriskObjectMethodWriter( - Method method, - String name, - AsteriskSerializer asteriskSerializer, - AsteriskObjectMethodWriterContext asteriskObjectMethodWriterContext - ) { - this.method = method; - this.name = name; - this.asteriskSerializer = asteriskSerializer; - this.asteriskObjectMethodWriterContext = asteriskObjectMethodWriterContext; - } - - void writeName(AsteriskGenerator asteriskGenerator) { - if (!asteriskObjectMethodWriterContext.serializerWriteFieldName()) { - asteriskGenerator.writeFieldName(name); - } - } - - void writeValue(Object obj, AsteriskGenerator asteriskGenerator) { - Object currentValue = invokeOn(obj).method(method).withoutParameter(); - asteriskSerializer.serialize(name, currentValue, asteriskGenerator); - } -} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriterContext.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriterContext.java deleted file mode 100644 index 7d903a6d0..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriterContext.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2004-2023 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.core.databind.writer; - -/** - * Context for the process methods. - * - * @param serializerWriteFieldName whatever serializer write field names - * @author Piotr Olaszewski - * @since 4.0.0 - */ -record AsteriskObjectMethodWriterContext(boolean serializerWriteFieldName) { -} diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectWriter.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectWriter.java deleted file mode 100644 index 1b6d0ddfe..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectWriter.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2004-2023 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.core.databind.writer; - -import org.asteriskjava.core.NewlineDelimiter; -import org.asteriskjava.core.databind.AsteriskGenerator; -import org.asteriskjava.core.databind.annotation.AsteriskSerialize; -import org.asteriskjava.core.databind.serializer.AsteriskSerializer; -import org.asteriskjava.core.databind.serializer.WritableFileName; -import org.asteriskjava.core.databind.serializer.std.ToStringSerializer; - -import java.lang.reflect.Method; -import java.util.Comparator; -import java.util.List; -import java.util.Map.Entry; - -import static org.asteriskjava.core.databind.utils.AnnotationUtils.getName; -import static org.asteriskjava.core.databind.utils.ReflectionUtils.getGetters; - -/** - * @author Piotr Olaszewski - * @since 4.0.0 - */ -public class AsteriskObjectWriter { - private final Comparator fieldNamesComparator; - private final NewlineDelimiter newlineDelimiter; - - public AsteriskObjectWriter(NewlineDelimiter newlineDelimiter, Comparator fieldNamesComparator) { - this.fieldNamesComparator = fieldNamesComparator; - this.newlineDelimiter = newlineDelimiter; - } - - public String write(Object value) { - Class clazz = value.getClass(); - AsteriskGenerator asteriskGenerator = new AsteriskGenerator(newlineDelimiter); - List asteriskObjectMethodWriters = getAsteriskObjectMethodWriters(clazz); - for (AsteriskObjectMethodWriter asteriskObjectMethodWriter : asteriskObjectMethodWriters) { - asteriskObjectMethodWriter.writeName(asteriskGenerator); - asteriskObjectMethodWriter.writeValue(value, asteriskGenerator); - } - return asteriskGenerator.generate(); - } - - private List getAsteriskObjectMethodWriters(Class clazz) { - return getGetters(clazz, fieldNamesComparator) - .entrySet() - .stream() - .map(this::getAsteriskObjectMethodWriter) - .toList(); - } - - private AsteriskObjectMethodWriter getAsteriskObjectMethodWriter(Entry entry) { - Method method = entry.getValue(); - - String name = getName(method, entry.getKey()); - - AsteriskSerializer asteriskSerializer = getAsteriskSerializer(method); - - boolean serializerWriteFieldName = asteriskSerializer instanceof WritableFileName; - AsteriskObjectMethodWriterContext context = new AsteriskObjectMethodWriterContext(serializerWriteFieldName); - - return new AsteriskObjectMethodWriter(method, name, asteriskSerializer, context); - } - - private AsteriskSerializer getAsteriskSerializer(Method method) { - AsteriskSerialize asteriskSerialize = method.getAnnotation(AsteriskSerialize.class); - if (asteriskSerialize == null) { - return new ToStringSerializer(); - } - - Class> asteriskSerializerClass = asteriskSerialize.value(); - try { - //noinspection unchecked - return (AsteriskSerializer) asteriskSerializerClass.getDeclaredConstructor().newInstance(); - } catch (Exception e) { - throw new RuntimeException("Cannot create new instance of serializer %s".formatted(asteriskSerialize), e); - } - } -} diff --git a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskObjectMapperTest.java b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskDecoderTest.java similarity index 61% rename from asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskObjectMapperTest.java rename to asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskDecoderTest.java index 2a6024c4e..bd6599365 100644 --- a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskObjectMapperTest.java +++ b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskDecoderTest.java @@ -1,28 +1,9 @@ -/* - * Copyright 2004-2023 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.core.databind; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; -import org.asteriskjava.core.databind.annotation.AsteriskDeserialize; import org.asteriskjava.core.databind.annotation.AsteriskName; -import org.asteriskjava.core.databind.annotation.AsteriskSerialize; -import org.asteriskjava.core.databind.deserializer.custom.EqualsSignDeserializer; -import org.asteriskjava.core.databind.serializer.custom.ComaJoiningSerializer; import org.junit.jupiter.api.Test; import java.time.Instant; @@ -30,79 +11,13 @@ import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; -import static org.asteriskjava.core.NewlineDelimiter.CRLF; -import static org.asteriskjava.core.databind.AsteriskObjectMapper.builder; -import static org.asteriskjava.core.databind.AsteriskObjectMapperTest.Base.ResponseType.Goodbye; -import static org.asteriskjava.core.databind.AsteriskObjectMapperTest.SimpleBean.AuthType.MD5; +import static org.asteriskjava.core.databind.AsteriskDecoderTest.BaseBean.ResponseType.Goodbye; -class AsteriskObjectMapperTest { - private final AsteriskObjectMapper asteriskObjectMapper = builder() - .crlfNewlineDelimiter() - .build(); +class AsteriskDecoderTest { + private final AsteriskDecoder asteriskDecoder = new AsteriskDecoder(); @Test - void shouldWriteAsStringForSimpleTypes() { - //given - SimpleBean bean = new SimpleBean(); - bean.setActionId("id-1"); - bean.setAuthType(MD5); - bean.setCodecs(List.of("codec1", "codec2")); - - //when - String string = asteriskObjectMapper.writeValueAsString(bean); - - //then - String expected = "Action: SimpleBean" + CRLF.getPattern(); - expected += "ActionID: id-1" + CRLF.getPattern(); - expected += "AuthType: MD5" + CRLF.getPattern(); - expected += "Codecs: codec1,codec2" + CRLF.getPattern() + CRLF.getPattern(); - assertThat(string).isEqualTo(expected); - } - - public static class SimpleBean { - public enum AuthType { - MD5, - } - - private String actionId; - - private AuthType authType; - - private List codecs; - - public String getAction() { - return "SimpleBean"; - } - - @AsteriskName("ActionID") - public String getActionId() { - return actionId; - } - - public void setActionId(String actionId) { - this.actionId = actionId; - } - - public AuthType getAuthType() { - return authType; - } - - public void setAuthType(AuthType authType) { - this.authType = authType; - } - - @AsteriskSerialize(ComaJoiningSerializer.class) - public List getCodecs() { - return codecs; - } - - public void setCodecs(List codecs) { - this.codecs = codecs; - } - } - - @Test - void shouldReadForSimpleTypes() { + void shouldDecodeForSimpleBeanWhichExtendsFormBaseBean() { //given Instant date = Instant.parse("2023-11-20T20:33:30.002Z"); @@ -114,70 +29,76 @@ void shouldReadForSimpleTypes() { ); //when - SomeClass someClass = asteriskObjectMapper.readValue(content, SomeClass.class); + SimpleBean simpleBean = asteriskDecoder.decode(content, SimpleBean.class); //then - SomeClass expected = new SomeClass(); + SimpleBean expected = new SimpleBean(); expected.setChallenge("123456"); expected.setActionId("id-1"); expected.setDateReceived(date); expected.setResponse(Goodbye); - assertThat(someClass).isEqualTo(expected); + assertThat(simpleBean).isEqualTo(expected); } @Test - void shouldReadContentWithList() { + void shouldDecodeListValues() { //given + AsteriskDecoder asteriskDecoder = new AsteriskDecoder(); + Map content = Map.of( "Number", List.of("1", "2", "3") ); //when - SomeClass2 someClass = asteriskObjectMapper.readValue(content, SomeClass2.class); + ListBean listBean = asteriskDecoder.decode(content, ListBean.class); //then - SomeClass2 expected = new SomeClass2(); + ListBean expected = new ListBean(); expected.setNumbers(List.of(1, 2, 3)); - assertThat(someClass).isEqualTo(expected); + assertThat(listBean).isEqualTo(expected); } @Test - void shouldReadContentWithListWhichShouldBeAMap() { + void shouldDecodeMap() { //given - Map content = Map.of( - "Header", List.of("1=name1", "2=name2", "3=name3") - ); + AsteriskDecoder asteriskDecoder = new AsteriskDecoder(); + + Map content = Map.of("Header", "1=name1"); //when - SomeClass3 someClass = asteriskObjectMapper.readValue(content, SomeClass3.class); + MapBean someClass = asteriskDecoder.decode(content, MapBean.class); //then - Map map = Map.of( - 1, "name1", - 2, "name2", - 3, "name3" - ); - SomeClass3 expected = new SomeClass3(); + Map map = Map.of(1, "name1"); + MapBean expected = new MapBean(); expected.setHeaders(map); assertThat(someClass).isEqualTo(expected); } @Test - void shouldReadContentWithMap() { + void shouldDecodeMapWhenIsListOfEntries() { //given - Map content = Map.of("Header", "1=name1"); + AsteriskDecoder asteriskDecoder = new AsteriskDecoder(); + + Map content = Map.of( + "Header", List.of("1=name1", "2=name2", "3=name3") + ); //when - SomeClass3 someClass = asteriskObjectMapper.readValue(content, SomeClass3.class); + MapBean mapBean = asteriskDecoder.decode(content, MapBean.class); //then - Map map = Map.of(1, "name1"); - SomeClass3 expected = new SomeClass3(); + Map map = Map.of( + 1, "name1", + 2, "name2", + 3, "name3" + ); + MapBean expected = new MapBean(); expected.setHeaders(map); - assertThat(someClass).isEqualTo(expected); + assertThat(mapBean).isEqualTo(expected); } - public static class Base { + public static class BaseBean { public enum ResponseType { Success, Error, @@ -225,7 +146,7 @@ public boolean equals(Object object) { return false; } - Base base = (Base) object; + BaseBean base = (BaseBean) object; return new EqualsBuilder() .append(response, base.response) @@ -253,7 +174,7 @@ public String toString() { } } - public static class SomeClass extends Base { + public static class SimpleBean extends BaseBean { private String challenge; public String getChallenge() { @@ -274,7 +195,7 @@ public boolean equals(Object object) { return false; } - SomeClass someClass = (SomeClass) object; + SimpleBean someClass = (SimpleBean) object; return new EqualsBuilder() .appendSuper(super.equals(object)) @@ -299,7 +220,7 @@ public String toString() { } } - public static class SomeClass2 { + public static class ListBean { private List numbers; public List getNumbers() { @@ -321,7 +242,7 @@ public boolean equals(Object object) { return false; } - SomeClass2 someClass = (SomeClass2) object; + ListBean someClass = (ListBean) object; return new EqualsBuilder() .append(numbers, someClass.numbers) @@ -343,7 +264,7 @@ public String toString() { } } - public static class SomeClass3 { + public static class MapBean { private Map headers; public Map getHeaders() { @@ -351,7 +272,6 @@ public Map getHeaders() { } @AsteriskName("Header") - @AsteriskDeserialize(EqualsSignDeserializer.class) public void setHeaders(Map headers) { this.headers = headers; } @@ -366,7 +286,7 @@ public boolean equals(Object object) { return false; } - SomeClass3 someClass = (SomeClass3) object; + MapBean someClass = (MapBean) object; return new EqualsBuilder() .append(headers, someClass.headers) diff --git a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskEncoderTest.java b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskEncoderTest.java new file mode 100644 index 000000000..73e76fae6 --- /dev/null +++ b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskEncoderTest.java @@ -0,0 +1,158 @@ +/* + * Copyright 2004-2023 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.core.databind; + +import org.asteriskjava.core.databind.annotation.AsteriskName; +import org.junit.jupiter.api.Test; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static java.util.Comparator.naturalOrder; +import static org.assertj.core.api.Assertions.assertThat; +import static org.asteriskjava.core.NewlineDelimiter.LF; +import static org.asteriskjava.core.databind.AsteriskEncoderTest.SimpleBean.AuthType.MD5; + +class AsteriskEncoderTest { + @Test + void shouldEncodeWithoutSortingFields() { + //given + AsteriskEncoder asteriskEncoder = new AsteriskEncoder(LF); + + Map source = new LinkedHashMap<>(); + source.put("Z", "value z"); + source.put("A", "value a"); + source.put("M", "value m"); + source.put("F", "value f"); + + //when + String encode = asteriskEncoder.encode(source); + + //then + String expected = "Z: value z" + LF.getPattern(); + expected += "A: value a" + LF.getPattern(); + expected += "M: value m" + LF.getPattern(); + expected += "F: value f" + LF.getPattern() + LF.getPattern(); + assertThat(encode).isEqualTo(expected); + } + + @Test + void shouldEncodeAndSortFields() { + //given + AsteriskEncoder asteriskEncoder = new AsteriskEncoder(LF, naturalOrder()); + + Map source = Map.of( + "Z", "value z", + "A", "value a", + "M", "value m", + "F", "value f" + ); + + //when + String encode = asteriskEncoder.encode(source); + + //then + String expected = "A: value a" + LF.getPattern(); + expected += "F: value f" + LF.getPattern(); + expected += "M: value m" + LF.getPattern(); + expected += "Z: value z" + LF.getPattern() + LF.getPattern(); + assertThat(encode).isEqualTo(expected); + } + + @Test + void shouldEncodeObject() { + //given + AsteriskEncoder asteriskEncoder = new AsteriskEncoder(LF); + + SimpleBean bean = new SimpleBean(); + bean.setActionId("id-1"); + bean.setAuthType(MD5); + bean.setCodecs(List.of("codec1", "codec2")); + Map variable = new LinkedHashMap<>(); + variable.put("key1", "value1"); + variable.put("key2", "value2"); + variable.put("key3", "value3"); + bean.setVariable(variable); + + //when + String string = asteriskEncoder.encode(bean); + + //then + String expected = "Action: SimpleBean" + LF.getPattern(); + expected += "ActionID: id-1" + LF.getPattern(); + expected += "AuthType: MD5" + LF.getPattern(); + expected += "Codecs: codec1,codec2" + LF.getPattern(); + expected += "Variable: key1=value1" + LF.getPattern(); + expected += "Variable: key2=value2" + LF.getPattern(); + expected += "Variable: key3=value3" + LF.getPattern() + LF.getPattern(); + assertThat(string).contains( + "Action: SimpleBean", "ActionID: id-1", "AuthType: MD5", "Codecs: codec1,codec2", + "Variable: key1=value1", "Variable: key2=value2", "Variable: key3=value3" + ); + } + + public static class SimpleBean { + public enum AuthType { + MD5, + } + + private String actionId; + + private AuthType authType; + + private List codecs; + + private Map variable; + + public String getAction() { + return "SimpleBean"; + } + + @AsteriskName("ActionID") + public String getActionId() { + return actionId; + } + + public void setActionId(String actionId) { + this.actionId = actionId; + } + + public AuthType getAuthType() { + return authType; + } + + public void setAuthType(AuthType authType) { + this.authType = authType; + } + + public List getCodecs() { + return codecs; + } + + public void setCodecs(List codecs) { + this.codecs = codecs; + } + + public Map getVariable() { + return variable; + } + + public void setVariable(Map variable) { + this.variable = variable; + } + } +} diff --git a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/custom/ComaJoiningSerializerTest.java b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/custom/ComaJoiningSerializerTest.java deleted file mode 100644 index b5411890f..000000000 --- a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/custom/ComaJoiningSerializerTest.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2004-2023 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.core.databind.serializer.custom; - -import org.asteriskjava.core.databind.AsteriskGenerator; -import org.junit.jupiter.api.Test; - -import java.util.EnumSet; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.asteriskjava.core.NewlineDelimiter.CRLF; - -class ComaJoiningSerializerTest { - private final AsteriskGenerator asteriskGenerator = new AsteriskGenerator(CRLF); - - @Test - void shouldSerializeList() { - //given - ComaJoiningSerializer comaJoiningSerializer = new ComaJoiningSerializer(); - - List value = List.of("string1", "string2", "string3"); - - //when - comaJoiningSerializer.serialize("fieldName", value, asteriskGenerator); - - //then - assertThat(asteriskGenerator.generate().trim()).isEqualTo("string1,string2,string3"); - } - - @Test - void shouldSerializeListOfEnums() { - //given - ComaJoiningSerializer comaJoiningSerializer = new ComaJoiningSerializer(); - - EnumSet enums = EnumSet.of(SampleEnum.value1, SampleEnum.value2, SampleEnum.value3); - - //when - comaJoiningSerializer.serialize("fieldName", enums, asteriskGenerator); - - //then - assertThat(asteriskGenerator.generate().trim()).isEqualTo("value1,value2,value3"); - } - - private enum SampleEnum { - value1, - value2, - value3, - } -} diff --git a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/custom/VariableSerializerTest.java b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/custom/VariableSerializerTest.java deleted file mode 100644 index c70f10b40..000000000 --- a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/custom/VariableSerializerTest.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2004-2023 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.core.databind.serializer.custom; - -import org.asteriskjava.core.databind.AsteriskGenerator; -import org.junit.jupiter.api.Test; - -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.asteriskjava.core.NewlineDelimiter.CRLF; - -class VariableSerializerTest { - private final AsteriskGenerator asteriskGenerator = new AsteriskGenerator(CRLF); - - @Test - void shouldSerializeValues() { - //given - VariableSerializer variableSerializer = new VariableSerializer(); - - Map map = Map.of( - "key1", "value1", - "key2", "value2", - "key3", "value3" - ); - - //when - variableSerializer.serialize("fieldName", map, asteriskGenerator); - - //then - assertThat(asteriskGenerator.generate()) - .contains( - "fieldName: key1=value1", - "fieldName: key2=value2", - "fieldName: key3=value3" - ); - } -} diff --git a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializerTest.java b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializerTest.java deleted file mode 100644 index da041a9ca..000000000 --- a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializerTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2004-2023 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.core.databind.serializer.std; - -import org.asteriskjava.core.databind.AsteriskGenerator; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.asteriskjava.core.NewlineDelimiter.CRLF; -import static org.junit.jupiter.params.provider.Arguments.arguments; - -class ToStringSerializerTest { - private final AsteriskGenerator asteriskGenerator = new AsteriskGenerator(CRLF); - - @ParameterizedTest - @MethodSource("toStringSerializerArguments") - void shouldSerializeUsingToString(Object actual, String expected) { - //given - ToStringSerializer toStringSerializer = new ToStringSerializer(); - - //when - toStringSerializer.serialize("fieldName", actual, asteriskGenerator); - - //then - assertThat(asteriskGenerator.generate().trim()).isEqualTo(expected); - } - - private static Stream toStringSerializerArguments() { - return Stream.of( - arguments("string", "string"), - arguments(true, "true"), - arguments(1.12, "1.12"), - arguments(null, "") - ); - } -} diff --git a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/utils/ReflectionUtilsTest.java b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/utils/ReflectionUtilsTest.java index a00cfc280..9a42f6f1b 100644 --- a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/utils/ReflectionUtilsTest.java +++ b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/utils/ReflectionUtilsTest.java @@ -18,7 +18,6 @@ import org.junit.jupiter.api.Test; import java.lang.reflect.Method; -import java.util.Comparator; import java.util.Map; import java.util.StringJoiner; @@ -151,15 +150,6 @@ void shouldReturnValidGetters() { assertThat(getters).containsOnlyKeys("Value", "Valid", "Action"); } - @Test - void shouldReturnValidGettersSorted() { - //when - Map getters = getGetters(ValidClass.class, new ActionFieldsComparator()); - - //then - assertThat(getters.keySet()).containsExactly("Action", "Value", "Valid"); - } - static class ValidClass { public String getValue() { @@ -174,14 +164,4 @@ public String getAction() { return "NewAction"; } } - - static class ActionFieldsComparator implements Comparator { - @Override - public int compare(String o1, String o2) { - if (o1.equals(o2)) { - return 0; - } - return o1.equalsIgnoreCase("Action") ? -1 : 1; - } - } } diff --git a/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java index ffc752ce1..2917eaa59 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java @@ -19,7 +19,7 @@ import org.asteriskjava.AsteriskVersion; import org.asteriskjava.ami.ActionFieldsComparator; import org.asteriskjava.ami.action.ManagerAction; -import org.asteriskjava.core.databind.AsteriskObjectMapper; +import org.asteriskjava.core.databind.AsteriskEncoder; import org.asteriskjava.manager.AsteriskMapping; import org.asteriskjava.manager.action.UserEventAction; import org.asteriskjava.manager.event.UserEvent; @@ -31,8 +31,6 @@ import java.lang.reflect.Method; import java.util.*; -import static org.asteriskjava.core.databind.AsteriskObjectMapper.builder; - /** * Default implementation of the ActionBuilder interface. * @@ -51,7 +49,7 @@ class ActionBuilderImpl implements ActionBuilder { private AsteriskVersion targetVersion; private final Set membersToIgnore = new HashSet<>(); - private final AsteriskObjectMapper asteriskObjectMapper = builder() + private final AsteriskEncoder asteriskEncoder = AsteriskEncoder.builder() .crlfNewlineDelimiter() .fieldNamesComparator(new ActionFieldsComparator()) .build(); @@ -86,7 +84,7 @@ public String buildAction(final ManagerAction action, final String internalActio if (action.getClass().getPackageName().contains("org.asteriskjava.ami.action")) { action.setActionId(actionId); - return asteriskObjectMapper.writeValueAsString(action); + return asteriskEncoder.encode(action); } StringBuilder sb = new StringBuilder(); diff --git a/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java index e36cf8946..b34c58ced 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java @@ -17,6 +17,7 @@ import org.asteriskjava.ami.action.response.ManagerResponse; import org.asteriskjava.ami.action.response.ResponseType; +import org.asteriskjava.core.databind.AsteriskDecoder; import org.asteriskjava.manager.response.CommandResponse; import org.asteriskjava.manager.response.ManagerError; import org.asteriskjava.manager.util.EventAttributesHelper; @@ -37,15 +38,24 @@ 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"; private static final String RESPONSE_TYPE_ERROR = "error"; private static final String OUTPUT_RESPONSE_KEY = "output"; //Asterisk 14.3.0 + private final AsteriskDecoder asteriskDecoder = new AsteriskDecoder(false); + @SuppressWarnings("unchecked") public ManagerResponse buildResponse(Class responseClass, Map attributes) { + responseClass = responseClass == null ? ManagerResponse.class : responseClass; + if (responseClass.getPackageName().contains("org.asteriskjava.ami.action.response")) { + ManagerResponse response = asteriskDecoder.decode(attributes, responseClass); + response.setAttributes(new HashMap<>(attributes)); + return response; + } + final ManagerResponse response; final String responseType = (String) attributes.get(RESPONSE_KEY); diff --git a/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java b/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java index 43df7c042..9a71866c1 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java @@ -22,7 +22,6 @@ import org.asteriskjava.manager.response.ExtensionStateResponse; import org.asteriskjava.manager.response.MailboxCountResponse; import org.asteriskjava.manager.response.MailboxStatusResponse; -import org.asteriskjava.manager.response.ManagerError; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -71,7 +70,6 @@ void testBuildError() { attributes.put("message", "Missing action in request"); response = responseBuilder.buildResponse(ManagerResponse.class, attributes); - assertEquals(ManagerError.class, response.getClass(), "Response of wrong type"); assertEquals("Missing action in request", response.getMessage(), "Message not set correctly"); } From 1e34a7cef673e44346e99e707d8c2671ba3710d5 Mon Sep 17 00:00:00 2001 From: Piotr Olaszewski Date: Fri, 8 Dec 2023 19:01:01 +0100 Subject: [PATCH 09/10] Handle decoder from string --- .../core/databind/AsteriskDecoder.java | 41 ++++++- .../core/databind/AsteriskEncoder.java | 8 +- .../core/databind/CodersConsts.java | 26 +++++ .../core/databind/AsteriskDecoderTest.java | 109 ++++++++++++++++++ 4 files changed, 173 insertions(+), 11 deletions(-) create mode 100644 asterisk-java-core/src/main/java/org/asteriskjava/core/databind/CodersConsts.java diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskDecoder.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskDecoder.java index 558298089..1b0c31675 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskDecoder.java +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskDecoder.java @@ -22,12 +22,15 @@ import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.stream.Collectors; import static java.util.Arrays.stream; -import static java.util.stream.Collectors.toMap; +import static java.util.Locale.ENGLISH; +import static org.asteriskjava.core.databind.CodersConsts.nameValueSeparator; import static org.asteriskjava.core.databind.TypeConversionRegister.TYPE_CONVERTERS; import static org.asteriskjava.core.databind.utils.AnnotationUtils.getName; import static org.asteriskjava.core.databind.utils.Invoker.invokeOn; @@ -50,13 +53,17 @@ public AsteriskDecoder(boolean caseSensitive) { this.caseSensitive = caseSensitive; } + public T decode(String[] source, Class target) { + return decode(toMap(source), target); + } + public T decode(Map source, Class target) { Map setters = getSetters(target) .entrySet() .stream() - .collect(toMap(e -> { + .collect(Collectors.toMap(e -> { String name = getName(e.getValue(), e.getKey()); - return caseSensitive ? name : name.toLowerCase(); + return caseSensitive ? name : name.toLowerCase(ENGLISH); }, Entry::getValue)); T result = instantiateResultClass(target); @@ -77,7 +84,7 @@ private static T instantiateResultClass(Class target) { private static void handleEntry(Entry entry, Map setters, T result, boolean caseSensitive) { Object value = entry.getValue(); - String key = caseSensitive ? entry.getKey() : entry.getKey().toLowerCase(); + String key = caseSensitive ? entry.getKey() : entry.getKey().toLowerCase(ENGLISH); Method method = setters.getOrDefault(key, null); if (method == null) { logger.warn("Unable to set the '{}' property to the value '{}' in the '{}' class. There is no setter method available. " + @@ -183,4 +190,30 @@ private static Pair convertMapItem( return Pair.of(keyValue, valueValue); } + + private static Map toMap(String[] source) { + Map map = new LinkedHashMap<>(); + for (String line : source) { + String[] split = line.split(nameValueSeparator); + String name = split[0].trim(); + Object value = split[1].trim(); + + if (map.containsKey(name)) { + Object currenValue = map.get(name); + //noinspection rawtypes + if (currenValue instanceof List list) { + //noinspection unchecked + list.add(value); + } else { + List list = new LinkedList<>(); + list.add(currenValue); + list.add(value); + map.put(name, list); + } + } else { + map.put(name, value); + } + } + return map; + } } diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskEncoder.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskEncoder.java index 56fa55028..7a6d2de70 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskEncoder.java +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskEncoder.java @@ -25,7 +25,7 @@ import static java.util.stream.Collectors.joining; import static org.asteriskjava.core.NewlineDelimiter.CRLF; import static org.asteriskjava.core.NewlineDelimiter.LF; -import static org.asteriskjava.core.databind.AsteriskEncoder.EncoderConsts.*; +import static org.asteriskjava.core.databind.CodersConsts.*; import static org.asteriskjava.core.databind.utils.AnnotationUtils.getName; import static org.asteriskjava.core.databind.utils.Invoker.invokeOn; import static org.asteriskjava.core.databind.utils.ReflectionUtils.getGetters; @@ -149,10 +149,4 @@ public AsteriskEncoder build() { return new AsteriskEncoder(newlineDelimiter, fieldNamesComparator); } } - - static class EncoderConsts { - final static String nameValueSeparator = ": "; - final static String listSeparator = ","; - final static String mapTemplate = "%s=%s"; - } } diff --git a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/CodersConsts.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/CodersConsts.java new file mode 100644 index 000000000..332da30b3 --- /dev/null +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/CodersConsts.java @@ -0,0 +1,26 @@ +/* + * Copyright 2004-2023 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.core.databind; + +/** + * @author Piotr Olaszewski + * @since 4.0.0 + */ +class CodersConsts { + final static String nameValueSeparator = ": "; + final static String listSeparator = ","; + final static String mapTemplate = "%s=%s"; +} diff --git a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskDecoderTest.java b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskDecoderTest.java index bd6599365..5a21a2124 100644 --- a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskDecoderTest.java +++ b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskDecoderTest.java @@ -1,3 +1,18 @@ +/* + * Copyright 2004-2023 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.core.databind; import org.apache.commons.lang3.builder.EqualsBuilder; @@ -11,6 +26,7 @@ import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; +import static org.asteriskjava.core.NewlineDelimiter.LF; import static org.asteriskjava.core.databind.AsteriskDecoderTest.BaseBean.ResponseType.Goodbye; class AsteriskDecoderTest { @@ -98,6 +114,99 @@ void shouldDecodeMapWhenIsListOfEntries() { assertThat(mapBean).isEqualTo(expected); } + @Test + void shouldDecodeSimpleBeanFromString() { + //given + AsteriskDecoder asteriskDecoder = new AsteriskDecoder(); + + Instant date = Instant.parse("2023-11-20T20:33:30.002Z"); + String string = """ + ActionID: id-1 + DateReceived: %s + Challenge: 123456 + Response: Goodbye + """.formatted(date); + String[] content = string.split(LF.getPattern()); + + //when + SimpleBean simpleBean = asteriskDecoder.decode(content, SimpleBean.class); + + //then + SimpleBean expected = new SimpleBean(); + expected.setChallenge("123456"); + expected.setActionId("id-1"); + expected.setDateReceived(date); + expected.setResponse(Goodbye); + assertThat(simpleBean).isEqualTo(expected); + } + + @Test + void shouldDecoderListFromString() { + //given + AsteriskDecoder asteriskDecoder = new AsteriskDecoder(); + + String string = """ + Number: 1 + Number: 2 + Number: 3 + """; + String[] content = string.split(LF.getPattern()); + + //when + ListBean listBean = asteriskDecoder.decode(content, ListBean.class); + + //then + ListBean expected = new ListBean(); + expected.setNumbers(List.of(1, 2, 3)); + assertThat(listBean).isEqualTo(expected); + } + + @Test + void shouldDecodeMapFromString() { + //given + AsteriskDecoder asteriskDecoder = new AsteriskDecoder(); + + String string = """ + Header: 1=name1 + """; + String[] content = string.split(LF.getPattern()); + + //when + MapBean someClass = asteriskDecoder.decode(content, MapBean.class); + + //then + Map map = Map.of(1, "name1"); + MapBean expected = new MapBean(); + expected.setHeaders(map); + assertThat(someClass).isEqualTo(expected); + } + + @Test + void shouldDecodeMapWhenIsListOfEntriesFromString() { + //given + AsteriskDecoder asteriskDecoder = new AsteriskDecoder(); + + String string = """ + Header: 1=name1 + Header: 2=name2 + Header: 3=name3 + """; + String[] content = string.split(LF.getPattern()); + + //when + MapBean mapBean = asteriskDecoder.decode(content, MapBean.class); + + //then + Map map = Map.of( + 1, "name1", + 2, "name2", + 3, "name3" + ); + MapBean expected = new MapBean(); + expected.setHeaders(map); + assertThat(mapBean).isEqualTo(expected); + } + public static class BaseBean { public enum ResponseType { Success, From 6139c3e5d688111ef952d718c47336bbfd892f87 Mon Sep 17 00:00:00 2001 From: Piotr Olaszewski Date: Fri, 8 Dec 2023 21:49:46 +0100 Subject: [PATCH 10/10] Rename ManagerResponse to ManagerActionResponse --- asterisk-java-ami/build.gradle | 1 + .../ami/action/ChallengeAction.java | 8 +- .../action/annotation/ExpectedResponse.java | 8 +- ...va => ChallengeManagerActionResponse.java} | 39 +++++++- ...sponse.java => ManagerActionResponse.java} | 61 ++++++++---- .../ami/action/ChallengeActionItTest.java | 94 +++++++++++++++---- .../fastagi/internal/AsyncAgiWriter.java | 4 +- .../live/internal/AsteriskChannelImpl.java | 30 +++--- .../internal/AsteriskQueueMemberImpl.java | 6 +- .../live/internal/AsteriskServerImpl.java | 22 ++--- .../live/internal/MeetMeManager.java | 4 +- .../manager/DefaultManagerConnection.java | 6 +- .../manager/ManagerConnection.java | 20 ++-- .../org/asteriskjava/manager/PingThread.java | 4 +- .../asteriskjava/manager/ResponseEvents.java | 6 +- .../manager/SendActionCallback.java | 4 +- .../SendEventGeneratingActionCallback.java | 6 +- .../manager/action/GetVarAction.java | 6 +- .../manager/action/ListCommandsAction.java | 4 +- .../manager/action/SipShowPeerAction.java | 4 +- .../manager/internal/AsyncEventPump.java | 8 +- .../manager/internal/Dispatcher.java | 6 +- .../internal/ManagerConnectionImpl.java | 42 ++++----- .../manager/internal/ManagerReader.java | 4 +- .../manager/internal/ManagerReaderImpl.java | 16 ++-- .../manager/internal/ResponseBuilder.java | 6 +- .../manager/internal/ResponseBuilderImpl.java | 14 +-- .../manager/internal/ResponseEventsImpl.java | 8 +- .../manager/response/CommandResponse.java | 4 +- .../response/CoreSettingsResponse.java | 4 +- .../manager/response/CoreStatusResponse.java | 4 +- .../response/ExtensionStateResponse.java | 4 +- .../manager/response/GetConfigResponse.java | 4 +- .../manager/response/GetVarResponse.java | 4 +- .../response/MailboxCountResponse.java | 4 +- .../response/MailboxStatusResponse.java | 4 +- .../manager/response/ManagerError.java | 4 +- .../manager/response/MixMonitorResponse.java | 4 +- .../manager/response/ModuleCheckResponse.java | 4 +- .../manager/response/PingResponse.java | 4 +- .../manager/response/SipShowPeerResponse.java | 4 +- .../manager/response/SkypeBuddyResponse.java | 4 +- .../response/SkypeLicenseStatusResponse.java | 4 +- .../manager/util/EventAttributesHelper.java | 4 +- .../wrap/response/CommandResponse.java | 4 +- .../asterisk/wrap/response/ManagerError.java | 4 +- .../wrap/response/ManagerResponse.java | 3 +- .../internal/core/CoherentEventFactory.java | 3 +- .../core/CoherentManagerConnection.java | 3 +- .../internal/ManagerConnectionImplTest.java | 16 ++-- .../internal/ManagerReaderImplTest.java | 10 +- .../manager/internal/ManagerReaderMock.java | 4 +- .../manager/internal/ManagerWriterMock.java | 28 +++--- .../internal/ResponseBuilderImplTest.java | 38 ++++---- 54 files changed, 373 insertions(+), 245 deletions(-) rename asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/{ChallengeResponse.java => ChallengeManagerActionResponse.java} (53%) rename asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/{ManagerResponse.java => ManagerActionResponse.java} (85%) diff --git a/asterisk-java-ami/build.gradle b/asterisk-java-ami/build.gradle index 702dab7eb..48ee6c2a6 100644 --- a/asterisk-java-ami/build.gradle +++ b/asterisk-java-ami/build.gradle @@ -32,6 +32,7 @@ dependencies { testImplementation 'io.netty:netty-codec:4.1.101.Final' testImplementation 'io.netty:netty-handler:4.1.101.Final' testImplementation 'io.netty:netty-transport:4.1.101.Final' + testImplementation 'org.awaitility:awaitility:4.2.0' } tasks.named('test') { diff --git a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/ChallengeAction.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/ChallengeAction.java index d7d045785..3c79b3e6f 100644 --- a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/ChallengeAction.java +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/ChallengeAction.java @@ -16,13 +16,13 @@ package org.asteriskjava.ami.action; import org.asteriskjava.ami.action.annotation.ExpectedResponse; -import org.asteriskjava.ami.action.response.ChallengeResponse; +import org.asteriskjava.ami.action.response.ChallengeManagerActionResponse; import java.io.Serial; /** * The {@link ChallengeAction} requests a challenge from the server to use when logging in using challenge/response. - * Sending this action to the Asterisk server results in a {@link ChallengeResponse} being received from the server. + * Sending this action to the Asterisk server results in a {@link ChallengeManagerActionResponse} being received from the server. *

* Supported Asterisk versions: *

    @@ -32,10 +32,10 @@ * * @author Stefan Reuter * @author Piotr Olaszewski - * @see ChallengeResponse + * @see ChallengeManagerActionResponse * @since 1.0.0 */ -@ExpectedResponse(ChallengeResponse.class) +@ExpectedResponse(ChallengeManagerActionResponse.class) public class ChallengeAction extends AbstractManagerAction { @Serial private static final long serialVersionUID = 7240516124871953971L; diff --git a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/annotation/ExpectedResponse.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/annotation/ExpectedResponse.java index c1000a678..c057ce62a 100644 --- a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/annotation/ExpectedResponse.java +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/annotation/ExpectedResponse.java @@ -16,7 +16,7 @@ package org.asteriskjava.ami.action.annotation; import org.asteriskjava.ami.action.ManagerAction; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import java.lang.annotation.Retention; import java.lang.annotation.Target; @@ -25,7 +25,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; /** - * Indicates that an annotated {@link ManagerAction} expects a specific subclass of {@link ManagerResponse} when + * Indicates that an annotated {@link ManagerAction} expects a specific subclass of {@link ManagerActionResponse} when * executed successfully. * * @author Stefan Reuter @@ -35,7 +35,7 @@ @Retention(RUNTIME) public @interface ExpectedResponse { /** - * {@link ManagerResponse} subclass, to handle {@link ManagerAction} response. + * {@link ManagerActionResponse} subclass, to handle {@link ManagerAction} response. */ - Class value(); + Class value(); } diff --git a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ChallengeResponse.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ChallengeManagerActionResponse.java similarity index 53% rename from asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ChallengeResponse.java rename to asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ChallengeManagerActionResponse.java index 978540668..ffe50c2da 100644 --- a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ChallengeResponse.java +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ChallengeManagerActionResponse.java @@ -15,6 +15,9 @@ */ package org.asteriskjava.ami.action.response; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; import org.asteriskjava.ami.action.ChallengeAction; import java.io.Serial; @@ -27,7 +30,7 @@ * @see ChallengeAction * @since 1.0.0 */ -public class ChallengeResponse extends ManagerResponse { +public class ChallengeManagerActionResponse extends ManagerActionResponse { @Serial private static final long serialVersionUID = -7253724086340850957L; @@ -43,4 +46,38 @@ public String getChallenge() { public void setChallenge(String challenge) { this.challenge = challenge; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + ChallengeManagerActionResponse that = (ChallengeManagerActionResponse) o; + + return new EqualsBuilder() + .appendSuper(super.equals(that)) + .append(challenge, that.challenge) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .appendSuper(super.hashCode()) + .append(challenge) + .toHashCode(); + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .appendSuper(super.toString()) + .append("challenge", challenge) + .toString(); + } } diff --git a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ManagerResponse.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ManagerActionResponse.java similarity index 85% rename from asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ManagerResponse.java rename to asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ManagerActionResponse.java index b631bdf6e..073f8897c 100644 --- a/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ManagerResponse.java +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ManagerActionResponse.java @@ -15,7 +15,11 @@ */ package org.asteriskjava.ami.action.response; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; import org.asteriskjava.ami.action.ManagerAction; +import org.asteriskjava.core.databind.annotation.AsteriskName; import java.io.Serial; import java.io.Serializable; @@ -33,7 +37,7 @@ * @see ManagerAction * @since 1.0.0 */ -public class ManagerResponse implements Serializable { +public class ManagerActionResponse implements Serializable { @Serial private static final long serialVersionUID = 1L; @@ -75,10 +79,48 @@ public String getActionId() { return actionId; } + @AsteriskName("ActionID") public void setActionId(String actionId) { this.actionId = actionId; } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + ManagerActionResponse that = (ManagerActionResponse) o; + + return new EqualsBuilder() + .append(response, that.response) + .append(dateReceived, that.dateReceived) + .append(actionId, that.actionId) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(response) + .append(dateReceived) + .append(actionId) + .toHashCode(); + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("response", response) + .append("dateReceived", dateReceived) + .append("actionId", actionId) + .toString(); + } + /*---------------*/ /** @@ -93,7 +135,7 @@ public void setActionId(String actionId) { private Map attributes; private String output; - public ManagerResponse() { + public ManagerActionResponse() { this.attributes = null; } @@ -250,21 +292,6 @@ protected Long stringToLong(String s, String suffix) throws NumberFormatExceptio return Long.parseLong(s.trim()); } - @Override - public String toString() { - StringBuilder sb; - - sb = new StringBuilder(100); - sb.append(getClass().getName()).append(": "); - sb.append("actionId='").append(getActionId()).append("'; "); - sb.append("message='").append(getMessage()).append("'; "); - sb.append("response='").append(getResponse()).append("'; "); - sb.append("uniqueId='").append(getUniqueId()).append("'; "); - sb.append("systemHashcode=").append(System.identityHashCode(this)); - - return sb.toString(); - } - public String getEvents() { return events; } diff --git a/asterisk-java-ami/src/test/java/org/asteriskjava/ami/action/ChallengeActionItTest.java b/asterisk-java-ami/src/test/java/org/asteriskjava/ami/action/ChallengeActionItTest.java index 064cea193..7586843c2 100644 --- a/asterisk-java-ami/src/test/java/org/asteriskjava/ami/action/ChallengeActionItTest.java +++ b/asterisk-java-ami/src/test/java/org/asteriskjava/ami/action/ChallengeActionItTest.java @@ -1,3 +1,18 @@ +/* + * Copyright 2004-2023 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.ami.action; import io.netty.bootstrap.Bootstrap; @@ -12,37 +27,66 @@ import io.netty.handler.codec.string.StringEncoder; import io.netty.handler.timeout.IdleStateHandler; import org.asteriskjava.ami.ActionFieldsComparator; +import org.asteriskjava.ami.action.response.ChallengeManagerActionResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; +import org.asteriskjava.core.databind.AsteriskDecoder; import org.asteriskjava.core.databind.AsteriskEncoder; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import java.time.Instant; +import java.util.concurrent.atomic.AtomicReference; + +import static java.time.Duration.ofSeconds; +import static java.time.Instant.now; import static java.util.concurrent.TimeUnit.SECONDS; +import static org.assertj.core.api.Assertions.assertThat; import static org.asteriskjava.ami.action.AuthType.MD5; +import static org.asteriskjava.ami.action.response.ResponseType.Success; +import static org.asteriskjava.core.NewlineDelimiter.CRLF; +import static org.awaitility.Awaitility.await; +import static org.hamcrest.core.IsInstanceOf.instanceOf; import static org.testcontainers.containers.BindMode.READ_ONLY; import static org.testcontainers.containers.wait.strategy.Wait.forLogMessage; -//@Testcontainers +@Testcontainers class ChallengeActionItTest { -// @Container - static final GenericContainer asterisk = new GenericContainer<>("andrius/asterisk:alpine-18.15.1") + @SuppressWarnings("rawtypes") + @Container + private static final GenericContainer asterisk = new GenericContainer("andrius/asterisk:alpine-18.15.1") .withClasspathResourceMapping("manager.conf", "/etc/asterisk/manager.conf", READ_ONLY) .withAccessToHost(true) .withExposedPorts(5038) .waitingFor(forLogMessage(".*Asterisk Ready.*", 1)); -// @Test - void shouldName() throws InterruptedException { + @Test + void shouldSendChallengeActionAndReceiveChallengeResponse() throws InterruptedException { //given + Instant now = now(); + ChallengeAction challengeAction = new ChallengeAction(); challengeAction.setActionId("id-1"); challengeAction.setAuthType(MD5); + //when + ChallengeManagerActionResponse actual = testAction(challengeAction, ChallengeManagerActionResponse.class, now); + + //then + assertThat(actual.getResponse()).isEqualTo(Success); + assertThat(actual.getActionId()).isEqualTo("id-1"); + assertThat(actual.getDateReceived()).isEqualTo(now); + assertThat(actual.getChallenge()).isNotBlank(); + } + + private static R testAction(ManagerAction action, Class responseClass, Instant instant) throws InterruptedException { AsteriskEncoder asteriskEncoder = AsteriskEncoder .builder() .crlfNewlineDelimiter() .fieldNamesComparator(new ActionFieldsComparator()) .build(); - - String action = asteriskEncoder.encode(challengeAction); + AtomicReference response = new AtomicReference<>(); NioEventLoopGroup group = new NioEventLoopGroup(); Bootstrap bootstrap = new Bootstrap(); @@ -55,29 +99,43 @@ protected void initChannel(SocketChannel ch) { ch.pipeline() .addLast("decoder", new StringDecoder()) .addLast("encoder", new StringEncoder()) - .addLast("actionResponse", new ActionResponseHandler()) + .addLast("actionResponse", new ActionResponseHandler<>(response, responseClass, instant)) .addLast(new IdleStateHandler(0, 0, 2, SECONDS)); } }); Channel channel = bootstrap.connect(asterisk.getHost(), asterisk.getFirstMappedPort()).sync().channel(); - channel.writeAndFlush(action); - channel.closeFuture().sync(); + channel.writeAndFlush(asteriskEncoder.encode(action)); - //when + await().atMost(ofSeconds(5)).untilAtomic(response, instanceOf(responseClass)); - //then + return response.get(); } - static class ActionResponseHandler extends SimpleChannelInboundHandler { + static class ActionResponseHandler extends SimpleChannelInboundHandler { + private final AsteriskDecoder asteriskDecoder = new AsteriskDecoder(); + private final AtomicReference response; + private final Class clazz; + private final Instant instant; + + public ActionResponseHandler(AtomicReference response, Class clazz, Instant instant) { + this.response = response; + this.clazz = clazz; + this.instant = instant; + } + @Override protected void channelRead0(ChannelHandlerContext ctx, String message) { System.out.println("Received message from Asterisk: " + message); - } - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { - cause.printStackTrace(); - ctx.close(); + if (message.startsWith("Asterisk Call Manager/")) { + return; + } + + String[] split = message.split(CRLF.getPattern()); + + R decode = asteriskDecoder.decode(split, clazz); + decode.setDateReceived(instant); + response.set(decode); } } } diff --git a/src/main/java/org/asteriskjava/fastagi/internal/AsyncAgiWriter.java b/src/main/java/org/asteriskjava/fastagi/internal/AsyncAgiWriter.java index 8966b6972..68dcfd894 100644 --- a/src/main/java/org/asteriskjava/fastagi/internal/AsyncAgiWriter.java +++ b/src/main/java/org/asteriskjava/fastagi/internal/AsyncAgiWriter.java @@ -1,6 +1,6 @@ package org.asteriskjava.fastagi.internal; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.fastagi.AgiException; import org.asteriskjava.fastagi.AgiWriter; import org.asteriskjava.fastagi.command.AgiCommand; @@ -30,7 +30,7 @@ public AsyncAgiWriter(ManagerConnection connection, String channelName) { public void sendCommand(AgiCommand command) throws AgiException { final AgiAction agiAction; - final ManagerResponse response; + final ManagerActionResponse response; agiAction = new AgiAction(channelName, command.buildCommand()); diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java index c09b96128..195d9a094 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.live.internal; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.live.*; import org.asteriskjava.lock.LockableList; import org.asteriskjava.lock.LockableMap; @@ -583,7 +583,7 @@ public void hangup() throws ManagerCommunicationException, NoSuchChannelExceptio public void hangup(HangupCause cause) throws ManagerCommunicationException, NoSuchChannelException { final HangupAction action; - final ManagerResponse response; + final ManagerActionResponse response; if (cause != null) { setVariable(CAUSE_VARIABLE_NAME, Integer.toString(cause.getCode())); @@ -599,7 +599,7 @@ public void hangup(HangupCause cause) throws ManagerCommunicationException, NoSu } public void setAbsoluteTimeout(int seconds) throws ManagerCommunicationException, NoSuchChannelException { - ManagerResponse response; + ManagerActionResponse response; response = server.sendAction(new AbsoluteTimeoutAction(name, seconds)); if (response instanceof ManagerError) { @@ -609,7 +609,7 @@ public void setAbsoluteTimeout(int seconds) throws ManagerCommunicationException public void redirect(String context, String exten, int priority) throws ManagerCommunicationException, NoSuchChannelException { - ManagerResponse response; + ManagerActionResponse response; response = server.sendAction(new RedirectAction(name, context, exten, priority)); if (response instanceof ManagerError) { @@ -619,7 +619,7 @@ public void redirect(String context, String exten, int priority) public void redirectBothLegs(String context, String exten, int priority) throws ManagerCommunicationException, NoSuchChannelException { - ManagerResponse response; + ManagerActionResponse response; try (LockCloser closer = linkedChannels.withLock()) { if (linkedChannels.isEmpty()) { @@ -636,7 +636,7 @@ public void redirectBothLegs(String context, String exten, int priority) } public String getVariable(String variable) throws ManagerCommunicationException, NoSuchChannelException { - ManagerResponse response; + ManagerActionResponse response; String value; try (LockCloser closer = variables.withLock()) { @@ -661,7 +661,7 @@ public String getVariable(String variable) throws ManagerCommunicationException, } public void setVariable(String variable, String value) throws ManagerCommunicationException, NoSuchChannelException { - ManagerResponse response; + ManagerActionResponse response; response = server.sendAction(new SetVarAction(name, variable, value)); if (response instanceof ManagerError) { @@ -673,7 +673,7 @@ public void setVariable(String variable, String value) throws ManagerCommunicati } public void playDtmf(String digit) throws ManagerCommunicationException, NoSuchChannelException, IllegalArgumentException { - ManagerResponse response; + ManagerActionResponse response; if (digit == null) { throw new IllegalArgumentException("DTMF digit to send must not be null"); @@ -695,7 +695,7 @@ public void startMonitoring(String filename, String format) throws ManagerCommun public void startMonitoring(String filename, String format, boolean mix) throws ManagerCommunicationException, NoSuchChannelException { - ManagerResponse response; + ManagerActionResponse response; response = server.sendAction(new MonitorAction(name, filename, format, mix)); if (response instanceof ManagerError) { @@ -705,7 +705,7 @@ public void startMonitoring(String filename, String format, boolean mix) public void changeMonitoring(String filename) throws ManagerCommunicationException, NoSuchChannelException, IllegalArgumentException { - ManagerResponse response; + ManagerActionResponse response; if (filename == null) { throw new IllegalArgumentException("New filename must not be null"); @@ -718,7 +718,7 @@ public void changeMonitoring(String filename) } public void stopMonitoring() throws ManagerCommunicationException, NoSuchChannelException { - ManagerResponse response; + ManagerActionResponse response; response = server.sendAction(new StopMonitorAction(name)); if (response instanceof ManagerError) { @@ -727,7 +727,7 @@ public void stopMonitoring() throws ManagerCommunicationException, NoSuchChannel } public void pauseMonitoring() throws ManagerCommunicationException, NoSuchChannelException { - ManagerResponse response; + ManagerActionResponse response; response = server.sendAction(new PauseMonitorAction(name)); if (response instanceof ManagerError) { @@ -736,7 +736,7 @@ public void pauseMonitoring() throws ManagerCommunicationException, NoSuchChanne } public void unpauseMonitoring() throws ManagerCommunicationException, NoSuchChannelException { - ManagerResponse response; + ManagerActionResponse response; response = server.sendAction(new UnpauseMonitorAction(name)); if (response instanceof ManagerError) { @@ -746,7 +746,7 @@ public void unpauseMonitoring() throws ManagerCommunicationException, NoSuchChan public void pauseMixMonitor(MixMonitorDirection direction) throws ManagerCommunicationException, NoSuchChannelException, RecordingException { - ManagerResponse response; + ManagerActionResponse response; response = server.sendAction(new PauseMixMonitorAction(this.name, 1, direction.getStateName())); if (response instanceof ManagerError) { if (response.getMessage().equals("Cannot set mute flag")) { @@ -758,7 +758,7 @@ public void pauseMixMonitor(MixMonitorDirection direction) public void unPauseMixMonitor(MixMonitorDirection direction) throws ManagerCommunicationException, NoSuchChannelException, RecordingException { - ManagerResponse response; + ManagerActionResponse response; response = server.sendAction(new PauseMixMonitorAction(this.name, 0, direction.getStateName())); if (response instanceof ManagerError) { if (response.getMessage().equals("Cannot set mute flag")) { diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java index 734bba59c..1e754594a 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.live.internal; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.live.*; import org.asteriskjava.lock.Locker.LockCloser; import org.asteriskjava.manager.action.QueuePauseAction; @@ -123,7 +123,7 @@ public void setPausedAll(boolean paused) throws ManagerCommunicationException, N } private void sendPauseAction(QueuePauseAction action) throws ManagerCommunicationException, NoSuchInterfaceException { - final ManagerResponse response = server.sendAction(action); + final ManagerActionResponse response = server.sendAction(action); if (response instanceof ManagerError) { // Message: Interface not found @@ -159,7 +159,7 @@ public void setPenalty(int penalty) throw new IllegalArgumentException("Penalty must not be negative"); } - final ManagerResponse response = server.sendAction(new QueuePenaltyAction(location, penalty, queue.getName())); + final ManagerActionResponse response = server.sendAction(new QueuePenaltyAction(location, penalty, queue.getName())); if (response instanceof ManagerError) { throw new InvalidPenaltyException( "Unable to set penalty for '" + location + "' on '" + queue.getName() + "': " + response.getMessage()); diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index 8cfc2b05a..830e333ad 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -18,7 +18,7 @@ import org.asteriskjava.AsteriskVersion; import org.asteriskjava.ami.action.ManagerAction; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.config.ConfigFile; import org.asteriskjava.live.*; import org.asteriskjava.lock.Lockable; @@ -433,7 +433,7 @@ public List getQueuesUpdatedAfter(Date date) { public String getVersion() throws ManagerCommunicationException { try (LockCloser closer = this.withLock()) { - final ManagerResponse response; + final ManagerActionResponse response; final String command; initializeIfNeeded(); @@ -469,7 +469,7 @@ public int[] getVersion(String file) throws ManagerCommunicationException { initializeIfNeeded(); if (versions == null) { LockableMap map; - ManagerResponse response; + ManagerActionResponse response; map = new LockableMap<>(new HashMap<>()); try { @@ -532,7 +532,7 @@ public int[] getVersion(String file) throws ManagerCommunicationException { } public String getGlobalVariable(String variable) throws ManagerCommunicationException { - ManagerResponse response; + ManagerActionResponse response; String value; initializeIfNeeded(); @@ -548,7 +548,7 @@ public String getGlobalVariable(String variable) throws ManagerCommunicationExce } public void setGlobalVariable(String variable, String value) throws ManagerCommunicationException { - ManagerResponse response; + ManagerActionResponse response; initializeIfNeeded(); response = sendAction(new SetVarAction(variable, value)); @@ -559,7 +559,7 @@ public void setGlobalVariable(String variable, String value) throws ManagerCommu public Collection getVoicemailboxes() throws ManagerCommunicationException { final Collection voicemailboxes; - ManagerResponse response; + ManagerActionResponse response; final List result; initializeIfNeeded(); @@ -624,7 +624,7 @@ public Collection getVoicemailboxes() throws ManagerCommunicationE } public List executeCliCommand(String command) throws ManagerCommunicationException { - final ManagerResponse response; + final ManagerActionResponse response; initializeIfNeeded(); response = sendAction(new CommandAction(command)); @@ -657,7 +657,7 @@ public void reloadAllModules() throws ManagerCommunicationException { } protected void sendModuleLoadAction(String module, String loadType) throws ManagerCommunicationException { - final ManagerResponse response; + final ManagerActionResponse response; response = sendAction(new ModuleLoadAction(module, loadType)); if (response instanceof ManagerError) { @@ -667,7 +667,7 @@ protected void sendModuleLoadAction(String module, String loadType) throws Manag } public ConfigFile getConfig(String filename) throws ManagerCommunicationException { - final ManagerResponse response; + final ManagerActionResponse response; final GetConfigResponse getConfigResponse; initializeIfNeeded(); @@ -755,7 +755,7 @@ void fireNewMeetMeUser(MeetMeUser user) { } } - ManagerResponse sendActionOnEventConnection(ManagerAction action) throws ManagerCommunicationException { + ManagerActionResponse sendActionOnEventConnection(ManagerAction action) throws ManagerCommunicationException { try { return eventConnection.sendAction(action); } catch (Exception e) { @@ -763,7 +763,7 @@ ManagerResponse sendActionOnEventConnection(ManagerAction action) throws Manager } } - ManagerResponse sendAction(ManagerAction action) throws ManagerCommunicationException { + ManagerActionResponse sendAction(ManagerAction action) throws ManagerCommunicationException { // return connectionPool.sendAction(action); try { return eventConnection.sendAction(action); diff --git a/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java b/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java index 5aa1e4437..983598adb 100644 --- a/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java +++ b/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.live.internal; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.live.ManagerCommunicationException; import org.asteriskjava.live.MeetMeRoom; import org.asteriskjava.lock.LockableMap; @@ -156,7 +156,7 @@ void handleMeetMeEvent(AbstractMeetMeEvent event) { private void populateRoom(MeetMeRoomImpl room) { final CommandAction meetMeListAction; - final ManagerResponse response; + final ManagerActionResponse response; final List lines; final Collection userNumbers = new ArrayList<>(); // list // of diff --git a/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java b/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java index 7a1cfe5b5..244d176ba 100644 --- a/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java +++ b/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java @@ -18,7 +18,7 @@ import org.asteriskjava.AsteriskVersion; import org.asteriskjava.ami.action.ManagerAction; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.manager.action.EventGeneratingAction; import org.asteriskjava.manager.event.ManagerEvent; import org.asteriskjava.manager.internal.ManagerConnectionImpl; @@ -288,12 +288,12 @@ public void logoff() throws IllegalStateException { impl.logoff(); } - public ManagerResponse sendAction(ManagerAction action) + public ManagerActionResponse sendAction(ManagerAction action) throws IOException, TimeoutException, IllegalArgumentException, IllegalStateException { return impl.sendAction(action); } - public ManagerResponse sendAction(ManagerAction action, long timeout) + public ManagerActionResponse sendAction(ManagerAction action, long timeout) throws IOException, TimeoutException, IllegalArgumentException, IllegalStateException { return impl.sendAction(action, timeout); } diff --git a/src/main/java/org/asteriskjava/manager/ManagerConnection.java b/src/main/java/org/asteriskjava/manager/ManagerConnection.java index 0fe3a5f23..e321f92ad 100644 --- a/src/main/java/org/asteriskjava/manager/ManagerConnection.java +++ b/src/main/java/org/asteriskjava/manager/ManagerConnection.java @@ -19,7 +19,7 @@ import org.asteriskjava.AsteriskVersion; import org.asteriskjava.ami.action.ChallengeAction; import org.asteriskjava.ami.action.ManagerAction; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.manager.action.EventGeneratingAction; import org.asteriskjava.manager.event.ManagerEvent; @@ -33,7 +33,7 @@ *

    * The ManagerConnection repesents a connection to an Asterisk server and is * capable of sending {@link ManagerAction}s and - * receiving {@link ManagerResponse}s and + * receiving {@link ManagerActionResponse}s and * {@link org.asteriskjava.manager.event.ManagerEvent}s. It does not add any * further functionality but rather provides a Java view to Asterisk's Manager * API (freeing you from TCP/IP connection and parsing stuff). @@ -295,12 +295,12 @@ public interface ManagerConnection { * @see #sendAction(ManagerAction, long) * @see #sendAction(ManagerAction, SendActionCallback) */ - ManagerResponse sendAction(ManagerAction action) + ManagerActionResponse sendAction(ManagerAction action) throws IOException, TimeoutException, IllegalArgumentException, IllegalStateException; /** * Sends a ManagerAction to the Asterisk server and waits for the - * corresponding {@link ManagerResponse}. + * corresponding {@link ManagerActionResponse}. * * @param action the action to send to the Asterisk server * @param timeout milliseconds to wait for the response before throwing a @@ -314,12 +314,12 @@ ManagerResponse sendAction(ManagerAction action) * server. * @see #sendAction(ManagerAction, SendActionCallback) */ - ManagerResponse sendAction(ManagerAction action, long timeout) + ManagerActionResponse sendAction(ManagerAction action, long timeout) throws IOException, TimeoutException, IllegalArgumentException, IllegalStateException; /** * Sends a ManagerAction to the Asterisk server and registers a callback - * handler to be called when the corresponding {@link ManagerResponse} is + * handler to be called when the corresponding {@link ManagerActionResponse} is * received. Be very careful that your callbackHandler terminates very * quickly and does not do any fancy processing because it is called from * the reader thread which is blocked for the time it takes to execute your @@ -339,11 +339,11 @@ void sendAction(ManagerAction action, SendActionCallback callback) /** * Sends an {@link EventGeneratingAction} to the Asterisk server and waits - * for the corresponding {@link ManagerResponse} and the + * for the corresponding {@link ManagerActionResponse} and the * {@link org.asteriskjava.manager.event.ResponseEvent}s *

    * EventGeneratingActions are {@link ManagerAction}s that don't return their - * response in the corresponding {@link ManagerResponse} but send a series + * response in the corresponding {@link ManagerActionResponse} but send a series * of events that contain the payload. *

    * This method will block until the correpsonding action complete event has @@ -376,11 +376,11 @@ ResponseEvents sendEventGeneratingAction(EventGeneratingAction action) /** * Sends an {@link EventGeneratingAction} to the Asterisk server and waits - * for the corresponding {@link ManagerResponse} and the + * for the corresponding {@link ManagerActionResponse} and the * {@link org.asteriskjava.manager.event.ResponseEvent}s *

    * EventGeneratingActions are {@link ManagerAction}s that don't return their - * response in the corresponding {@link ManagerResponse} but send a series + * response in the corresponding {@link ManagerActionResponse} but send a series * of events that contain the payload. *

    * This method will block until the correpsonding action complete event has diff --git a/src/main/java/org/asteriskjava/manager/PingThread.java b/src/main/java/org/asteriskjava/manager/PingThread.java index f7c599515..b26dd4cf7 100644 --- a/src/main/java/org/asteriskjava/manager/PingThread.java +++ b/src/main/java/org/asteriskjava/manager/PingThread.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.lock.LockableSet; import org.asteriskjava.lock.Locker.LockCloser; import org.asteriskjava.manager.action.PingAction; @@ -170,7 +170,7 @@ protected void ping(ManagerConnection c) { if (timeout <= 0) { c.sendAction(new PingAction(), null); } else { - final ManagerResponse response; + final ManagerActionResponse response; response = c.sendAction(new PingAction(), timeout); logger.debug("Ping response '" + response + "' for " + c.toString()); diff --git a/src/main/java/org/asteriskjava/manager/ResponseEvents.java b/src/main/java/org/asteriskjava/manager/ResponseEvents.java index bd4628797..20b9a53ee 100644 --- a/src/main/java/org/asteriskjava/manager/ResponseEvents.java +++ b/src/main/java/org/asteriskjava/manager/ResponseEvents.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.manager.event.ResponseEvent; import java.util.Collection; @@ -25,7 +25,7 @@ /** * Contains the result of executing an * {@link org.asteriskjava.manager.action.EventGeneratingAction}, that is the - * {@link ManagerResponse} and any received + * {@link ManagerActionResponse} and any received * {@link org.asteriskjava.manager.event.ManagerEvent}s. * * @author srt @@ -39,7 +39,7 @@ public interface ResponseEvents { * * @return the response received. */ - ManagerResponse getResponse(); + ManagerActionResponse getResponse(); /** * Returns a Collection of ManagerEvents that have been received including diff --git a/src/main/java/org/asteriskjava/manager/SendActionCallback.java b/src/main/java/org/asteriskjava/manager/SendActionCallback.java index 07b21a579..da8ad498a 100644 --- a/src/main/java/org/asteriskjava/manager/SendActionCallback.java +++ b/src/main/java/org/asteriskjava/manager/SendActionCallback.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager; import org.asteriskjava.ami.action.ManagerAction; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; /** * Callback interface to send {@link ManagerAction}s @@ -33,5 +33,5 @@ public interface SendActionCallback { * * @param response the response that has been received */ - void onResponse(ManagerResponse response); + void onResponse(ManagerActionResponse response); } diff --git a/src/main/java/org/asteriskjava/manager/SendEventGeneratingActionCallback.java b/src/main/java/org/asteriskjava/manager/SendEventGeneratingActionCallback.java index 96e203824..437c049ed 100644 --- a/src/main/java/org/asteriskjava/manager/SendEventGeneratingActionCallback.java +++ b/src/main/java/org/asteriskjava/manager/SendEventGeneratingActionCallback.java @@ -1,6 +1,6 @@ package org.asteriskjava.manager; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.manager.response.ManagerError; /** @@ -9,8 +9,8 @@ * * @see org.asteriskjava.manager.ManagerConnection#sendEventGeneratingAction(org.asteriskjava.manager.action.EventGeneratingAction, SendEventGeneratingActionCallback) *

    - * Initial response is passed to one of {@link #onResponse(ManagerResponse)} or - * {@link #onErrorResponse(ManagerResponse)}. but not both. + * Initial response is passed to one of {@link #onResponse(ManagerActionResponse)} or + * {@link #onErrorResponse(ManagerActionResponse)}. but not both. */ public interface SendEventGeneratingActionCallback { /** diff --git a/src/main/java/org/asteriskjava/manager/action/GetVarAction.java b/src/main/java/org/asteriskjava/manager/action/GetVarAction.java index df98673bf..aa61c705d 100644 --- a/src/main/java/org/asteriskjava/manager/action/GetVarAction.java +++ b/src/main/java/org/asteriskjava/manager/action/GetVarAction.java @@ -18,7 +18,7 @@ import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.ami.action.annotation.ExpectedResponse; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.manager.response.GetVarResponse; /** @@ -33,8 +33,8 @@ * the Manager API itself.

    * GetVarAction returns a {@link org.asteriskjava.manager.response.GetVarResponse}. * To get the actual value from the corresponding - * {@link ManagerResponse} call - * {@link ManagerResponse#getAttribute(String)} + * {@link ManagerActionResponse} call + * {@link ManagerActionResponse#getAttribute(String)} * with either the variable name as parameter (for Asterisk 1.0.x) or * with "Value" as parameter (for Asterisk since 1.2).

    * Example (for Asterisk 1.2):

    diff --git a/src/main/java/org/asteriskjava/manager/action/ListCommandsAction.java b/src/main/java/org/asteriskjava/manager/action/ListCommandsAction.java index 2052012f8..ab9e8676d 100644 --- a/src/main/java/org/asteriskjava/manager/action/ListCommandsAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ListCommandsAction.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.action; import org.asteriskjava.ami.action.AbstractManagerAction; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; /** * The ListCommandsAction returns possible commands in the Manager interface. @@ -25,7 +25,7 @@ * Use the getAttributes method on the ManagerResponse for a map of commands and explanations. * * @author martins - * @see ManagerResponse#getAttributes() + * @see ManagerActionResponse#getAttributes() * @since 0.3 */ public class ListCommandsAction extends AbstractManagerAction { diff --git a/src/main/java/org/asteriskjava/manager/action/SipShowPeerAction.java b/src/main/java/org/asteriskjava/manager/action/SipShowPeerAction.java index 6036b513b..2b463c272 100644 --- a/src/main/java/org/asteriskjava/manager/action/SipShowPeerAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SipShowPeerAction.java @@ -18,13 +18,13 @@ import org.asteriskjava.ami.action.AbstractManagerAction; import org.asteriskjava.ami.action.annotation.ExpectedResponse; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.manager.response.SipShowPeerResponse; /** * Retrieves a the details about a given SIP peer.

    * The result is returned in the response received in reply to this action.

    - * Use {@link ManagerResponse#getAttribute(String)} + * Use {@link ManagerActionResponse#getAttribute(String)} * to retrieve the properties. Consider using {@link org.asteriskjava.manager.action.SipPeersAction} * instead.

    * Available since Asterisk 1.2 diff --git a/src/main/java/org/asteriskjava/manager/internal/AsyncEventPump.java b/src/main/java/org/asteriskjava/manager/internal/AsyncEventPump.java index 2eed9df38..c1a843750 100644 --- a/src/main/java/org/asteriskjava/manager/internal/AsyncEventPump.java +++ b/src/main/java/org/asteriskjava/manager/internal/AsyncEventPump.java @@ -1,7 +1,7 @@ package org.asteriskjava.manager.internal; import com.google.common.util.concurrent.RateLimiter; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.lock.Locker; import org.asteriskjava.manager.event.ManagerEvent; import org.asteriskjava.pbx.util.LogTime; @@ -143,7 +143,7 @@ public void stop() { * add a ManagerResponse to the queue, only if the queue is not full */ @Override - public void dispatchResponse(ManagerResponse response, Integer requiredHandlingTime) { + public void dispatchResponse(ManagerActionResponse response, Integer requiredHandlingTime) { if (!queue.offer(new EventWrapper(response))) { logger.error(name + " Event queue is full, not processing ManagerResponse " + response); } @@ -161,7 +161,7 @@ public void dispatchEvent(ManagerEvent event, Integer requiredHandlingTime) { private static class EventWrapper { LogTime timer = new LogTime(); - ManagerResponse response; + ManagerActionResponse response; ManagerEvent event; CountDownLatch poison; @@ -180,7 +180,7 @@ public String getPayloadAsString() { } - EventWrapper(ManagerResponse response) { + EventWrapper(ManagerActionResponse response) { this.response = response; } diff --git a/src/main/java/org/asteriskjava/manager/internal/Dispatcher.java b/src/main/java/org/asteriskjava/manager/internal/Dispatcher.java index c941a8d2b..95ac2b417 100644 --- a/src/main/java/org/asteriskjava/manager/internal/Dispatcher.java +++ b/src/main/java/org/asteriskjava/manager/internal/Dispatcher.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.internal; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.manager.event.ManagerEvent; /** @@ -31,7 +31,7 @@ */ interface Dispatcher { /** - * This method is called by the reader whenever a {@link ManagerResponse} is + * This method is called by the reader whenever a {@link ManagerActionResponse} is * received. The response is dispatched to the associated * {@link org.asteriskjava.manager.SendActionCallback}. * @@ -40,7 +40,7 @@ interface Dispatcher { * within to not cause a back log of events * @see ManagerReader */ - void dispatchResponse(ManagerResponse response, Integer requiredHandlingTime); + void dispatchResponse(ManagerActionResponse response, Integer requiredHandlingTime); /** * This method is called by the reader whenever a ManagerEvent is received. diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index a1b7af443..c6c72f2aa 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -20,8 +20,8 @@ import org.asteriskjava.ami.action.ChallengeAction; import org.asteriskjava.ami.action.ManagerAction; import org.asteriskjava.ami.action.annotation.ExpectedResponse; -import org.asteriskjava.ami.action.response.ChallengeResponse; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ChallengeManagerActionResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.lock.Lockable; import org.asteriskjava.lock.LockableList; import org.asteriskjava.lock.LockableMap; @@ -450,7 +450,7 @@ public void login(String eventMask) throws IOException, AuthenticationFailedExce * timeout ms. *

  • Sends a {@link ChallengeAction} requesting a challenge for authType * MD5. - *
  • When the {@link ChallengeResponse} is received a {@link LoginAction} + *
  • When the {@link ChallengeManagerActionResponse} is received a {@link LoginAction} * is sent using the calculated key (MD5 hash of the password appended to * the received challenge). * @@ -473,11 +473,11 @@ protected void doLogin(long timeout, String eventMask) throws IOException, AuthenticationFailedException, TimeoutException { try (LockCloser closer = this.withLock()) { ChallengeAction challengeAction; - ManagerResponse challengeResponse; + ManagerActionResponse challengeResponse; String challenge; String key; LoginAction loginAction; - ManagerResponse loginResponse; + ManagerActionResponse loginResponse; if (socket == null) { connect(); @@ -509,8 +509,8 @@ protected void doLogin(long timeout, String eventMask) throw new AuthenticationFailedException("Unable to send challenge action", e); } - if (challengeResponse instanceof ChallengeResponse) { - challenge = ((ChallengeResponse) challengeResponse).getChallenge(); + if (challengeResponse instanceof ChallengeManagerActionResponse) { + challenge = ((ChallengeManagerActionResponse) challengeResponse).getChallenge(); } else { disconnect(); throw new AuthenticationFailedException("Unable to get challenge from Asterisk. ChallengeAction returned: " @@ -606,7 +606,7 @@ protected AsteriskVersion determineVersion() throws IOException, TimeoutExceptio */ protected AsteriskVersion determineVersionByCoreSettings() throws Exception { - ManagerResponse response = sendAction(new CoreSettingsAction()); + ManagerActionResponse response = sendAction(new CoreSettingsAction()); if (!(response instanceof CoreSettingsResponse)) { // NOTE: you need system or reporting permissions logger.info("Could not get core settings, do we have the necessary permissions?"); @@ -625,7 +625,7 @@ protected AsteriskVersion determineVersionByCoreSettings() throws Exception { * @throws Exception */ protected AsteriskVersion determineVersionByCoreShowVersion() throws Exception { - final ManagerResponse coreShowVersionResponse = sendAction(new CommandAction(CMD_SHOW_VERSION)); + final ManagerActionResponse coreShowVersionResponse = sendAction(new CommandAction(CMD_SHOW_VERSION)); if (coreShowVersionResponse == null || !(coreShowVersionResponse instanceof CommandResponse)) { // this needs 'command' permissions @@ -720,7 +720,7 @@ protected void disconnect() { } } - public ManagerResponse sendAction(ManagerAction action) + public ManagerActionResponse sendAction(ManagerAction action) throws IOException, TimeoutException, IllegalArgumentException, IllegalStateException { return sendAction(action, defaultResponseTimeout); } @@ -730,11 +730,11 @@ public ManagerResponse sendAction(ManagerAction action) * * @param timeout - in milliseconds */ - public ManagerResponse sendAction(ManagerAction action, long timeout) + public ManagerActionResponse sendAction(ManagerAction action, long timeout) throws IOException, TimeoutException, IllegalArgumentException, IllegalStateException { DefaultSendActionCallback callbackHandler = new DefaultSendActionCallback(); - ManagerResponse response = null; + ManagerActionResponse response = null; try { sendAction(action, callbackHandler); @@ -799,7 +799,7 @@ else if (state != CONNECTED) { } } - Class responseClass = getExpectedResponseClass(action.getClass()); + Class responseClass = getExpectedResponseClass(action.getClass()); if (responseClass != null) { reader.expectResponseClass(internalActionId, responseClass); } @@ -819,7 +819,7 @@ boolean isShowVersionCommandAction(ManagerAction action) { return false; } - private Class getExpectedResponseClass(Class actionClass) { + private Class getExpectedResponseClass(Class actionClass) { final ExpectedResponse annotation = actionClass.getAnnotation(ExpectedResponse.class); if (annotation == null) { return null; @@ -997,14 +997,14 @@ public ManagerConnectionState getState() { /* Implementation of Dispatcher: callbacks for ManagerReader */ /** - * This method is called by the reader whenever a {@link ManagerResponse} is + * This method is called by the reader whenever a {@link ManagerActionResponse} is * received. The response is dispatched to the associated * {@link SendActionCallback}. * * @param response the response received by the reader * @see ManagerReader */ - public void dispatchResponse(ManagerResponse response, Integer requiredHandlingTime) { + public void dispatchResponse(ManagerActionResponse response, Integer requiredHandlingTime) { final String actionId; String internalActionId; SendActionCallback listener; @@ -1398,18 +1398,18 @@ public String toString() { */ private static class DefaultSendActionCallback implements SendActionCallback, Serializable { private static final long serialVersionUID = 7831097958568769220L; - private ManagerResponse response; + private ManagerActionResponse response; private final CountDownLatch latch = new CountDownLatch(1); private volatile boolean disposed = false; private LogTime timer = new LogTime(); - private ManagerResponse waitForResponse(long timeout) throws InterruptedException { + private ManagerActionResponse waitForResponse(long timeout) throws InterruptedException { latch.await(timeout, TimeUnit.MILLISECONDS); return this.response; } @Override - public void onResponse(ManagerResponse response) { + public void onResponse(ManagerActionResponse response) { this.response = response; if (disposed) { logger.error("Response arrived after Disposal and assumably Timeout " + response + " elapsed: " @@ -1475,7 +1475,7 @@ public void onManagerEvent(ManagerEvent event) { } } - public void onResponse(ManagerResponse response) { + public void onResponse(ManagerActionResponse response) { // If disconnected if (response == null) { // Set flag that must not wait for the response @@ -1541,7 +1541,7 @@ public void onManagerEvent(ManagerEvent event) { } @Override - public void onResponse(ManagerResponse response) { + public void onResponse(ManagerActionResponse response) { // If disconnected if (response == null) { callback.onResponse(events); diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerReader.java b/src/main/java/org/asteriskjava/manager/internal/ManagerReader.java index 4f25ab69c..9510bcb3f 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerReader.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerReader.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.internal; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.manager.event.ManagerEvent; import org.asteriskjava.util.SocketConnectionFacade; @@ -57,7 +57,7 @@ public interface ManagerReader extends Runnable { */ void registerEventClass(Class event); - void expectResponseClass(String internalActionId, Class responseClass); + void expectResponseClass(String internalActionId, Class responseClass); /** * Terminates this reader. diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerReaderImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerReaderImpl.java index d43e3b218..c9d06e832 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerReaderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerReaderImpl.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.internal; import com.google.common.util.concurrent.RateLimiter; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.manager.event.DisconnectEvent; import org.asteriskjava.manager.event.ManagerEvent; import org.asteriskjava.manager.event.ProtocolIdentifierReceivedEvent; @@ -56,7 +56,7 @@ public class ManagerReaderImpl implements ManagerReader { */ private final ResponseBuilder responseBuilder; - private final Map> expectedResponseClasses; + private final Map> expectedResponseClasses; /** * The source to use when creating {@link ManagerEvent}s. @@ -120,7 +120,7 @@ public void registerEventClass(Class eventClass) { eventBuilder.registerEventClass(eventClass); } - public void expectResponseClass(String internalActionId, Class responseClass) { + public void expectResponseClass(String internalActionId, Class responseClass) { expectedResponseClasses.put(internalActionId, responseClass); } @@ -132,7 +132,7 @@ public void expectResponseClass(String internalActionId, Class buffer) { - Class responseClass = null; + private ManagerActionResponse buildResponse(Map buffer) { + Class responseClass = null; final String actionId = (String) buffer.get("actionid"); final String internalActionId = ManagerUtil.getInternalActionId(actionId); if (internalActionId != null) { responseClass = expectedResponseClasses.remove(internalActionId); } - final ManagerResponse response = responseBuilder.buildResponse(responseClass, buffer); + final ManagerActionResponse response = responseBuilder.buildResponse(responseClass, buffer); if (response != null) { response.setDateReceived(DateUtil.getDate().toInstant()); diff --git a/src/main/java/org/asteriskjava/manager/internal/ResponseBuilder.java b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilder.java index 8cd82e97f..144ba2723 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ResponseBuilder.java +++ b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilder.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.internal; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import java.util.Map; @@ -26,7 +26,7 @@ * * @author srt * @version $Id$ - * @see ManagerResponse + * @see ManagerActionResponse */ interface ResponseBuilder { /** @@ -37,5 +37,5 @@ interface ResponseBuilder { * case. * @return the response with the given attributes. */ - ManagerResponse buildResponse(Class responseClass, Map attributes); + ManagerActionResponse buildResponse(Class responseClass, Map attributes); } diff --git a/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java index b34c58ced..eb183fb86 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java @@ -15,7 +15,7 @@ */ package org.asteriskjava.manager.internal; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.ami.action.response.ResponseType; import org.asteriskjava.core.databind.AsteriskDecoder; import org.asteriskjava.manager.response.CommandResponse; @@ -32,7 +32,7 @@ * * @author srt * @version $Id$ - * @see ManagerResponse + * @see ManagerActionResponse */ class ResponseBuilderImpl implements ResponseBuilder { private static final Logger logger = getLogger(ResponseBuilderImpl.class); @@ -48,21 +48,21 @@ class ResponseBuilderImpl implements ResponseBuilder { private final AsteriskDecoder asteriskDecoder = new AsteriskDecoder(false); @SuppressWarnings("unchecked") - public ManagerResponse buildResponse(Class responseClass, Map attributes) { - responseClass = responseClass == null ? ManagerResponse.class : responseClass; + public ManagerActionResponse buildResponse(Class responseClass, Map attributes) { + responseClass = responseClass == null ? ManagerActionResponse.class : responseClass; if (responseClass.getPackageName().contains("org.asteriskjava.ami.action.response")) { - ManagerResponse response = asteriskDecoder.decode(attributes, responseClass); + ManagerActionResponse response = asteriskDecoder.decode(attributes, responseClass); response.setAttributes(new HashMap<>(attributes)); return response; } - final ManagerResponse response; + final ManagerActionResponse response; final String responseType = (String) attributes.get(RESPONSE_KEY); if (RESPONSE_TYPE_ERROR.equalsIgnoreCase(responseType)) { response = new ManagerError(); } else if (responseClass == null) { - response = new ManagerResponse(); + response = new ManagerActionResponse(); } else { try { response = responseClass.getDeclaredConstructor().newInstance(); diff --git a/src/main/java/org/asteriskjava/manager/internal/ResponseEventsImpl.java b/src/main/java/org/asteriskjava/manager/internal/ResponseEventsImpl.java index e860edfa7..0698893b1 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ResponseEventsImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ResponseEventsImpl.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.internal; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.lock.LockableList; import org.asteriskjava.lock.Locker.LockCloser; import org.asteriskjava.manager.ResponseEvents; @@ -35,7 +35,7 @@ * @since 0.2 */ public class ResponseEventsImpl implements ResponseEvents { - private ManagerResponse response; + private ManagerActionResponse response; private final LockableList events; private boolean complete; private final CountDownLatch latch = new CountDownLatch(1); @@ -50,7 +50,7 @@ public ResponseEventsImpl() { // implementation of the ResponseEvents interface - public ManagerResponse getResponse() { + public ManagerActionResponse getResponse() { return response; } @@ -69,7 +69,7 @@ public boolean isComplete() { * * @param response the ManagerResponse received. */ - public void setRepsonse(ManagerResponse response) { + public void setRepsonse(ManagerActionResponse response) { this.response = response; } diff --git a/src/main/java/org/asteriskjava/manager/response/CommandResponse.java b/src/main/java/org/asteriskjava/manager/response/CommandResponse.java index 68bdf4938..1bdd8ac87 100644 --- a/src/main/java/org/asteriskjava/manager/response/CommandResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/CommandResponse.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.response; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import java.util.List; @@ -31,7 +31,7 @@ * @version $Id$ * @see org.asteriskjava.manager.action.CommandAction */ -public class CommandResponse extends ManagerResponse { +public class CommandResponse extends ManagerActionResponse { private static final long serialVersionUID = 1L; private String privilege; diff --git a/src/main/java/org/asteriskjava/manager/response/CoreSettingsResponse.java b/src/main/java/org/asteriskjava/manager/response/CoreSettingsResponse.java index d92282e95..45107dc37 100644 --- a/src/main/java/org/asteriskjava/manager/response/CoreSettingsResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/CoreSettingsResponse.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.response; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; /** * Corresponds to a CoreSettingsAction and contains the current settings summary of the @@ -27,7 +27,7 @@ * @see org.asteriskjava.manager.action.CoreSettingsAction * @since 1.0.0 */ -public class CoreSettingsResponse extends ManagerResponse { +public class CoreSettingsResponse extends ManagerActionResponse { private static final long serialVersionUID = 1L; private String amiVersion; diff --git a/src/main/java/org/asteriskjava/manager/response/CoreStatusResponse.java b/src/main/java/org/asteriskjava/manager/response/CoreStatusResponse.java index 2cb58843d..2c9f3e65c 100644 --- a/src/main/java/org/asteriskjava/manager/response/CoreStatusResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/CoreStatusResponse.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.response; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.util.DateUtil; import java.util.Date; @@ -31,7 +31,7 @@ * @see org.asteriskjava.manager.action.CoreStatusAction * @since 1.0.0 */ -public class CoreStatusResponse extends ManagerResponse { +public class CoreStatusResponse extends ManagerActionResponse { private static final long serialVersionUID = 1L; private String coreStartupTime; diff --git a/src/main/java/org/asteriskjava/manager/response/ExtensionStateResponse.java b/src/main/java/org/asteriskjava/manager/response/ExtensionStateResponse.java index 11f434c5c..168ca239f 100644 --- a/src/main/java/org/asteriskjava/manager/response/ExtensionStateResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/ExtensionStateResponse.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.response; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; /** * Response to an {@link org.asteriskjava.manager.action.ExtensionStateAction}. @@ -25,7 +25,7 @@ * @version $Id$ * @see org.asteriskjava.manager.action.ExtensionStateAction */ -public class ExtensionStateResponse extends ManagerResponse { +public class ExtensionStateResponse extends ManagerActionResponse { private static final long serialVersionUID = -2044248427247227390L; private String exten; private String context; diff --git a/src/main/java/org/asteriskjava/manager/response/GetConfigResponse.java b/src/main/java/org/asteriskjava/manager/response/GetConfigResponse.java index b036d8531..7268f3e12 100644 --- a/src/main/java/org/asteriskjava/manager/response/GetConfigResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/GetConfigResponse.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.response; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import java.util.Locale; import java.util.Map; @@ -36,7 +36,7 @@ * @see org.asteriskjava.manager.action.GetConfigAction * @since 0.3 */ -public class GetConfigResponse extends ManagerResponse { +public class GetConfigResponse extends ManagerActionResponse { private static final long serialVersionUID = -2044248427247227390L; private Map categories; diff --git a/src/main/java/org/asteriskjava/manager/response/GetVarResponse.java b/src/main/java/org/asteriskjava/manager/response/GetVarResponse.java index f759ee2f1..2ae370f36 100644 --- a/src/main/java/org/asteriskjava/manager/response/GetVarResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/GetVarResponse.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.response; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; /** * Corresponds to a GetVarAction and contains the value of the requested variable. @@ -26,7 +26,7 @@ * @see org.asteriskjava.manager.action.GetVarAction * @since 1.0.0 */ -public class GetVarResponse extends ManagerResponse { +public class GetVarResponse extends ManagerActionResponse { private static final long serialVersionUID = 1L; private String variable; diff --git a/src/main/java/org/asteriskjava/manager/response/MailboxCountResponse.java b/src/main/java/org/asteriskjava/manager/response/MailboxCountResponse.java index 833200064..497cc6224 100644 --- a/src/main/java/org/asteriskjava/manager/response/MailboxCountResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/MailboxCountResponse.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.response; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; /** * A MailboxCountResponse is sent in response to a MailboxCountAction and contains the number of old @@ -26,7 +26,7 @@ * @version $Id$ * @see org.asteriskjava.manager.action.MailboxCountAction */ -public class MailboxCountResponse extends ManagerResponse { +public class MailboxCountResponse extends ManagerActionResponse { /** * Serial version identifier */ diff --git a/src/main/java/org/asteriskjava/manager/response/MailboxStatusResponse.java b/src/main/java/org/asteriskjava/manager/response/MailboxStatusResponse.java index 47b57017c..aeffd5224 100644 --- a/src/main/java/org/asteriskjava/manager/response/MailboxStatusResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/MailboxStatusResponse.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.response; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; /** * A MailboxStatusResponse is sent in response to a MailboxStatusAction and indicates if a set @@ -26,7 +26,7 @@ * @version $Id$ * @see org.asteriskjava.manager.action.MailboxStatusAction */ -public class MailboxStatusResponse extends ManagerResponse { +public class MailboxStatusResponse extends ManagerActionResponse { /** * Serial version identifier */ diff --git a/src/main/java/org/asteriskjava/manager/response/ManagerError.java b/src/main/java/org/asteriskjava/manager/response/ManagerError.java index faa1cd578..85052ef64 100644 --- a/src/main/java/org/asteriskjava/manager/response/ManagerError.java +++ b/src/main/java/org/asteriskjava/manager/response/ManagerError.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.response; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; /** * Represents an "Response: Error" response received from the asterisk server. @@ -25,7 +25,7 @@ * @author srt * @version $Id$ */ -public class ManagerError extends ManagerResponse { +public class ManagerError extends ManagerActionResponse { /** * Serial version identifier */ diff --git a/src/main/java/org/asteriskjava/manager/response/MixMonitorResponse.java b/src/main/java/org/asteriskjava/manager/response/MixMonitorResponse.java index 04739ecc8..ffc747b1c 100644 --- a/src/main/java/org/asteriskjava/manager/response/MixMonitorResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/MixMonitorResponse.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.response; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; /** * A MixMonitorResponse is sent in response to a MixMonitorAction and provides @@ -26,7 +26,7 @@ * * @see org.asteriskjava.manager.action.MixMonitorAction; */ -public class MixMonitorResponse extends ManagerResponse { +public class MixMonitorResponse extends ManagerActionResponse { private static final long serialVersionUID = 1L; private String mixMonitorId; diff --git a/src/main/java/org/asteriskjava/manager/response/ModuleCheckResponse.java b/src/main/java/org/asteriskjava/manager/response/ModuleCheckResponse.java index b9948e329..a73519ad2 100644 --- a/src/main/java/org/asteriskjava/manager/response/ModuleCheckResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/ModuleCheckResponse.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.response; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; /** * Corresponds to a ModuleCheckAction and contains the version of the module. @@ -26,7 +26,7 @@ * @see org.asteriskjava.manager.action.ModuleCheckAction * @since 1.0.0 */ -public class ModuleCheckResponse extends ManagerResponse { +public class ModuleCheckResponse extends ManagerActionResponse { private static final long serialVersionUID = -7253724086340850957L; private String version; diff --git a/src/main/java/org/asteriskjava/manager/response/PingResponse.java b/src/main/java/org/asteriskjava/manager/response/PingResponse.java index 035f42aff..c6550545d 100644 --- a/src/main/java/org/asteriskjava/manager/response/PingResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/PingResponse.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.response; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; /** * Corresponds to a PingAction and contains an additional (yet useless) ping property. @@ -24,7 +24,7 @@ * @author srt * @see org.asteriskjava.manager.action.PingAction */ -public class PingResponse extends ManagerResponse { +public class PingResponse extends ManagerActionResponse { private static final long serialVersionUID = 0L; private String ping; diff --git a/src/main/java/org/asteriskjava/manager/response/SipShowPeerResponse.java b/src/main/java/org/asteriskjava/manager/response/SipShowPeerResponse.java index 2d35b7a2f..b8babdf7f 100644 --- a/src/main/java/org/asteriskjava/manager/response/SipShowPeerResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/SipShowPeerResponse.java @@ -15,7 +15,7 @@ */ package org.asteriskjava.manager.response; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import java.util.Map; @@ -27,7 +27,7 @@ * @see org.asteriskjava.manager.action.SipShowPeerAction * @since 1.0.0 */ -public class SipShowPeerResponse extends ManagerResponse { +public class SipShowPeerResponse extends ManagerActionResponse { private static final long serialVersionUID = 1L; private String channelType; diff --git a/src/main/java/org/asteriskjava/manager/response/SkypeBuddyResponse.java b/src/main/java/org/asteriskjava/manager/response/SkypeBuddyResponse.java index a751d8466..21cbe2e97 100644 --- a/src/main/java/org/asteriskjava/manager/response/SkypeBuddyResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/SkypeBuddyResponse.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.response; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; /** * Corresponds to a SkypeBuddyAction and contains the details of a Skype buddy. @@ -24,7 +24,7 @@ * @see org.asteriskjava.manager.action.SkypeBuddyAction * @since 1.0.0 */ -public class SkypeBuddyResponse extends ManagerResponse { +public class SkypeBuddyResponse extends ManagerActionResponse { private static final long serialVersionUID = 0L; private String skypename; diff --git a/src/main/java/org/asteriskjava/manager/response/SkypeLicenseStatusResponse.java b/src/main/java/org/asteriskjava/manager/response/SkypeLicenseStatusResponse.java index 4549a9342..493162c57 100644 --- a/src/main/java/org/asteriskjava/manager/response/SkypeLicenseStatusResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/SkypeLicenseStatusResponse.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.response; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; /** * Corresponds to a SkypeLicenseStatusAction and contains the number of licensed Skype calls. @@ -24,7 +24,7 @@ * @see org.asteriskjava.manager.action.SkypeLicenseStatusAction * @since 1.0.0 */ -public class SkypeLicenseStatusResponse extends ManagerResponse { +public class SkypeLicenseStatusResponse extends ManagerActionResponse { private static final long serialVersionUID = 0L; private Integer callsLicensed; diff --git a/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java b/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java index 83837959b..afc58e4a7 100644 --- a/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java +++ b/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java @@ -15,7 +15,7 @@ */ package org.asteriskjava.manager.util; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.manager.event.CdrEvent; import org.asteriskjava.manager.event.UserEvent; import org.asteriskjava.util.AstUtil; @@ -82,7 +82,7 @@ public static void setAttributes(Object target, Map attributes, // it seems silly to warn if it's a user event -- maybe it was // intentional - if (setter == null && !(target instanceof UserEvent) && !target.getClass().equals(ManagerResponse.class)) { + if (setter == null && !(target instanceof UserEvent) && !target.getClass().equals(ManagerActionResponse.class)) { //CDR has dynamic properties if (target instanceof CdrEvent) { diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/CommandResponse.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/CommandResponse.java index c9a4e1675..af55ba501 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/CommandResponse.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/CommandResponse.java @@ -1,5 +1,7 @@ package org.asteriskjava.pbx.asterisk.wrap.response; +import org.asteriskjava.ami.action.response.ManagerActionResponse; + import java.util.Collections; import java.util.List; @@ -8,7 +10,7 @@ public class CommandResponse extends ManagerResponse { private List result; private boolean error; - public CommandResponse(org.asteriskjava.ami.action.response.ManagerResponse response) { + public CommandResponse(ManagerActionResponse response) { super(response); if (response instanceof org.asteriskjava.manager.response.CommandResponse) { diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerError.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerError.java index 455057476..2b2562edf 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerError.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerError.java @@ -1,10 +1,10 @@ package org.asteriskjava.pbx.asterisk.wrap.response; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; public class ManagerError extends CommandResponse { - public ManagerError(ManagerResponse error) { + public ManagerError(ManagerActionResponse error) { super(error); } diff --git a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerResponse.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerResponse.java index f81d6cbf0..62b1f9dc1 100644 --- a/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerResponse.java +++ b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/ManagerResponse.java @@ -1,5 +1,6 @@ package org.asteriskjava.pbx.asterisk.wrap.response; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.manager.response.ManagerError; import java.util.Date; @@ -22,7 +23,7 @@ public class ManagerResponse { final private String _uniqueId; final private Map _attributes; - public ManagerResponse(org.asteriskjava.ami.action.response.ManagerResponse response) { + public ManagerResponse(ManagerActionResponse response) { this._dateReceived = Date.from(response.getDateReceived()); this._actionId = response.getActionId(); this._server = response.getServer(); diff --git a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java index 9df47871a..971501570 100644 --- a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java +++ b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java @@ -1,5 +1,6 @@ package org.asteriskjava.pbx.internal.core; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.pbx.asterisk.wrap.actions.ManagerAction; import org.asteriskjava.pbx.asterisk.wrap.events.ManagerEvent; import org.asteriskjava.pbx.asterisk.wrap.events.ResponseEvent; @@ -136,7 +137,7 @@ public static ResponseEvent build(org.asteriskjava.manager.event.ResponseEvent e return response; } - public static ManagerResponse build(org.asteriskjava.ami.action.response.ManagerResponse response) { + public static ManagerResponse build(ManagerActionResponse response) { ManagerResponse result; if (response instanceof org.asteriskjava.manager.response.CommandResponse) { result = new CommandResponse(response); diff --git a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentManagerConnection.java b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentManagerConnection.java index 068cc77ce..f02b7dfe6 100644 --- a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentManagerConnection.java +++ b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentManagerConnection.java @@ -1,6 +1,7 @@ package org.asteriskjava.pbx.internal.core; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.manager.*; import org.asteriskjava.pbx.*; import org.asteriskjava.pbx.asterisk.wrap.actions.*; @@ -284,7 +285,7 @@ public static ManagerResponse sendAction(final ManagerAction action, final int t && (CoherentManagerConnection.managerConnection.getState() == ManagerConnectionState.CONNECTED)) { final org.asteriskjava.ami.action.ManagerAction ajAction = action.getAJAction(); - org.asteriskjava.ami.action.response.ManagerResponse response = CoherentManagerConnection.managerConnection + ManagerActionResponse response = CoherentManagerConnection.managerConnection .sendAction(ajAction, timeout); ManagerResponse convertedResponse = null; diff --git a/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java b/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java index 5bb06948f..8f4306c95 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java @@ -17,7 +17,7 @@ package org.asteriskjava.manager.internal; import org.asteriskjava.AsteriskVersion; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.ami.action.response.ResponseType; import org.asteriskjava.manager.AuthenticationFailedException; import org.asteriskjava.manager.ManagerConnectionState; @@ -322,7 +322,7 @@ void testSendActionWhenNotConnected() throws Exception { @Test void testSendAction() throws Exception { StatusAction statusAction; - ManagerResponse response; + ManagerActionResponse response; statusAction = new StatusAction(); statusAction.setActionId("123"); @@ -364,9 +364,9 @@ void testSendActionTimeout() throws Exception { @Test void testDispatchResponseUnexpectedResponse() { - ManagerResponse response; + ManagerActionResponse response; - response = new ManagerResponse(); + response = new ManagerActionResponse(); // internalActionId: 123_0 response.setActionId("123_0-abc"); response.setResponse(ResponseType.Success); @@ -377,9 +377,9 @@ void testDispatchResponseUnexpectedResponse() { @Test void testDispatchResponseMissingInternalActionId() { - ManagerResponse response; + ManagerActionResponse response; - response = new ManagerResponse(); + response = new ManagerActionResponse(); response.setActionId("abc"); response.setResponse(ResponseType.Success); @@ -389,9 +389,9 @@ void testDispatchResponseMissingInternalActionId() { @Test void testDispatchResponseNullActionId() { - ManagerResponse response; + ManagerActionResponse response; - response = new ManagerResponse(); + response = new ManagerActionResponse(); response.setActionId(null); response.setResponse(ResponseType.Success); diff --git a/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java b/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java index 9ef366c6a..bc0e1b9fa 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.internal; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.ami.action.response.ResponseType; import org.asteriskjava.manager.event.*; import org.asteriskjava.manager.response.CommandResponse; @@ -208,7 +208,7 @@ void testRunReceivingResponse() throws Exception { assertEquals(1, dispatcher.dispatchedResponses.size(), "not exactly one response dispatched"); - assertEquals(ManagerResponse.class, dispatcher.dispatchedResponses.get(0).getClass(), "first response must be a ManagerResponse"); + assertEquals(ManagerActionResponse.class, dispatcher.dispatchedResponses.get(0).getClass(), "first response must be a ManagerResponse"); assertEquals(ResponseType.Success, dispatcher.dispatchedResponses.get(0).getResponse(), "ManagerResponse contains incorrect response"); assertEquals("Authentication accepted", dispatcher.dispatchedResponses.get(0).getMessage(), "ManagerResponse contains incorrect message"); @@ -271,15 +271,15 @@ void testRunCatchingIOException() throws Exception { private class MockedDispatcher implements Dispatcher { List dispatchedEvents; - List dispatchedResponses; + List dispatchedResponses; public MockedDispatcher() { this.dispatchedEvents = new ArrayList(); - this.dispatchedResponses = new ArrayList(); + this.dispatchedResponses = new ArrayList(); } @Override - public void dispatchResponse(ManagerResponse response, Integer requiredHandlingTime) { + public void dispatchResponse(ManagerActionResponse response, Integer requiredHandlingTime) { dispatchedResponses.add(response); } diff --git a/src/test/java/org/asteriskjava/manager/internal/ManagerReaderMock.java b/src/test/java/org/asteriskjava/manager/internal/ManagerReaderMock.java index dff75df80..7bbdee101 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerReaderMock.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerReaderMock.java @@ -16,7 +16,7 @@ */ package org.asteriskjava.manager.internal; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.manager.event.ManagerEvent; import org.asteriskjava.util.SocketConnectionFacade; @@ -39,7 +39,7 @@ public void setSocket(SocketConnectionFacade socket) { setSocketCalls++; } - public void expectResponseClass(String actionId, Class responseClass) { + public void expectResponseClass(String actionId, Class responseClass) { } diff --git a/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java b/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java index 497ad292d..b6efdfc56 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java @@ -20,8 +20,8 @@ import org.asteriskjava.ami.action.AuthType; import org.asteriskjava.ami.action.ChallengeAction; import org.asteriskjava.ami.action.ManagerAction; -import org.asteriskjava.ami.action.response.ChallengeResponse; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ChallengeManagerActionResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.ami.action.response.ResponseType; import org.asteriskjava.manager.action.LoginAction; import org.asteriskjava.manager.action.LogoffAction; @@ -107,12 +107,12 @@ public void sendAction(ManagerAction action, String internalActionId) throws IOE challengeActionsSent++; if (sendResponse) { - ChallengeResponse challengeResponse; + ChallengeManagerActionResponse challengeManagerActionResponse; - challengeResponse = new ChallengeResponse(); - challengeResponse.setActionId(ManagerUtil.addInternalActionId(action.getActionId(), internalActionId)); - challengeResponse.setChallenge(CHALLENGE); - dispatchLater(challengeResponse); + challengeManagerActionResponse = new ChallengeManagerActionResponse(); + challengeManagerActionResponse.setActionId(ManagerUtil.addInternalActionId(action.getActionId(), internalActionId)); + challengeManagerActionResponse.setChallenge(CHALLENGE); + dispatchLater(challengeManagerActionResponse); } } else if (action instanceof LoginAction) { @@ -132,13 +132,13 @@ public void sendAction(ManagerAction action, String internalActionId) throws IOE loginActionsSent++; if (sendResponse) { - ManagerResponse loginResponse; + ManagerActionResponse loginResponse; // let testReconnectWithKeepAliveAfterAuthenticationFailure // succeed after // 3 unsuccessful attempts if (key.equals(expectedKey) || loginActionsSent > 2) { - loginResponse = new ManagerResponse(); + loginResponse = new ManagerActionResponse(); loginResponse.setResponse(ResponseType.Success); } else { loginResponse = new ManagerError(); @@ -152,9 +152,9 @@ public void sendAction(ManagerAction action, String internalActionId) throws IOE logoffActionsSent++; if (sendResponse) { - ManagerResponse response; + ManagerActionResponse response; - response = new ManagerResponse(); + response = new ManagerActionResponse(); response.setActionId(ManagerUtil.addInternalActionId(action.getActionId(), internalActionId)); response.setResponse(ResponseType.Success); dispatchLater(response); @@ -163,9 +163,9 @@ public void sendAction(ManagerAction action, String internalActionId) throws IOE otherActionsSent++; if (sendResponse) { - ManagerResponse response; + ManagerActionResponse response; - response = new ManagerResponse(); + response = new ManagerActionResponse(); response.setActionId(ManagerUtil.addInternalActionId(action.getActionId(), internalActionId)); response.setResponse(ResponseType.Success); dispatchLater(response); @@ -173,7 +173,7 @@ public void sendAction(ManagerAction action, String internalActionId) throws IOE } } - private void dispatchLater(final ManagerResponse response) { + private void dispatchLater(final ManagerActionResponse response) { Thread future = new Thread(new Runnable() { public void run() { try { diff --git a/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java b/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java index 9a71866c1..8bbf69e73 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java @@ -16,8 +16,8 @@ */ package org.asteriskjava.manager.internal; -import org.asteriskjava.ami.action.response.ChallengeResponse; -import org.asteriskjava.ami.action.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ChallengeManagerActionResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.ami.action.response.ResponseType; import org.asteriskjava.manager.response.ExtensionStateResponse; import org.asteriskjava.manager.response.MailboxCountResponse; @@ -42,64 +42,64 @@ void setUp() { @Test void testBuildResponse() { - ManagerResponse response; + ManagerActionResponse response; attributes.put("response", "Success"); - response = responseBuilder.buildResponse(ManagerResponse.class, attributes); - assertEquals(ManagerResponse.class, response.getClass(), "Response of wrong type"); + response = responseBuilder.buildResponse(ManagerActionResponse.class, attributes); + assertEquals(ManagerActionResponse.class, response.getClass(), "Response of wrong type"); assertEquals(ResponseType.Success, response.getResponse(), "Response not set correctly"); } @Test void testBuildResponseWithoutResponseClass() { - ManagerResponse response; + ManagerActionResponse response; attributes.put("response", "Success"); response = responseBuilder.buildResponse(null, attributes); - assertEquals(ManagerResponse.class, response.getClass(), "Response of wrong type"); + assertEquals(ManagerActionResponse.class, response.getClass(), "Response of wrong type"); assertEquals(ResponseType.Success, response.getResponse(), "Response not set correctly"); } @Test void testBuildError() { - ManagerResponse response; + ManagerActionResponse response; attributes.put("response", "Error"); attributes.put("message", "Missing action in request"); - response = responseBuilder.buildResponse(ManagerResponse.class, attributes); + response = responseBuilder.buildResponse(ManagerActionResponse.class, attributes); assertEquals("Missing action in request", response.getMessage(), "Message not set correctly"); } @Test void testBuildErrorWithActionId() { - ManagerResponse response; + ManagerActionResponse response; attributes.put("response", "Error"); attributes.put("actionid", "1234"); attributes.put("message", "Missing action in request"); - response = responseBuilder.buildResponse(ManagerResponse.class, attributes); + response = responseBuilder.buildResponse(ManagerActionResponse.class, attributes); assertEquals("1234", response.getActionId(), "ActionId not set correctly"); } @Test void testBuildChallengeResponse() { - ManagerResponse response; + ManagerActionResponse response; attributes.put("response", "Success"); attributes.put("challenge", "131494410"); - response = responseBuilder.buildResponse(ChallengeResponse.class, attributes); - assertEquals(ChallengeResponse.class, response.getClass(), "Response of wrong type"); - assertEquals("131494410", ((ChallengeResponse) response).getChallenge(), "Challenge not set correctly"); + response = responseBuilder.buildResponse(ChallengeManagerActionResponse.class, attributes); + assertEquals(ChallengeManagerActionResponse.class, response.getClass(), "Response of wrong type"); + assertEquals("131494410", ((ChallengeManagerActionResponse) response).getChallenge(), "Challenge not set correctly"); } @Test void testBuildMailboxStatusResponse() { - ManagerResponse response; + ManagerActionResponse response; attributes.put("response", "Success"); attributes.put("message", "Mailbox Status"); @@ -116,7 +116,7 @@ void testBuildMailboxStatusResponse() { @Test void testBuildMailboxStatusResponseWithNoWaiting() { - ManagerResponse response; + ManagerActionResponse response; attributes.put("response", "Success"); attributes.put("message", "Mailbox Status"); @@ -133,7 +133,7 @@ void testBuildMailboxStatusResponseWithNoWaiting() { @Test void testBuildMailboxCountResponse() { - ManagerResponse response; + ManagerActionResponse response; attributes.put("response", "Success"); attributes.put("message", "Mailbox Message Count"); @@ -152,7 +152,7 @@ void testBuildMailboxCountResponse() { @Test void testBuildExtensionStateResponse() { - ManagerResponse response; + ManagerActionResponse response; attributes.put("response", "Success"); attributes.put("message", "Extension Status");