NPE in taglib processing.
[java-idp.git] / src / main / java / edu / internet2 / middleware / shibboleth / idp / ui / ServiceDescriptionTag.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.AttributeConsumingService;\r
27 import org.opensaml.saml2.metadata.EntityDescriptor;\r
28 import org.opensaml.saml2.metadata.LocalizedString;\r
29 import org.opensaml.saml2.metadata.RoleDescriptor;\r
30 import org.opensaml.saml2.metadata.SPSSODescriptor;\r
31 import org.opensaml.saml2.metadata.ServiceDescription;\r
32 import org.opensaml.samlext.saml2mdui.Description;\r
33 import org.slf4j.Logger;\r
34 import org.slf4j.LoggerFactory;\r
35 \r
36 /**\r
37  * Display the description from the <mdui:UIInfo>.\r
38  * \r
39  */\r
40 public class ServiceDescriptionTag extends ServiceTagSupport {\r
41     \r
42     /** required by checkstyle. */\r
43     private static final long serialVersionUID = -2000941439055969537L;\r
44     /** Class logger. */\r
45     private static Logger log = LoggerFactory.getLogger(ServiceDescriptionTag.class);\r
46 \r
47     /** \r
48      * look at <Uiinfo> if there and if so look for appropriate description.\r
49      * @return null or an appropriate description\r
50      */\r
51     private String getDescriptionFromUIInfo() {\r
52         String lang = getBrowserLanguage();\r
53 \r
54         if (getSPUIInfo() != null && getSPUIInfo().getDescriptions() != null) {\r
55             for (Description desc:getSPUIInfo().getDescriptions()) {\r
56                 if (log.isDebugEnabled()){\r
57                     log.debug("Found description in UIInfo, language=" + desc.getXMLLang());\r
58                 }\r
59                 if (desc.getXMLLang().equals(lang)) {\r
60                     //\r
61                     // Found it\r
62                     //\r
63                     if (log.isDebugEnabled()){\r
64                         log.debug("returning description from UIInfo " + desc.getName().getLocalString());\r
65                     }\r
66                     return desc.getName().getLocalString();\r
67                 }\r
68             }\r
69             if (log.isDebugEnabled()){\r
70                 log.debug("No valid description in UIInfo");\r
71             }            \r
72         }\r
73         return null;\r
74     }\r
75     \r
76     /**\r
77      * look for an &ltAttributeConsumeService&gt and if its there look for an appropriate description.\r
78      * @return null or an appropriate description\r
79      */\r
80     private String getDescriptionFromAttributeConsumingService() {\r
81         String lang = getBrowserLanguage();\r
82         List<RoleDescriptor> roles;\r
83         AttributeConsumingService acs = null;\r
84         EntityDescriptor sp = getSPEntityDescriptor();\r
85         \r
86         if (null == sp) {\r
87             log.debug("No relying party, nothing to display");\r
88             return null;\r
89         }\r
90 \r
91         roles = sp.getRoleDescriptors(SPSSODescriptor.DEFAULT_ELEMENT_NAME);\r
92         if (!roles.isEmpty()) {\r
93             SPSSODescriptor spssod = (SPSSODescriptor) roles.get(0);\r
94             acs = spssod.getDefaultAttributeConsumingService();\r
95         }\r
96         if (acs != null) {\r
97             for (ServiceDescription desc:acs.getDescriptions()) {\r
98                 LocalizedString localDescription = desc.getDescription();\r
99                 if (log.isDebugEnabled()){\r
100                     log.debug("Found name in AttributeConsumingService, language=" + localDescription.getLanguage());\r
101                 }\r
102                 if (localDescription.getLanguage().equals(lang)) {\r
103                     if (log.isDebugEnabled()){\r
104                         log.debug("returning name from AttributeConsumingService " + \r
105                                 desc.getDescription().getLocalString());\r
106                     }\r
107                     return localDescription.getLocalString();\r
108                 }\r
109             }\r
110             if (log.isDebugEnabled()){\r
111                 log.debug("No description in AttributeConsumingService");\r
112             }            \r
113         }        \r
114         return null;\r
115     }\r
116 \r
117     @Override\r
118     public int doEndTag() throws JspException {\r
119        \r
120         String result;\r
121         //\r
122         // UIInfoirst\r
123         //\r
124         result = getDescriptionFromUIInfo();\r
125         \r
126         if (result == null) {\r
127             //\r
128             // Then AttributeCOnsumingService\r
129             //\r
130             result = getDescriptionFromAttributeConsumingService();\r
131         }\r
132 \r
133         try {\r
134             if (null == result) {\r
135                 BodyContent bc = getBodyContent();\r
136                 if (null != bc) {\r
137                     JspWriter ew= bc.getEnclosingWriter();\r
138                     if (ew != null) {\r
139                         bc.writeOut(ew);\r
140                     }\r
141                 }\r
142             } else {\r
143                 pageContext.getOut().print(result);\r
144             }\r
145         } catch (IOException e) {\r
146             log.warn("Error generating Description");\r
147             throw new JspException("EndTag", e);\r
148         }\r
149         return super.doEndTag();\r
150     }\r
151 }\r