2 * Copyright (c) 2010-2020 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.tr064.internal.phonebook;
15 import java.io.ByteArrayInputStream;
16 import java.io.InputStream;
17 import java.util.HashMap;
19 import java.util.Optional;
20 import java.util.concurrent.ExecutionException;
21 import java.util.concurrent.TimeUnit;
22 import java.util.concurrent.TimeoutException;
23 import java.util.stream.Collectors;
25 import javax.xml.bind.JAXBContext;
26 import javax.xml.bind.JAXBException;
27 import javax.xml.bind.Unmarshaller;
28 import javax.xml.transform.stream.StreamSource;
30 import org.eclipse.jdt.annotation.NonNullByDefault;
31 import org.eclipse.jetty.client.HttpClient;
32 import org.eclipse.jetty.client.api.ContentResponse;
33 import org.eclipse.jetty.http.HttpMethod;
34 import org.openhab.binding.tr064.internal.dto.phonebook.NumberType;
35 import org.openhab.binding.tr064.internal.dto.phonebook.PhonebooksType;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
40 * The {@link Tr064PhonebookImpl} class implements a phonebook
42 * @author Jan N. Klug - Initial contribution
45 public class Tr064PhonebookImpl implements Phonebook {
46 private final Logger logger = LoggerFactory.getLogger(Tr064PhonebookImpl.class);
48 private Map<String, String> phonebook = new HashMap<>();
50 private final HttpClient httpClient;
51 private final String phonebookUrl;
53 private String phonebookName = "";
55 public Tr064PhonebookImpl(HttpClient httpClient, String phonebookUrl) {
56 this.httpClient = httpClient;
57 this.phonebookUrl = phonebookUrl;
61 private void getPhonebook() {
63 ContentResponse contentResponse = httpClient.newRequest(phonebookUrl).method(HttpMethod.GET)
64 .timeout(2, TimeUnit.SECONDS).send();
65 InputStream xml = new ByteArrayInputStream(contentResponse.getContent());
67 JAXBContext context = JAXBContext.newInstance(PhonebooksType.class);
68 Unmarshaller um = context.createUnmarshaller();
69 PhonebooksType phonebooksType = um.unmarshal(new StreamSource(xml), PhonebooksType.class).getValue();
71 phonebookName = phonebooksType.getPhonebook().getName();
73 phonebook = phonebooksType.getPhonebook().getContact().stream().map(contact -> {
74 String contactName = contact.getPerson().getRealName();
75 return contact.getTelephony().getNumber().stream()
76 .collect(Collectors.toMap(NumberType::getValue, number -> contactName));
77 }).collect(HashMap::new, HashMap::putAll, HashMap::putAll);
78 logger.debug("Downloaded phonebook {}: {}", phonebookName, phonebook);
79 } catch (JAXBException | InterruptedException | ExecutionException | TimeoutException e) {
80 logger.warn("Failed to get phonebook with URL {}:", phonebookUrl, e);
85 public String getName() {
90 public Optional<String> lookupNumber(String number, int matchCount) {
91 String matchString = matchCount < number.length() ? number.substring(number.length() - matchCount) : number;
92 logger.trace("matchString for {} is {}", number, matchString);
93 return phonebook.keySet().stream().filter(n -> n.endsWith(matchString)).findAny().map(phonebook::get);
97 public String toString() {
98 return "Phonebook{" + "phonebookName='" + phonebookName + "', phonebook=" + phonebook + '}';