The device detection data file contains meta data that can provide additional information about the various records in the data model. This example shows how to access this data and display the values available.
To help navigate the data, it's useful to have an understanding of the types of records that are present:
The example will output each component in turn, with a list of the properties associated with each component. Some of the possible values for each property are also displayed. There are too many profiles to display, so we just list the number of profiles for each component.
Finally, the evidence keys that are accepted by device detection are listed. These are the keys that, when added to the evidence collection in flow data, could have some impact on the result returned by device detection.
package fiftyone.devicedetection.examples.console;
import fiftyone.devicedetection.DeviceDetectionPipelineBuilder;
import fiftyone.devicedetection.cloud.flowelements.DeviceDetectionCloudEngine;
import fiftyone.devicedetection.examples.shared.KeyHelper;
import fiftyone.pipeline.cloudrequestengine.flowelements.CloudRequestEngine;
import fiftyone.pipeline.core.data.EvidenceKeyFilterWhitelist;
import fiftyone.pipeline.core.flowelements.Pipeline;
import fiftyone.pipeline.engines.data.AspectPropertyMetaData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Map;
import java.util.Spliterator;
import java.util.stream.StreamSupport;
import static fiftyone.common.testhelpers.LogbackHelper.configureLogback;
import static fiftyone.pipeline.util.FileFinder.getFilePath;
public class MetadataCloud {
private static final Logger logger = LoggerFactory.getLogger(GettingStartedOnPrem.class);
public static void main(String[] args) throws Exception {
configureLogback(getFilePath("logback.xml"));
String resourceKey = args.length > 0 ? args[0]: null;
run(resourceKey, System.out);
}
public static void run(String resourceKey, OutputStream output) throws Exception {
logger.info("Running MetadataCloud example");
resourceKey = KeyHelper.getOrSetTestResourceKey(resourceKey);
try (Pipeline pipeline = new DeviceDetectionPipelineBuilder(LoggerFactory.getILoggerFactory())
.useCloud(resourceKey)
.build()) {
PrintWriter writer = new PrintWriter(output);
logger.info("Listing Properties");
outputProperties(pipeline.getElement(DeviceDetectionCloudEngine.class), writer);
writer.println();
writer.flush();
logger.info("Listing Evidence Key Details");
outputEvidenceKeyDetails(pipeline.getElement(CloudRequestEngine.class), writer);
writer.println();
writer.flush();
}
}
private static void outputEvidenceKeyDetails(CloudRequestEngine engine, PrintWriter output) {
output.println();
if (engine.getEvidenceKeyFilter() instanceof EvidenceKeyFilterWhitelist) {
EvidenceKeyFilterWhitelist filter =
(EvidenceKeyFilterWhitelist) engine.getEvidenceKeyFilter();
output.println("Accepted evidence keys:");
for (Map.Entry<String, Integer> entry : filter.getWhitelist().entrySet()){
output.println("\t" + entry.getKey());
}
} else {
output.format("The evidence key filter has type " +
"%s. As this does not extend " +
"EvidenceKeyFilterWhitelist, a list of accepted values cannot be " +
"displayed. As an alternative, you can pass evidence keys to " +
"filter.include(string) to see if a particular key will be included " +
"or not.\n", engine.getEvidenceKeyFilter().getClass().getName());
output.println("For example, header.user-agent " +
(engine.getEvidenceKeyFilter().include("header.user-agent") ?
"is " : "is not ") + "accepted.");
}
}
private static void outputProperties(DeviceDetectionCloudEngine engine, PrintWriter output) {
Spliterator<AspectPropertyMetaData> spliterator = engine.getProperties().spliterator();
StreamSupport.stream(spliterator,false)
.forEach(property-> {
output.format(" Property - %s [Category: %s] (%s)\n",
property.getName(),
property.getCategory(),
property.getType().getName());
});
}
}