]> git.basschouten.com Git - openhab-addons.git/blob
bf105c313d36d97b2afac94c88fdc1984e554bc0
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2020 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.tr064.internal.phonebook;
14
15 import java.io.ByteArrayInputStream;
16 import java.io.InputStream;
17 import java.util.HashMap;
18 import java.util.Map;
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;
24
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;
29
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;
38
39 /**
40  * The {@link Tr064PhonebookImpl} class implements a phonebook
41  *
42  * @author Jan N. Klug - Initial contribution
43  */
44 @NonNullByDefault
45 public class Tr064PhonebookImpl implements Phonebook {
46     private final Logger logger = LoggerFactory.getLogger(Tr064PhonebookImpl.class);
47
48     private Map<String, String> phonebook = new HashMap<>();
49
50     private final HttpClient httpClient;
51     private final String phonebookUrl;
52
53     private String phonebookName = "";
54
55     public Tr064PhonebookImpl(HttpClient httpClient, String phonebookUrl) {
56         this.httpClient = httpClient;
57         this.phonebookUrl = phonebookUrl;
58         getPhonebook();
59     }
60
61     private void getPhonebook() {
62         try {
63             ContentResponse contentResponse = httpClient.newRequest(phonebookUrl).method(HttpMethod.GET)
64                     .timeout(2, TimeUnit.SECONDS).send();
65             InputStream xml = new ByteArrayInputStream(contentResponse.getContent());
66
67             JAXBContext context = JAXBContext.newInstance(PhonebooksType.class);
68             Unmarshaller um = context.createUnmarshaller();
69             PhonebooksType phonebooksType = um.unmarshal(new StreamSource(xml), PhonebooksType.class).getValue();
70
71             phonebookName = phonebooksType.getPhonebook().getName();
72
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);
81         }
82     }
83
84     @Override
85     public String getName() {
86         return phonebookName;
87     }
88
89     @Override
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);
94     }
95
96     @Override
97     public String toString() {
98         return "Phonebook{" + "phonebookName='" + phonebookName + "', phonebook=" + phonebook + '}';
99     }
100 }