1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package edu.internet2.middleware.shibboleth.common.config.attribute.resolver.attributeDefinition;
18
19 import java.io.FileInputStream;
20 import java.io.IOException;
21 import java.util.List;
22 import java.util.Map;
23
24 import javax.xml.namespace.QName;
25
26 import org.opensaml.xml.util.DatatypeHelper;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29 import org.springframework.beans.factory.BeanCreationException;
30 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
31 import org.springframework.beans.factory.xml.ParserContext;
32 import org.w3c.dom.Element;
33
34
35
36
37 public class ScriptedAttributeDefinitionBeanDefinitionParser extends BaseAttributeDefinitionBeanDefinitionParser {
38
39
40 public static final QName TYPE_NAME = new QName(AttributeDefinitionNamespaceHandler.NAMESPACE, "Script");
41
42
43 private final Logger log = LoggerFactory.getLogger(ScriptedAttributeDefinitionBeanDefinitionParser.class);
44
45
46 protected Class getBeanClass(Element arg0) {
47 return ScriptedAttributeDefinitionFactoryBean.class;
48 }
49
50
51 protected void doParse(String pluginId, Element pluginConfig, Map<QName, List<Element>> pluginConfigChildren,
52 BeanDefinitionBuilder pluginBuilder, ParserContext parserContext) {
53 super.doParse(pluginId, pluginConfig, pluginConfigChildren, pluginBuilder, parserContext);
54
55 String scriptLanguage = "javascript";
56 if (pluginConfig.hasAttributeNS(null, "language")) {
57 scriptLanguage = pluginConfig.getAttributeNS(null, "language");
58 }
59 log.debug("Attribute definition {} scripting language: {}", pluginId, scriptLanguage);
60 pluginBuilder.addPropertyValue("language", scriptLanguage);
61
62 String script = null;
63 List<Element> scriptElem = pluginConfigChildren.get(new QName(AttributeDefinitionNamespaceHandler.NAMESPACE,
64 "Script"));
65 if (scriptElem != null && scriptElem.size() > 0) {
66 script = scriptElem.get(0).getTextContent();
67 } else {
68 List<Element> scriptFileElem = pluginConfigChildren.get(new QName(
69 AttributeDefinitionNamespaceHandler.NAMESPACE, "ScriptFile"));
70 if (scriptFileElem != null && scriptFileElem.size() > 0) {
71 String scriptFile = scriptFileElem.get(0).getTextContent();
72 try {
73 script = DatatypeHelper.inputstreamToString(new FileInputStream(scriptFile), null);
74 } catch (IOException e) {
75 throw new BeanCreationException("Unable to read script file " + scriptFile, e);
76 }
77 }
78 }
79
80 if (script == null) {
81 throw new BeanCreationException("No script specified for this attribute definition");
82 }
83 log.debug("Attribute definition {} script: {}", pluginId, script);
84 pluginBuilder.addPropertyValue("script", script);
85 }
86 }