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/build.gradle b/asterisk-java-ami/build.gradle new file mode 100644 index 000000000..48ee6c2a6 --- /dev/null +++ b/asterisk-java-ami/build.gradle @@ -0,0 +1,40 @@ +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' + 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' + testImplementation 'org.awaitility:awaitility:4.2.0' +} + +tasks.named('test') { + useJUnitPlatform() +} 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/AbstractManagerAction.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/AbstractManagerAction.java new file mode 100644 index 000000000..f9145e018 --- /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-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriterContext.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/AuthType.java similarity index 73% rename from asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriterContext.java rename to asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/AuthType.java index 26b03ce59..2cf03147e 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriterContext.java +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/AuthType.java @@ -13,14 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.asteriskjava.core.databind.writer; +package org.asteriskjava.ami.action; /** - * Context for the process methods. + * Digest algorithms to use in the challenge. * - * @param serializerWriteFieldName whatever serializer write field names * @author Piotr Olaszewski + * @see ChallengeAction * @since 4.0.0 */ -public record AsteriskObjectMethodWriterContext(boolean serializerWriteFieldName) { +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..3c79b3e6f --- /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.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 ChallengeManagerActionResponse} being received from the server. + *

+ * Supported Asterisk versions: + *

+ * + * @author Stefan Reuter + * @author Piotr Olaszewski + * @see ChallengeManagerActionResponse + * @since 1.0.0 + */ +@ExpectedResponse(ChallengeManagerActionResponse.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/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/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/annotation/AsteriskSerialize.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/annotation/ExpectedResponse.java similarity index 57% rename from asterisk-java-core/src/main/java/org/asteriskjava/core/databind/annotation/AsteriskSerialize.java rename to asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/annotation/ExpectedResponse.java index c63d7a6a9..c057ce62a 100644 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/annotation/AsteriskSerialize.java +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/annotation/ExpectedResponse.java @@ -13,27 +13,29 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.asteriskjava.core.databind.annotation; +package org.asteriskjava.ami.action.annotation; -import org.asteriskjava.core.databind.serializer.AsteriskSerializer; +import org.asteriskjava.ami.action.ManagerAction; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME; /** - * Annotation used for configuring serialization aspects, by attaching to "getter" methods. + * Indicates that an annotated {@link ManagerAction} expects a specific subclass of {@link ManagerActionResponse} when + * executed successfully. * - * @author Piotr Olaszewski - * @since 4.0.0 + * @author Stefan Reuter + * @since 1.0.0 */ -@Target({METHOD}) +@Target(TYPE) @Retention(RUNTIME) -public @interface AsteriskSerialize { +public @interface ExpectedResponse { /** - * Serializer class to use for serializing associated value. + * {@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/ChallengeManagerActionResponse.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ChallengeManagerActionResponse.java new file mode 100644 index 000000000..ffe50c2da --- /dev/null +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ChallengeManagerActionResponse.java @@ -0,0 +1,83 @@ +/* + * 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.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; + +/** + * 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 + */ +public class ChallengeManagerActionResponse extends ManagerActionResponse { + @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; + } + + @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/src/main/java/org/asteriskjava/manager/response/ManagerResponse.java b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ManagerActionResponse.java similarity index 66% rename from src/main/java/org/asteriskjava/manager/response/ManagerResponse.java rename to asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ManagerActionResponse.java index cb8e5c53c..073f8897c 100644 --- a/src/main/java/org/asteriskjava/manager/response/ManagerResponse.java +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ManagerActionResponse.java @@ -1,50 +1,133 @@ /* - * 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.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; -import java.util.Date; +import java.time.Instant; 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$ - * @see org.asteriskjava.manager.action.ManagerAction + * @author Stefan Reuter + * @see ManagerAction + * @since 1.0.0 */ -public class ManagerResponse implements Serializable { +public class ManagerActionResponse 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; + } + + @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(); + } + + /*---------------*/ + /** * 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; @@ -52,7 +135,7 @@ public class ManagerResponse implements Serializable { private Map attributes; private String output; - public ManagerResponse() { + public ManagerActionResponse() { this.attributes = null; } @@ -108,35 +191,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 org.asteriskjava.manager.action.ManagerAction#setActionId(String) - */ - public String getActionId() { - return actionId; - } - /** * Returns the name of the Asterisk server from which this response has been * received.
@@ -183,16 +237,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. @@ -208,22 +252,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 @@ -264,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/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..c89d3835a --- /dev/null +++ b/asterisk-java-ami/src/main/java/org/asteriskjava/ami/action/response/ResponseType.java @@ -0,0 +1,31 @@ +/* + * 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, + //todo check is sill in use + Follows, +} 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..7586843c2 --- /dev/null +++ b/asterisk-java-ami/src/test/java/org/asteriskjava/ami/action/ChallengeActionItTest.java @@ -0,0 +1,141 @@ +/* + * 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; +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.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 +class ChallengeActionItTest { + @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 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(); + AtomicReference response = new AtomicReference<>(); + + 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<>(response, responseClass, instant)) + .addLast(new IdleStateHandler(0, 0, 2, SECONDS)); + } + }); + Channel channel = bootstrap.connect(asterisk.getHost(), asterisk.getFirstMappedPort()).sync().channel(); + channel.writeAndFlush(asteriskEncoder.encode(action)); + + await().atMost(ofSeconds(5)).untilAtomic(response, instanceOf(responseClass)); + + return response.get(); + } + + 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); + + 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/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/asterisk-java-core/build.gradle b/asterisk-java-core/build.gradle index b2b4104ed..2550e9805 100644 --- a/asterisk-java-core/build.gradle +++ b/asterisk-java-core/build.gradle @@ -15,9 +15,13 @@ 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' 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/AsteriskDecoder.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskDecoder.java new file mode 100644 index 000000000..1b0c31675 --- /dev/null +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskDecoder.java @@ -0,0 +1,219 @@ +/* + * 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.tuple.Pair; +import org.asteriskjava.core.databind.TypeConversionRegister.Converter; +import org.slf4j.Logger; + +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.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; +import static org.asteriskjava.core.databind.utils.ReflectionUtils.getSetters; +import static org.slf4j.LoggerFactory.getLogger; + +/** + * @author Piotr Olaszewski + * @since 4.0.0 + */ +public class AsteriskDecoder { + private static final Logger logger = getLogger(AsteriskDecoder.class); + + private boolean caseSensitive = true; + + public AsteriskDecoder() { + } + + 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(Collectors.toMap(e -> { + String name = getName(e.getValue(), e.getKey()); + return caseSensitive ? name : name.toLowerCase(ENGLISH); + }, Entry::getValue)); + + T result = instantiateResultClass(target); + for (Entry entry : source.entrySet()) { + handleEntry(entry, setters, result, caseSensitive); + } + return result; + } + + private static T instantiateResultClass(Class target) { + try { + return target.getConstructor().newInstance(); + } catch (Exception e) { + throw new RuntimeException("Cannot instantiate class %s".formatted(target), e); + } + } + + private static void handleEntry(Entry entry, Map setters, T result, boolean caseSensitive) { + Object value = entry.getValue(); + + 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. " + + "Please report at https://github.com/asterisk-java/asterisk-java/issues.", + entry.getKey(), value, result.getClass().getName()); + return; + } + + Object targetValue = getValue(value, method); + invokeOn(result).method(method).withParameter(targetValue); + } + + private static Object getValue(Object value, Method method) { + Class targetDataType = method.getParameterTypes()[0]; + if (targetDataType.isEnum()) { + return parseEnum(method, value); + } else if (targetDataType.isAssignableFrom(List.class)) { + return parseList(method, value); + } else if (targetDataType.isAssignableFrom(Map.class)) { + return parseMap(method, value); + } else { + return parseOtherType(method, value); + } + } + + 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(value))) + .findFirst() + .orElse(null); + } + + private static List parseList(Method method, Object value) { + ParameterizedType genericParameter = (ParameterizedType) method.getGenericParameterTypes()[0]; + Class listElementType = (Class) genericParameter.getActualTypeArguments()[0]; + + Map, Converter> conversions = TYPE_CONVERTERS.get(listElementType); + + return ((List) value) + .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 value) { + ParameterizedType genericParameter = (ParameterizedType) method.getGenericParameterTypes()[0]; + Class mapKeyType = (Class) genericParameter.getActualTypeArguments()[0]; + Class mapValueType = (Class) genericParameter.getActualTypeArguments()[1]; + + Map, Converter> keyConversions = TYPE_CONVERTERS.get(mapKeyType); + Map, Converter> valueConversions = TYPE_CONVERTERS.get(mapValueType); + + if (value instanceof List values) { + Map map = new LinkedHashMap<>(); + for (Object item : values) { + Pair converted = convertMapItem(item, keyConversions, valueConversions); + map.put(converted.getKey(), converted.getValue()); + } + return map; + } else { + Pair converted = convertMapItem(value, keyConversions, valueConversions); + return Map.of(converted.getKey(), converted.getValue()); + } + } + + private static Object parseOtherType(Method method, Object value) { + Class sourceType = value.getClass(); + Class targetType = method.getParameterTypes()[0]; + + Map, Converter> conversions = TYPE_CONVERTERS.get(targetType); + @SuppressWarnings("rawtypes") + Converter converter = conversions.get(sourceType); + //noinspection unchecked + return converter.apply(value); + } + + private static Pair convertMapItem( + Object object, + Map, Converter> keyConversions, + Map, Converter> valueConversions + ) { + String[] split = String.valueOf(object).split("="); + Pair deserialize = Pair.of(split[0], split[1]); + + @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); + } + + 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 new file mode 100644 index 000000000..7a6d2de70 --- /dev/null +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskEncoder.java @@ -0,0 +1,152 @@ +/* + * 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.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; + +/** + * @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); + } + } +} 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 c899c6ec4..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskGenerator.java +++ /dev/null @@ -1,48 +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() { - 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 386343571..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/AsteriskObjectMapper.java +++ /dev/null @@ -1,93 +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.writer.AsteriskObjectMethodWriter; -import org.asteriskjava.core.databind.writer.AsteriskObjectWriter; - -import java.util.Comparator; -import java.util.List; - -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 writeValue(Object value) { - Class clazz = value.getClass(); - - AsteriskObjectWriter asteriskObjectWriter = new AsteriskObjectWriter(clazz, fieldNamesComparator); - - return writeValue(value, asteriskObjectWriter); - } - - 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 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/serializer/WritableFileName.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/CodersConsts.java similarity index 71% rename from asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/WritableFileName.java rename to asterisk-java-core/src/main/java/org/asteriskjava/core/databind/CodersConsts.java index e97aa3399..332da30b3 100644 --- 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/CodersConsts.java @@ -13,15 +13,14 @@ * 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; +package org.asteriskjava.core.databind; /** - * 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 { +class CodersConsts { + 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/TypeConversionRegister.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/TypeConversionRegister.java new file mode 100644 index 000000000..4404e4935 --- /dev/null +++ b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/TypeConversionRegister.java @@ -0,0 +1,84 @@ +/* + * 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 { + 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() { + } + + public static TypeConverter convertFrom(Class sourceType) { + return new TypeConverter<>(sourceType); + } + + 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/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/custom/ComaJoiningSerializer.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/custom/ComaJoiningSerializer.java deleted file mode 100644 index 5871206e9..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/utils/AnnotationUtils.java similarity index 57% rename from asterisk-java-core/src/main/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializer.java rename to asterisk-java-core/src/main/java/org/asteriskjava/core/databind/utils/AnnotationUtils.java index 46d4b6b41..d0cfebc24 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/utils/AnnotationUtils.java @@ -13,20 +13,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.asteriskjava.core.databind.serializer.std; +package org.asteriskjava.core.databind.utils; -import org.asteriskjava.core.databind.AsteriskGenerator; -import org.asteriskjava.core.databind.serializer.AsteriskSerializer; +import org.asteriskjava.core.databind.annotation.AsteriskName; + +import java.lang.reflect.Method; /** - * Base serializer which calls only the toString method on the passed value. + * Convenient class for handling annotations. * * @author Piotr Olaszewski * @since 4.0.0 */ -public class ToStringSerializer implements AsteriskSerializer { - @Override - public void serialize(String fieldName, Object value, AsteriskGenerator asteriskGenerator) { - asteriskGenerator.writeFieldValue(value.toString()); +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 19fe0ce80..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,20 +16,23 @@ 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.*; /** - * 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. *

@@ -37,34 +40,32 @@ public final class 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) { + 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") + method.getReturnType() == Void.TYPE || + !isPublic(method.getModifiers()) || + isNative(method.getModifiers()) || + isAbstract(method.getModifiers()) || + isStatic(method.getModifiers()) || + 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,13 +79,40 @@ public static Map getGetters(Class clazz, Comparator } /** - * Returns a Map of getter methods of the given class. + * 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 getters for - * @return a Map of attributes and their accessor methods (getters) - * @see #getGetters(Class, Comparator) + * @param clazz the class to return the setters for + * @return a Map of attributes and their accessor methods (setters) */ - public static Map getGetters(Class clazz) { - return getGetters(clazz, null); + 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()); + + 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 eb33c1dd7..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectMethodWriter.java +++ /dev/null @@ -1,66 +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.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * Writer class to write field names and serialized values using the {@link AsteriskGenerator}. - * - * @author Piotr Olaszewski - * @since 4.0.0 - */ -public class AsteriskObjectMethodWriter { - private final Method method; - private final String name; - private final AsteriskSerializer asteriskSerializer; - private final AsteriskObjectMethodWriterContext asteriskObjectMethodWriterContext; - - public AsteriskObjectMethodWriter( - Method method, - String name, - AsteriskSerializer asteriskSerializer, - AsteriskObjectMethodWriterContext asteriskObjectMethodWriterContext - ) { - this.method = method; - this.name = name; - this.asteriskSerializer = asteriskSerializer; - this.asteriskObjectMethodWriterContext = asteriskObjectMethodWriterContext; - } - - public void writeName(AsteriskGenerator asteriskGenerator) { - if (!asteriskObjectMethodWriterContext.serializerWriteFieldName()) { - asteriskGenerator.writeFieldName(name); - } - } - - public void writeValue(Object obj, AsteriskGenerator asteriskGenerator) { - Object currentValue = getCurrentValue(obj); - 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/AsteriskObjectWriter.java b/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectWriter.java deleted file mode 100644 index 91d6ad710..000000000 --- a/asterisk-java-core/src/main/java/org/asteriskjava/core/databind/writer/AsteriskObjectWriter.java +++ /dev/null @@ -1,84 +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.annotation.AsteriskName; -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.ReflectionUtils.getGetters; - -/** - * @author Piotr Olaszewski - * @since 4.0.0 - */ -public class AsteriskObjectWriter { - private final Class clazz; - private final Comparator fieldNamesComparator; - - public AsteriskObjectWriter(Class clazz, Comparator fieldNamesComparator) { - this.clazz = clazz; - this.fieldNamesComparator = fieldNamesComparator; - } - - public List getAsteriskObjectMethodWriters() { - 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 static String getName(Method method, String name) { - AsteriskName asteriskName = method.getAnnotation(AsteriskName.class); - return asteriskName == null ? name : asteriskName.value(); - } - - 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/AsteriskDecoderTest.java b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskDecoderTest.java new file mode 100644 index 000000000..5a21a2124 --- /dev/null +++ b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskDecoderTest.java @@ -0,0 +1,419 @@ +/* + * 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.AsteriskName; +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.LF; +import static org.asteriskjava.core.databind.AsteriskDecoderTest.BaseBean.ResponseType.Goodbye; + +class AsteriskDecoderTest { + private final AsteriskDecoder asteriskDecoder = new AsteriskDecoder(); + + @Test + void shouldDecodeForSimpleBeanWhichExtendsFormBaseBean() { + //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 + 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 shouldDecodeListValues() { + //given + AsteriskDecoder asteriskDecoder = new AsteriskDecoder(); + + Map content = Map.of( + "Number", List.of("1", "2", "3") + ); + + //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 shouldDecodeMap() { + //given + AsteriskDecoder asteriskDecoder = new AsteriskDecoder(); + + Map content = Map.of("Header", "1=name1"); + + //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 shouldDecodeMapWhenIsListOfEntries() { + //given + AsteriskDecoder asteriskDecoder = new AsteriskDecoder(); + + Map content = Map.of( + "Header", List.of("1=name1", "2=name2", "3=name3") + ); + + //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); + } + + @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, + 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; + } + + BaseBean base = (BaseBean) 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 SimpleBean extends BaseBean { + 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; + } + + SimpleBean someClass = (SimpleBean) 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 ListBean { + 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; + } + + ListBean someClass = (ListBean) 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 MapBean { + private Map headers; + + public Map getHeaders() { + return headers; + } + + @AsteriskName("Header") + 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; + } + + MapBean someClass = (MapBean) 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/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/AsteriskObjectMapperTest.java b/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskObjectMapperTest.java deleted file mode 100644 index de7a0f54a..000000000 --- a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/AsteriskObjectMapperTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.asteriskjava.core.databind; - -import org.asteriskjava.core.databind.annotation.AsteriskName; -import org.asteriskjava.core.databind.annotation.AsteriskSerialize; -import org.asteriskjava.core.databind.serializer.custom.ComaJoiningSerializer; -import org.junit.jupiter.api.Test; - -import java.util.List; - -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.SimpleBean.AuthType.MD5; - -class AsteriskObjectMapperTest { - private final AsteriskObjectMapper asteriskObjectMapper = builder() - .crlfNewlineDelimiter() - .build(); - - @Test - void shouldGenerateSimpleBean() { - //given - SimpleBean bean = new SimpleBean(); - bean.setActionId("id-1"); - bean.setAuthType(MD5); - bean.setCodecs(List.of("codec1", "codec2")); - - //when - String string = asteriskObjectMapper.writeValue(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(); - 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; - } - } -} 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 02c69f9d6..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 0378e957f..000000000 --- a/asterisk-java-core/src/test/java/org/asteriskjava/core/databind/serializer/std/ToStringSerializerTest.java +++ /dev/null @@ -1,52 +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") - ); - } -} 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..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; @@ -138,7 +137,7 @@ public String is() { @Override public String toString() { return new StringJoiner(", ", InvalidClass.class.getSimpleName() + "[", "]") - .toString(); + .toString(); } } @@ -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/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/fastagi/internal/AsyncAgiWriter.java b/src/main/java/org/asteriskjava/fastagi/internal/AsyncAgiWriter.java index bfe44849e..68dcfd894 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.ManagerActionResponse; 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; @@ -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 ff1015708..195d9a094 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.ManagerActionResponse; 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.*; @@ -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 e37a44f61..1e754594a 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.ManagerActionResponse; 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; /** @@ -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 7062e5ad7..830e333ad 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -17,6 +17,8 @@ package org.asteriskjava.live.internal; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.action.ManagerAction; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.config.ConfigFile; import org.asteriskjava.live.*; import org.asteriskjava.lock.Lockable; @@ -431,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(); @@ -467,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 { @@ -530,7 +532,7 @@ public int[] getVersion(String file) throws ManagerCommunicationException { } public String getGlobalVariable(String variable) throws ManagerCommunicationException { - ManagerResponse response; + ManagerActionResponse response; String value; initializeIfNeeded(); @@ -546,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)); @@ -557,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(); @@ -622,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)); @@ -655,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) { @@ -665,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(); @@ -753,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) { @@ -761,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/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/live/internal/MeetMeManager.java b/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java index 42f2230cc..983598adb 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.ManagerActionResponse; 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; @@ -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 e7c10501e..244d176ba 100644 --- a/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java +++ b/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java @@ -17,11 +17,11 @@ package org.asteriskjava.manager; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.action.ManagerAction; +import org.asteriskjava.ami.action.response.ManagerActionResponse; 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; import java.io.IOException; import java.net.InetAddress; @@ -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/ExpectedResponse.java b/src/main/java/org/asteriskjava/manager/ExpectedResponse.java deleted file mode 100644 index da5c836c6..000000000 --- a/src/main/java/org/asteriskjava/manager/ExpectedResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.asteriskjava.manager; - -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 org.asteriskjava.manager.action.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 1fdbc8e42..e321f92ad 100644 --- a/src/main/java/org/asteriskjava/manager/ManagerConnection.java +++ b/src/main/java/org/asteriskjava/manager/ManagerConnection.java @@ -17,10 +17,11 @@ 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.ManagerActionResponse; import org.asteriskjava.manager.action.EventGeneratingAction; -import org.asteriskjava.manager.action.ManagerAction; import org.asteriskjava.manager.event.ManagerEvent; -import org.asteriskjava.manager.response.ManagerResponse; import java.io.IOException; import java.net.InetAddress; @@ -31,8 +32,8 @@ * API. *

* The ManagerConnection repesents a connection to an Asterisk server and is - * capable of sending {@link org.asteriskjava.manager.action.ManagerAction}s and - * receiving {@link org.asteriskjava.manager.response.ManagerResponse}s and + * capable of sending {@link ManagerAction}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). @@ -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; @@ -294,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 @@ -313,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 @@ -338,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 @@ -375,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/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/PingThread.java b/src/main/java/org/asteriskjava/manager/PingThread.java index 862f882be..b26dd4cf7 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.ManagerActionResponse; 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; @@ -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 a271d733f..20b9a53ee 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.ManagerActionResponse; 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 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 0e315621c..da8ad498a 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.manager.response.ManagerResponse; +import org.asteriskjava.ami.action.ManagerAction; +import org.asteriskjava.ami.action.response.ManagerActionResponse; /** - * Callback interface to send {@link org.asteriskjava.manager.action.ManagerAction}s + * Callback interface to send {@link ManagerAction}s * asynchronously. * * @author srt @@ -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 528e7d643..437c049ed 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.ManagerActionResponse; import org.asteriskjava.manager.response.ManagerError; -import org.asteriskjava.manager.response.ManagerResponse; /** * Callback interface to send @@ -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/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 deleted file mode 100644 index 9b0f0a993..000000000 --- a/src/main/java/org/asteriskjava/manager/action/ChallengeAction.java +++ /dev/null @@ -1,76 +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.manager.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/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..9e90ef49f 100644 --- a/src/main/java/org/asteriskjava/manager/action/CommandAction.java +++ b/src/main/java/org/asteriskjava/manager/action/CommandAction.java @@ -16,7 +16,8 @@ */ package org.asteriskjava.manager.action; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.AbstractManagerAction; +import org.asteriskjava.ami.action.annotation.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..b16db8980 100644 --- a/src/main/java/org/asteriskjava/manager/action/CoreSettingsAction.java +++ b/src/main/java/org/asteriskjava/manager/action/CoreSettingsAction.java @@ -16,7 +16,8 @@ */ package org.asteriskjava.manager.action; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.AbstractManagerAction; +import org.asteriskjava.ami.action.annotation.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..fc90e99dc 100644 --- a/src/main/java/org/asteriskjava/manager/action/CoreStatusAction.java +++ b/src/main/java/org/asteriskjava/manager/action/CoreStatusAction.java @@ -16,7 +16,8 @@ */ package org.asteriskjava.manager.action; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.AbstractManagerAction; +import org.asteriskjava.ami.action.annotation.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..ae74418e1 100644 --- a/src/main/java/org/asteriskjava/manager/action/ExecAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ExecAction.java @@ -16,7 +16,8 @@ */ package org.asteriskjava.manager.action; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.AbstractManagerAction; +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 b3062022a..2524303c4 100644 --- a/src/main/java/org/asteriskjava/manager/action/ExtensionStateAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ExtensionStateAction.java @@ -16,7 +16,8 @@ */ package org.asteriskjava.manager.action; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.AbstractManagerAction; +import org.asteriskjava.ami.action.annotation.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..36f18b6e8 100644 --- a/src/main/java/org/asteriskjava/manager/action/GetConfigAction.java +++ b/src/main/java/org/asteriskjava/manager/action/GetConfigAction.java @@ -16,7 +16,8 @@ */ package org.asteriskjava.manager.action; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.AbstractManagerAction; +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 6d0f14727..aa61c705d 100644 --- a/src/main/java/org/asteriskjava/manager/action/GetVarAction.java +++ b/src/main/java/org/asteriskjava/manager/action/GetVarAction.java @@ -16,7 +16,9 @@ */ package org.asteriskjava.manager.action; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.AbstractManagerAction; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.manager.response.GetVarResponse; /** @@ -31,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 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/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..ab9e8676d 100644 --- a/src/main/java/org/asteriskjava/manager/action/ListCommandsAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ListCommandsAction.java @@ -16,13 +16,16 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; +import org.asteriskjava.ami.action.response.ManagerActionResponse; + /** * The ListCommandsAction returns possible commands in the Manager interface. *

* Use the getAttributes method on the ManagerResponse for a map of commands and explanations. * * @author martins - * @see org.asteriskjava.manager.response.ManagerResponse#getAttributes() + * @see ManagerActionResponse#getAttributes() * @since 0.3 */ public class ListCommandsAction extends AbstractManagerAction { 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..655ff6624 100644 --- a/src/main/java/org/asteriskjava/manager/action/LoginAction.java +++ b/src/main/java/org/asteriskjava/manager/action/LoginAction.java @@ -16,6 +16,9 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.ami.action.AbstractManagerAction; +import org.asteriskjava.ami.action.ChallengeAction; + /** * The LoginAction authenticates the connection.

* A successful login is the precondition for sending any other action except @@ -26,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/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..28c5a6dba 100644 --- a/src/main/java/org/asteriskjava/manager/action/MailboxCountAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MailboxCountAction.java @@ -5,7 +5,8 @@ */ package org.asteriskjava.manager.action; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.AbstractManagerAction; +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 a9091058d..39a674b47 100644 --- a/src/main/java/org/asteriskjava/manager/action/MailboxStatusAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MailboxStatusAction.java @@ -16,7 +16,8 @@ */ package org.asteriskjava.manager.action; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.AbstractManagerAction; +import org.asteriskjava.ami.action.annotation.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..e92a41a94 100644 --- a/src/main/java/org/asteriskjava/manager/action/MixMonitorAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MixMonitorAction.java @@ -16,7 +16,8 @@ */ package org.asteriskjava.manager.action; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.AbstractManagerAction; +import org.asteriskjava.ami.action.annotation.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..4f4890822 100644 --- a/src/main/java/org/asteriskjava/manager/action/ModuleCheckAction.java +++ b/src/main/java/org/asteriskjava/manager/action/ModuleCheckAction.java @@ -16,7 +16,8 @@ */ package org.asteriskjava.manager.action; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.AbstractManagerAction; +import org.asteriskjava.ami.action.annotation.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..97fecb8dd 100644 --- a/src/main/java/org/asteriskjava/manager/action/PingAction.java +++ b/src/main/java/org/asteriskjava/manager/action/PingAction.java @@ -16,7 +16,8 @@ */ package org.asteriskjava.manager.action; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.AbstractManagerAction; +import org.asteriskjava.ami.action.annotation.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..2b463c272 100644 --- a/src/main/java/org/asteriskjava/manager/action/SipShowPeerAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SipShowPeerAction.java @@ -16,13 +16,15 @@ */ package org.asteriskjava.manager.action; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.AbstractManagerAction; +import org.asteriskjava.ami.action.annotation.ExpectedResponse; +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 org.asteriskjava.manager.response.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/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..b0a9ffdb5 100644 --- a/src/main/java/org/asteriskjava/manager/action/SkypeBuddyAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SkypeBuddyAction.java @@ -16,7 +16,8 @@ */ package org.asteriskjava.manager.action; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.AbstractManagerAction; +import org.asteriskjava.ami.action.annotation.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..0516c56df 100644 --- a/src/main/java/org/asteriskjava/manager/action/SkypeLicenseStatusAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SkypeLicenseStatusAction.java @@ -16,7 +16,8 @@ */ package org.asteriskjava.manager.action; -import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.ami.action.AbstractManagerAction; +import org.asteriskjava.ami.action.annotation.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..2917eaa59 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java @@ -17,8 +17,10 @@ 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.AsteriskEncoder; 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; @@ -47,6 +49,11 @@ class ActionBuilderImpl implements ActionBuilder { private AsteriskVersion targetVersion; private final Set membersToIgnore = new HashSet<>(); + private final AsteriskEncoder asteriskEncoder = AsteriskEncoder.builder() + .crlfNewlineDelimiter() + .fieldNamesComparator(new ActionFieldsComparator()) + .build(); + /** * Creates a new ActionBuilder for Asterisk 1.0. */ @@ -73,20 +80,21 @@ 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")) { + action.setActionId(actionId); + return asteriskEncoder.encode(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 +130,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 +267,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 +278,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 +292,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 +338,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/AsyncEventPump.java b/src/main/java/org/asteriskjava/manager/internal/AsyncEventPump.java index d17b6ae4c..c1a843750 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.ManagerActionResponse; 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; @@ -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 95f36efe0..95ac2b417 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.ManagerActionResponse; import org.asteriskjava.manager.event.ManagerEvent; -import org.asteriskjava.manager.response.ManagerResponse; /** * The Dispatcher defines the interface used for communication between @@ -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 7cfbb8a7c..c6c72f2aa 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -16,6 +16,12 @@ 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.ChallengeManagerActionResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import org.asteriskjava.lock.Lockable; import org.asteriskjava.lock.LockableList; import org.asteriskjava.lock.LockableMap; @@ -23,7 +29,9 @@ import org.asteriskjava.manager.*; import org.asteriskjava.manager.action.*; import org.asteriskjava.manager.event.*; -import org.asteriskjava.manager.response.*; +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; @@ -442,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). * @@ -465,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(); @@ -492,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) { @@ -500,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: " @@ -597,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?"); @@ -616,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 @@ -711,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); } @@ -721,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); @@ -790,7 +799,7 @@ else if (state != CONNECTED) { } } - Class responseClass = getExpectedResponseClass(action.getClass()); + Class responseClass = getExpectedResponseClass(action.getClass()); if (responseClass != null) { reader.expectResponseClass(internalActionId, responseClass); } @@ -810,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; @@ -988,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; @@ -1389,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: " @@ -1466,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 @@ -1532,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 2b3e46c19..9510bcb3f 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.ManagerActionResponse; import org.asteriskjava.manager.event.ManagerEvent; -import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.util.SocketConnectionFacade; import java.io.IOException; @@ -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 efbc00535..c9d06e832 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.ManagerActionResponse; 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; @@ -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()); + response.setDateReceived(DateUtil.getDate().toInstant()); } return response; 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/internal/ResponseBuilder.java b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilder.java index b3c940409..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.manager.response.ManagerResponse; +import org.asteriskjava.ami.action.response.ManagerActionResponse; import java.util.Map; @@ -26,7 +26,7 @@ * * @author srt * @version $Id$ - * @see org.asteriskjava.manager.response.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 577843f08..eb183fb86 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java @@ -15,9 +15,11 @@ */ package org.asteriskjava.manager.internal; +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; import org.asteriskjava.manager.response.ManagerError; -import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.manager.util.EventAttributesHelper; import org.slf4j.Logger; @@ -30,28 +32,37 @@ * * @author srt * @version $Id$ - * @see org.asteriskjava.manager.response.ManagerResponse + * @see ManagerActionResponse */ 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) { - final ManagerResponse response; + public ManagerActionResponse buildResponse(Class responseClass, Map attributes) { + responseClass = responseClass == null ? ManagerActionResponse.class : responseClass; + if (responseClass.getPackageName().contains("org.asteriskjava.ami.action.response")) { + ManagerActionResponse response = asteriskDecoder.decode(attributes, responseClass); + response.setAttributes(new HashMap<>(attributes)); + return 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(); @@ -90,7 +101,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/main/java/org/asteriskjava/manager/internal/ResponseEventsImpl.java b/src/main/java/org/asteriskjava/manager/internal/ResponseEventsImpl.java index 7507f7598..0698893b1 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.ManagerActionResponse; 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; @@ -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/ChallengeResponse.java b/src/main/java/org/asteriskjava/manager/response/ChallengeResponse.java deleted file mode 100644 index 662668784..000000000 --- a/src/main/java/org/asteriskjava/manager/response/ChallengeResponse.java +++ /dev/null @@ -1,46 +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; - -/** - * 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/main/java/org/asteriskjava/manager/response/CommandResponse.java b/src/main/java/org/asteriskjava/manager/response/CommandResponse.java index f1e640dde..1bdd8ac87 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.ManagerActionResponse; + import java.util.List; /** @@ -29,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 e7e233922..45107dc37 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.ManagerActionResponse; + /** * Corresponds to a CoreSettingsAction and contains the current settings summary of the * Asterisk server. @@ -25,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 cc2f8237a..2c9f3e65c 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.ManagerActionResponse; import org.asteriskjava.util.DateUtil; import java.util.Date; @@ -30,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 e9afcb964..168ca239f 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.ManagerActionResponse; + /** * Response to an {@link org.asteriskjava.manager.action.ExtensionStateAction}. * @@ -23,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 da4ec4a02..7268f3e12 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.ManagerActionResponse; + import java.util.Locale; import java.util.Map; import java.util.Map.Entry; @@ -34,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 8758a6da7..2ae370f36 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.ManagerActionResponse; + /** * Corresponds to a GetVarAction and contains the value of the requested variable. * @@ -24,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 66bdae04e..497cc6224 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.ManagerActionResponse; + /** * A MailboxCountResponse is sent in response to a MailboxCountAction and contains the number of old * and new messages in a mailbox. @@ -24,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 c0e245d0d..aeffd5224 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.ManagerActionResponse; + /** * A MailboxStatusResponse is sent in response to a MailboxStatusAction and indicates if a set * of mailboxes contains waiting messages. @@ -24,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 2b208f72b..85052ef64 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.ManagerActionResponse; + /** * Represents an "Response: Error" response received from the asterisk server. * The cause for the error is given in the message attribute. @@ -23,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 ab8d3997f..ffc747b1c 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.ManagerActionResponse; + /** * A MixMonitorResponse is sent in response to a MixMonitorAction and provides * the ID of the MixMonitor that was started on the referenced channel. @@ -24,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 f131a5865..a73519ad2 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.ManagerActionResponse; + /** * Corresponds to a ModuleCheckAction and contains the version of the module. * @@ -24,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 aee7a35b0..c6550545d 100644 --- a/src/main/java/org/asteriskjava/manager/response/PingResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/PingResponse.java @@ -16,13 +16,15 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerActionResponse; + /** * Corresponds to a PingAction and contains an additional (yet useless) ping property. * * @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 1ea7987b7..b8babdf7f 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.ManagerActionResponse; + import java.util.Map; /** @@ -25,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 87f40ff72..21cbe2e97 100644 --- a/src/main/java/org/asteriskjava/manager/response/SkypeBuddyResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/SkypeBuddyResponse.java @@ -16,13 +16,15 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerActionResponse; + /** * Corresponds to a SkypeBuddyAction and contains the details of a Skype buddy. * * @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 7bdaaab88..493162c57 100644 --- a/src/main/java/org/asteriskjava/manager/response/SkypeLicenseStatusResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/SkypeLicenseStatusResponse.java @@ -16,13 +16,15 @@ */ package org.asteriskjava.manager.response; +import org.asteriskjava.ami.action.response.ManagerActionResponse; + /** * Corresponds to a SkypeLicenseStatusAction and contains the number of licensed Skype calls. * * @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 e78a4a628..afc58e4a7 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.ManagerActionResponse; 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; @@ -29,6 +29,7 @@ import java.util.Map; import java.util.Set; +import static java.util.Arrays.stream; import static org.slf4j.LoggerFactory.getLogger; /** @@ -81,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) { @@ -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/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/asterisk/wrap/response/CommandResponse.java b/src/main/java/org/asteriskjava/pbx/asterisk/wrap/response/CommandResponse.java index 135e76138..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.manager.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 68479b634..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,8 +1,10 @@ package org.asteriskjava.pbx.asterisk.wrap.response; +import org.asteriskjava.ami.action.response.ManagerActionResponse; + public class ManagerError extends CommandResponse { - public ManagerError(org.asteriskjava.manager.response.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 bd5715997..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,11 +23,11 @@ public class ManagerResponse { final private String _uniqueId; final private Map _attributes; - public ManagerResponse(org.asteriskjava.manager.response.ManagerResponse response) { - this._dateReceived = response.getDateReceived(); + public ManagerResponse(ManagerActionResponse response) { + 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(); 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..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.manager.response.ManagerResponse response) { + public static ManagerResponse build(ManagerActionResponse response) { ManagerResponse result; if (response instanceof org.asteriskjava.manager.response.CommandResponse) { result = new CommandResponse(response); @@ -149,8 +150,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..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.*; @@ -282,9 +283,9 @@ 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 + ManagerActionResponse response = CoherentManagerConnection.managerConnection .sendAction(ajAction, timeout); ManagerResponse convertedResponse = null; 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/ManagerConnectionImplTest.java b/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java index 2565925a9..8f4306c95 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerConnectionImplTest.java @@ -17,6 +17,8 @@ package org.asteriskjava.manager.internal; import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.ami.action.response.ManagerActionResponse; +import org.asteriskjava.ami.action.response.ResponseType; import org.asteriskjava.manager.AuthenticationFailedException; import org.asteriskjava.manager.ManagerConnectionState; import org.asteriskjava.manager.ManagerEventListener; @@ -29,7 +31,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; @@ -321,7 +322,7 @@ void testSendActionWhenNotConnected() throws Exception { @Test void testSendAction() throws Exception { StatusAction statusAction; - ManagerResponse response; + ManagerActionResponse response; statusAction = new StatusAction(); statusAction.setActionId("123"); @@ -333,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"); } @@ -363,12 +364,12 @@ 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("Success"); + response.setResponse(ResponseType.Success); // expected result is ignoring the response and logging mc.dispatchResponse(response, null); @@ -376,11 +377,11 @@ void testDispatchResponseUnexpectedResponse() { @Test void testDispatchResponseMissingInternalActionId() { - ManagerResponse response; + ManagerActionResponse response; - response = new ManagerResponse(); + response = new ManagerActionResponse(); response.setActionId("abc"); - response.setResponse("Success"); + response.setResponse(ResponseType.Success); // expected result is ignoring the response and logging mc.dispatchResponse(response, null); @@ -388,11 +389,11 @@ void testDispatchResponseMissingInternalActionId() { @Test void testDispatchResponseNullActionId() { - ManagerResponse response; + ManagerActionResponse response; - response = new ManagerResponse(); + response = new ManagerActionResponse(); 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/ManagerReaderImplTest.java b/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java index eabb78d67..bc0e1b9fa 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java @@ -16,9 +16,10 @@ */ package org.asteriskjava.manager.internal; +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; -import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.util.DateUtil; import org.asteriskjava.util.SocketConnectionFacade; import org.junit.jupiter.api.AfterEach; @@ -207,14 +208,14 @@ 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(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"); 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 @@ -270,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 e4bc3332b..7bbdee101 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.ManagerActionResponse; import org.asteriskjava.manager.event.ManagerEvent; -import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.util.SocketConnectionFacade; import java.io.IOException; @@ -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 6dedf480c..b6efdfc56 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerWriterMock.java @@ -17,14 +17,16 @@ package org.asteriskjava.manager.internal; import org.asteriskjava.AsteriskVersion; -import org.asteriskjava.manager.action.ChallengeAction; +import org.asteriskjava.ami.action.AuthType; +import org.asteriskjava.ami.action.ChallengeAction; +import org.asteriskjava.ami.action.ManagerAction; +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; -import org.asteriskjava.manager.action.ManagerAction; 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; @@ -96,21 +98,21 @@ 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 + "'"); } 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) { @@ -130,17 +132,17 @@ 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.setResponse("Success"); + loginResponse = new ManagerActionResponse(); + 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)); @@ -150,28 +152,28 @@ 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("Success"); + response.setResponse(ResponseType.Success); dispatchLater(response); } } else { otherActionsSent++; if (sendResponse) { - ManagerResponse response; + ManagerActionResponse response; - response = new ManagerResponse(); + response = new ManagerActionResponse(); response.setActionId(ManagerUtil.addInternalActionId(action.getActionId(), internalActionId)); - response.setResponse("Success"); + response.setResponse(ResponseType.Success); dispatchLater(response); } } } - 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 65cd4d8d1..8bbf69e73 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/ResponseBuilderImplTest.java @@ -16,7 +16,12 @@ */ package org.asteriskjava.manager.internal; -import org.asteriskjava.manager.response.*; +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; +import org.asteriskjava.manager.response.MailboxStatusResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -37,65 +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"); - assertEquals("Success", response.getResponse(), "Response not set correctly"); + 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("Success", response.getResponse(), "Response not set correctly"); + 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); - assertEquals(ManagerError.class, response.getClass(), "Response of wrong type"); + 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"); @@ -112,7 +116,7 @@ void testBuildMailboxStatusResponse() { @Test void testBuildMailboxStatusResponseWithNoWaiting() { - ManagerResponse response; + ManagerActionResponse response; attributes.put("response", "Success"); attributes.put("message", "Mailbox Status"); @@ -129,7 +133,7 @@ void testBuildMailboxStatusResponseWithNoWaiting() { @Test void testBuildMailboxCountResponse() { - ManagerResponse response; + ManagerActionResponse response; attributes.put("response", "Success"); attributes.put("message", "Mailbox Message Count"); @@ -148,7 +152,7 @@ void testBuildMailboxCountResponse() { @Test void testBuildExtensionStateResponse() { - ManagerResponse response; + ManagerActionResponse response; attributes.put("response", "Success"); attributes.put("message", "Extension Status");