View Javadoc
1   /*
2    * Copyright (C) 2013 4th Line GmbH, Switzerland
3    *
4    * The contents of this file are subject to the terms of either the GNU
5    * Lesser General Public License Version 2 or later ("LGPL") or the
6    * Common Development and Distribution License Version 1 or later
7    * ("CDDL") (collectively, the "License"). You may not use this file
8    * except in compliance with the License. See LICENSE.txt for more
9    * information.
10   *
11   * This program is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14   */
15  
16  package org.fourthline.cling.model.meta;
17  
18  import org.fourthline.cling.model.Validatable;
19  import org.fourthline.cling.model.ValidationError;
20  import org.fourthline.cling.model.types.DLNACaps;
21  import org.fourthline.cling.model.types.DLNADoc;
22  
23  import java.net.URI;
24  import java.net.URL;
25  import java.util.List;
26  import java.util.ArrayList;
27  import java.util.logging.Logger;
28  
29  /**
30   * Encapsulates all optional metadata about a device.
31   *
32   * @author Christian Bauer
33   */
34  public class DeviceDetails implements Validatable {
35  
36      final private static Logger log = Logger.getLogger(DeviceDetails.class.getName());
37  
38      final private URL baseURL;
39      final private String friendlyName;
40      final private ManufacturerDetails manufacturerDetails;
41      final private ModelDetails modelDetails;
42      final private String serialNumber;
43      final private String upc;
44      final private URI presentationURI;
45      final private DLNADoc[] dlnaDocs;
46      final private DLNACaps dlnaCaps;
47      final private DLNACaps secProductCaps; 
48  
49      public DeviceDetails(String friendlyName) {
50          this(null, friendlyName, null, null, null, null, null);
51      }
52  
53      public DeviceDetails(String friendlyName, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps) {
54          this(null, friendlyName, null, null, null, null, null, dlnaDocs, dlnaCaps);
55      }
56  
57      public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails) {
58          this(null, friendlyName, manufacturerDetails, null, null, null, null);
59      }
60  
61      public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps) {
62          this(null, friendlyName, manufacturerDetails, null, null, null, null, dlnaDocs, dlnaCaps);
63      }
64  
65      public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails,
66                           ModelDetails modelDetails) {
67          this(null, friendlyName, manufacturerDetails, modelDetails, null, null, null);
68      }
69  
70      public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails,
71                           ModelDetails modelDetails, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps) {
72          this(null, friendlyName, manufacturerDetails, modelDetails, null, null, null, dlnaDocs, dlnaCaps);
73      }
74      
75      public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails,
76              ModelDetails modelDetails, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps, DLNACaps secProductCaps) {
77      	this(null, friendlyName, manufacturerDetails, modelDetails, null, null, null, dlnaDocs, dlnaCaps, secProductCaps);
78      }
79  
80      public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, ModelDetails modelDetails,
81                           String serialNumber, String upc) {
82          this(null, friendlyName, manufacturerDetails, modelDetails, serialNumber, upc, null);
83      }
84  
85      public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, ModelDetails modelDetails,
86                           String serialNumber, String upc, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps) {
87          this(null, friendlyName, manufacturerDetails, modelDetails, serialNumber, upc, null, dlnaDocs, dlnaCaps);
88      }
89  
90      public DeviceDetails(String friendlyName, URI presentationURI) {
91          this(null, friendlyName, null, null, null, null, presentationURI);
92      }
93  
94      public DeviceDetails(String friendlyName, URI presentationURI, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps) {
95          this(null, friendlyName, null, null, null, null, presentationURI, dlnaDocs, dlnaCaps);
96      }
97  
98      public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails,
99                           ModelDetails modelDetails, URI presentationURI) {
100         this(null, friendlyName, manufacturerDetails, modelDetails, null, null, presentationURI);
101     }
102 
103     public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails,
104                          ModelDetails modelDetails, URI presentationURI, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps) {
105         this(null, friendlyName, manufacturerDetails, modelDetails, null, null, presentationURI, dlnaDocs, dlnaCaps);
106     }
107 
108     public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, ModelDetails modelDetails,
109                          String serialNumber, String upc, URI presentationURI) {
110         this(null, friendlyName, manufacturerDetails, modelDetails, serialNumber, upc, presentationURI);
111     }
112 
113     public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, ModelDetails modelDetails,
114                          String serialNumber, String upc, URI presentationURI, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps) {
115         this(null, friendlyName, manufacturerDetails, modelDetails, serialNumber, upc, presentationURI, dlnaDocs, dlnaCaps);
116     }
117 
118     public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, ModelDetails modelDetails,
119                          String serialNumber, String upc, String presentationURI)
120             throws IllegalArgumentException {
121         this(null, friendlyName, manufacturerDetails, modelDetails, serialNumber, upc, URI.create(presentationURI));
122     }
123 
124     public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, ModelDetails modelDetails,
125                          String serialNumber, String upc, String presentationURI, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps)
126             throws IllegalArgumentException {
127         this(null, friendlyName, manufacturerDetails, modelDetails, serialNumber, upc, URI.create(presentationURI), dlnaDocs, dlnaCaps);
128     }
129 
130     public DeviceDetails(URL baseURL, String friendlyName,
131                          ManufacturerDetails manufacturerDetails, ModelDetails modelDetails,
132                          String serialNumber, String upc,
133                          URI presentationURI) {
134         this(baseURL, friendlyName, manufacturerDetails, modelDetails, serialNumber, upc, presentationURI, null, null);
135     }
136 
137     public DeviceDetails(URL baseURL, String friendlyName,
138             ManufacturerDetails manufacturerDetails, ModelDetails modelDetails,
139             String serialNumber, String upc,
140             URI presentationURI, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps) {
141     	 this(baseURL, friendlyName, manufacturerDetails, modelDetails, serialNumber, upc, presentationURI, dlnaDocs, dlnaCaps, null);
142     }
143     
144     public DeviceDetails(URL baseURL, String friendlyName,
145                          ManufacturerDetails manufacturerDetails, ModelDetails modelDetails,
146                          String serialNumber, String upc,
147                          URI presentationURI, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps, DLNACaps secProductCaps) {
148         this.baseURL = baseURL;
149         this.friendlyName = friendlyName;
150         this.manufacturerDetails = manufacturerDetails == null ? new ManufacturerDetails() : manufacturerDetails;
151         this.modelDetails = modelDetails == null ? new ModelDetails() : modelDetails;
152         this.serialNumber = serialNumber;
153         this.upc = upc;
154         this.presentationURI = presentationURI;
155         this.dlnaDocs = dlnaDocs != null ? dlnaDocs : new DLNADoc[0];
156         this.dlnaCaps = dlnaCaps;
157         this.secProductCaps = secProductCaps;
158     }
159 
160     public URL getBaseURL() {
161         return baseURL;
162     }
163 
164     public String getFriendlyName() {
165         return friendlyName;
166     }
167 
168     public ManufacturerDetails getManufacturerDetails() {
169         return manufacturerDetails;
170     }
171 
172     public ModelDetails getModelDetails() {
173         return modelDetails;
174     }
175 
176     public String getSerialNumber() {
177         return serialNumber;
178     }
179 
180     public String getUpc() {
181         return upc;
182     }
183 
184     public URI getPresentationURI() {
185         return presentationURI;
186     }
187 
188     public DLNADoc[] getDlnaDocs() {
189         return dlnaDocs;
190     }
191 
192     public DLNACaps getDlnaCaps() {
193         return dlnaCaps;
194     }
195     
196     public DLNACaps getSecProductCaps() {
197         return secProductCaps;
198     }
199 
200     public List<ValidationError> validate() {
201         List<ValidationError> errors = new ArrayList<>();
202 
203         if (getUpc() != null) {
204             // This is broken in more than half of the devices I've tested, so let's not even bother with a warning
205             if (getUpc().length() != 12) {
206                 log.fine("UPnP specification violation, UPC must be 12 digits: " + getUpc());
207             } else {
208                 try {
209                     Long.parseLong(getUpc());
210                 } catch (NumberFormatException ex) {
211                     log.fine("UPnP specification violation, UPC must be 12 digits all-numeric: " + getUpc());
212                 }
213             }
214         }
215 
216         return errors;
217     }
218 }