NPE in taglib processing.
[java-idp.git] / src / main / java / edu / internet2 / middleware / shibboleth / idp / ui / ServiceContactTag.java
1 /*\r
2  * Copyright 2011 University Corporation for Advanced Internet Development, Inc.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  * http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 package edu.internet2.middleware.shibboleth.idp.ui;\r
18 \r
19 import java.io.IOException;\r
20 import java.util.List;\r
21 \r
22 import javax.servlet.jsp.JspException;\r
23 import javax.servlet.jsp.JspWriter;\r
24 import javax.servlet.jsp.tagext.BodyContent;\r
25 \r
26 import org.opensaml.saml2.metadata.ContactPerson;\r
27 import org.opensaml.saml2.metadata.ContactPersonTypeEnumeration;\r
28 import org.opensaml.saml2.metadata.EmailAddress;\r
29 import org.opensaml.saml2.metadata.EntityDescriptor;\r
30 import org.opensaml.saml2.metadata.GivenName;\r
31 import org.opensaml.saml2.metadata.SurName;\r
32 import org.slf4j.Logger;\r
33 import org.slf4j.LoggerFactory;\r
34 \r
35 /** return the contactInfo for the SP or null. */\r
36 public class ServiceContactTag extends ServiceTagSupport {\r
37     \r
38     /** required by checkstyle. */\r
39     private static final long serialVersionUID = -4000690571141490553L;\r
40 \r
41     /** Class logger. */\r
42     private static Logger log = LoggerFactory.getLogger(ServiceContactTag.class);\r
43 \r
44     /** storage for the contactType bean. */\r
45     private ContactPersonTypeEnumeration contactType = ContactPersonTypeEnumeration.SUPPORT;\r
46     \r
47     /** bean storage for the name attribute. */\r
48     private String contactName;\r
49     \r
50     /** \r
51      * Setter for the contactType bean.\r
52      * @param type in value\r
53      */\r
54     public void setContactType(String type) {\r
55         if (null == type || 0 == type.length()) {\r
56             log.warn("no parameter provided to contactType");\r
57             return;\r
58         }\r
59         if (type.equals(ContactPersonTypeEnumeration.ADMINISTRATIVE)) {\r
60             contactType = ContactPersonTypeEnumeration.ADMINISTRATIVE;\r
61         } else if (type.equals(ContactPersonTypeEnumeration.BILLING)) {\r
62             contactType = ContactPersonTypeEnumeration.BILLING;\r
63         } else if (type.equals(ContactPersonTypeEnumeration.OTHER)) {\r
64             contactType = ContactPersonTypeEnumeration.OTHER;\r
65         } else if (type.equals(ContactPersonTypeEnumeration.SUPPORT)) {\r
66             contactType = ContactPersonTypeEnumeration.SUPPORT;\r
67         } else if (type.equals(ContactPersonTypeEnumeration.TECHNICAL)) {\r
68             contactType = ContactPersonTypeEnumeration.TECHNICAL;\r
69         } else {\r
70             log.warn("parameter provided to contactType:" + type + " is invalid");\r
71             return;\r
72         }\r
73     }\r
74 \r
75     /**\r
76      * Set the bean.\r
77      * @param s new value\r
78      */\r
79     public void setName(String s) {\r
80         contactName = s;\r
81     }\r
82     \r
83     /**\r
84      * either return the name raw or garnshed in a hyperlink.\r
85      * @param email the email address (a url)\r
86      * @param name the name to return.\r
87      * @return either a hyperlink or a raw string\r
88      */\r
89     private String buildURL(String email, String name){\r
90         //\r
91         // We have emailAdress or null and a  non empty fullName.\r
92         //\r
93         if (null != email) {\r
94             //\r
95             // Nonempty email. Construct an href\r
96             //\r
97             if (log.isDebugEnabled()) {\r
98                 log.debug("constructing hyperlink from name \"" + name+ "\" and email " + email);\r
99             }\r
100             return buildHyperLink(email, name);\r
101         } else {\r
102             //\r
103             // No mail, no href\r
104             //\r
105             if (log.isDebugEnabled()) {\r
106                 log.debug("no email found, using name \"" + name + "\" with no hyperlink");\r
107             }\r
108             return name.toString();\r
109         }\r
110         \r
111     }\r
112     \r
113     /**\r
114      * build an appropriate string from the &ltContact&gt.\r
115      * @param contact who we are interested in.\r
116      * @return either an hyperlink or straight text or null\r
117      */\r
118      private String getStringFromContact(ContactPerson contact) {\r
119         StringBuilder fullName = new StringBuilder();\r
120         GivenName givenName = contact.getGivenName();\r
121         SurName surName = contact.getSurName();\r
122         List<EmailAddress> emails = contact.getEmailAddresses();\r
123         String emailAddress = null;\r
124 \r
125         //\r
126         // grab email - of there is one\r
127         //\r
128         if (emails != null && !emails.isEmpty()) {\r
129             emailAddress = emails.get(0).getAddress();\r
130         }\r
131         \r
132         if (null != contactName) {\r
133             return buildURL(emailAddress, contactName);\r
134         }\r
135         //\r
136         // Otherwise we build it from whats in the metadata\r
137         //\r
138         if (null != givenName) {\r
139             fullName.append(givenName.getName()).append(" ");\r
140         }\r
141         if (null != surName) {\r
142             fullName.append(surName.getName()).append(" ");\r
143         }\r
144         if (0 == fullName.length()) {\r
145             if (null == emails) {\r
146                 //\r
147                 // No name, no email, nothing we can do\r
148                 //\r
149                 return null;\r
150             }\r
151             if (log.isDebugEnabled()) {\r
152                 log.debug("no names found, using email address as text");\r
153             }\r
154             fullName.append(emailAddress);\r
155         }\r
156         return buildURL(emailAddress, fullName.toString());\r
157     }\r
158     \r
159     /** \r
160      * build an appropriate string from the &ltEntityDescriptor&gt.\r
161      * @return either an hyperlink or straight text or null.\r
162      */\r
163     protected String getContactFromEntity() {\r
164         \r
165         EntityDescriptor sp = getSPEntityDescriptor();\r
166         if (null == sp) {\r
167             log.debug("No relying party, nothing to display");\r
168             return null;\r
169         }\r
170 \r
171         List<ContactPerson> contacts = sp.getContactPersons();\r
172         if (null == contacts) {\r
173             return null;\r
174         }\r
175         for (ContactPerson contact:contacts) {\r
176             if (contactType == contact.getType()) {\r
177                 return getStringFromContact(contact);\r
178             }\r
179         } \r
180         return null;\r
181     }\r
182     \r
183     @Override\r
184     public int doEndTag() throws JspException {\r
185        \r
186         String result;\r
187         result = getContactFromEntity();\r
188         \r
189         try {\r
190             if (null == result) {\r
191                 BodyContent bc = getBodyContent();\r
192                 if (null != bc) {\r
193                     JspWriter ew= bc.getEnclosingWriter();\r
194                     if (ew != null) {\r
195                         bc.writeOut(ew);\r
196                     }\r
197                 }\r
198             } else {\r
199                 pageContext.getOut().print(result);\r
200             }\r
201         } catch (IOException e) {\r
202             log.warn("Error generating Description");\r
203             throw new JspException("EndTag", e);\r
204         }\r
205         return super.doEndTag();\r
206     }\r
207 \r
208 }\r