Smack/smack-extensions/src/main/java/org/jivesoftware/smackx/softwareinfo/form/SoftwareInfoForm.java

274 lines
9.4 KiB
Java

/**
*
* Copyright 2020 Aditya Borikar, 2021 Florian Schmaus
*
* 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.jivesoftware.smackx.softwareinfo.form;
import java.util.List;
import org.jivesoftware.smack.util.EqualsUtil;
import org.jivesoftware.smack.util.HashCode;
import org.jivesoftware.smackx.formtypes.FormFieldRegistry;
import org.jivesoftware.smackx.mediaelement.element.MediaElement;
import org.jivesoftware.smackx.xdata.FormField;
import org.jivesoftware.smackx.xdata.FormFieldChildElement;
import org.jivesoftware.smackx.xdata.TextSingleFormField;
import org.jivesoftware.smackx.xdata.form.FilledForm;
import org.jivesoftware.smackx.xdata.form.Form;
import org.jivesoftware.smackx.xdata.packet.DataForm;
/**
* {@link Form} that contains the software information.
* <br>
* Instance of {@link SoftwareInfoForm} can be created using {@link Builder#build()} method.
* <br>
* To obtain an instance of {@link Builder}, use {@link SoftwareInfoForm#getBuilder()} method.
* <br>
* An example to illustrate is provided inside SoftwareInfoFormTest inside the test package.
*/
public final class SoftwareInfoForm extends FilledForm {
public static final String FORM_TYPE = "urn:xmpp:dataforms:softwareinfo";
public static final String OS = "os";
public static final String OS_VERSION = "os_version";
public static final String SOFTWARE = "software";
public static final String SOFTWARE_VERSION = "software_version";
public static final String ICON = "icon";
static {
FormFieldRegistry.register(FORM_TYPE, FormField.Type.text_single,
OS, OS_VERSION, SOFTWARE, SOFTWARE_VERSION);
}
private SoftwareInfoForm(DataForm dataForm) {
super(dataForm);
}
/**
* Returns name of the OS used by client.
* <br>
* @return os
*/
public String getOS() {
return readFirstValue(OS);
}
/**
* Returns version of the OS used by client.
* <br>
* @return os_version
*/
public String getOSVersion() {
return readFirstValue(OS_VERSION);
}
/**
* Returns name of the software used by client.
* <br>
* @return software
*/
public String getSoftwareName() {
return readFirstValue(SOFTWARE);
}
/**
* Returns version of the software used by client.
* <br>
* @return software_version
*/
public String getSoftwareVersion () {
return readFirstValue(SOFTWARE_VERSION);
}
/**
* Returns the software icon if used by client.
* <br>
* @return {@link MediaElement} MediaElement or null
*/
public MediaElement getIcon () {
FormField field = getField(ICON);
if (field == null) {
return null;
}
FormFieldChildElement media = field.getFormFieldChildElement(MediaElement.QNAME);
if (media == null) {
return null;
}
return (MediaElement) media;
}
@Override
public boolean equals(Object obj) {
return EqualsUtil.equals(this, obj, (equalsBuilder, otherObj) -> {
equalsBuilder.append(getDataForm().getType(), otherObj.getDataForm().getType())
.append(getDataForm().getTitle(), otherObj.getDataForm().getTitle())
.append(getDataForm().getReportedData(), otherObj.getDataForm().getReportedData())
.append(getDataForm().getItems(), otherObj.getDataForm().getItems())
.append(getDataForm().getFields(), otherObj.getDataForm().getFields())
.append(getDataForm().getExtensionElements(), otherObj.getDataForm().getExtensionElements());
});
}
@Override
public int hashCode() {
HashCode.Builder builder = HashCode.builder();
builder.append(getDataForm().getFields());
builder.append(getDataForm().getItems());
builder.append(getDataForm().getExtensionElements());
return builder.build();
}
/**
* Returns a new instance of {@link Builder}.
* <br>
* @return Builder
*/
public static Builder getBuilder() {
return new Builder();
}
/**
* Builder class for {@link SoftwareInfoForm}.
* <br>
* To obtain an instance of {@link Builder}, use {@link SoftwareInfoForm#getBuilder()} method.
* <br>
* Use appropriate setters to include information inside SoftwareInfoForms.
*/
public static final class Builder {
DataForm.Builder dataFormBuilder;
private Builder() {
dataFormBuilder = DataForm.builder(DataForm.Type.result);
TextSingleFormField formField = FormField.buildHiddenFormType(FORM_TYPE);
dataFormBuilder.addField(formField);
}
/**
* This will allow to include Icon using height, width and Uri's as a
* {@link FormField}.
* <br>
* @param height Height of the image
* @param width Width of the image
* @param uriList List of URIs
* @return Builder
*/
public Builder setIcon(int height, int width, List<MediaElement.Uri> uriList) {
MediaElement.Builder mediaBuilder = MediaElement.builder();
for (MediaElement.Uri uri : uriList) {
mediaBuilder.addUri(uri);
}
MediaElement mediaElement = mediaBuilder.setHeightAndWidth(height, width).build();
return setIcon(mediaElement);
}
/**
* This will allow to include {@link MediaElement} directly as a
* {@link FormField}.
* <br>
* @param mediaElement MediaElement to be included
* @return Builder
*/
public Builder setIcon(MediaElement mediaElement) {
FormField.Builder<?, ?> builder = FormField.builder(ICON);
builder.addFormFieldChildElement(mediaElement);
dataFormBuilder.addField(builder.build());
return this;
}
/**
* Include Operating System's name as a {@link FormField}.
* <br>
* @param os Name of the OS
* @return Builder
*/
public Builder setOS(String os) {
TextSingleFormField.Builder builder = FormField.builder(OS);
builder.setValue(os);
dataFormBuilder.addField(builder.build());
return this;
}
/**
* Include Operating System's version as a {@link FormField}.
* <br>
* @param os_version Version of OS
* @return Builder
*/
public Builder setOSVersion(String os_version) {
TextSingleFormField.Builder builder = FormField.builder(OS_VERSION);
builder.setValue(os_version);
dataFormBuilder.addField(builder.build());
return this;
}
/**
* Include Software name as a {@link FormField}.
* <br>
* @param software Name of the software
* @return Builder
*/
public Builder setSoftware(String software) {
TextSingleFormField.Builder builder = FormField.builder(SOFTWARE);
builder.setValue(software);
dataFormBuilder.addField(builder.build());
return this;
}
/**
* Include Software Version as a {@link FormField}.
* <br>
* @param softwareVersion Version of the Software in use
* @return Builder
*/
public Builder setSoftwareVersion(String softwareVersion) {
TextSingleFormField.Builder builder = FormField.builder(SOFTWARE_VERSION);
builder.setValue(softwareVersion);
dataFormBuilder.addField(builder.build());
return this;
}
/**
* Include {@link DataForm} to be encapsulated under SoftwareInfoForm.
* <br>
* @param dataForm The dataform containing Software Information
* @return Builder
*/
public Builder setDataForm(DataForm dataForm) {
if (dataForm.getTitle() != null || !dataForm.getItems().isEmpty()
|| dataForm.getReportedData() != null || !dataForm.getInstructions().isEmpty()) {
throw new IllegalArgumentException("Illegal Arguements for SoftwareInformation");
}
String formTypeValue = dataForm.getFormType();
if (formTypeValue == null) {
throw new IllegalArgumentException("FORM_TYPE Formfield missing");
}
if (!formTypeValue.equals(SoftwareInfoForm.FORM_TYPE)) {
throw new IllegalArgumentException("Malformed FORM_TYPE Formfield encountered");
}
this.dataFormBuilder = dataForm.asBuilder();
return this;
}
/**
* This method is called to build a {@link SoftwareInfoForm}.
* <br>
* @return Builder
*/
public SoftwareInfoForm build() {
return new SoftwareInfoForm(dataFormBuilder.build());
}
}
}