1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.limmen.crs.servlet;
17
18 import java.io.IOException;
19 import java.net.InetAddress;
20 import java.net.NetworkInterface;
21 import java.util.Enumeration;
22 import java.util.Hashtable;
23
24 import javax.jmdns.JmDNS;
25 import javax.jmdns.ServiceEvent;
26 import javax.jmdns.ServiceInfo;
27 import javax.jmdns.ServiceListener;
28 import javax.servlet.ServletConfig;
29 import javax.servlet.ServletException;
30 import javax.servlet.http.HttpServlet;
31 import javax.servlet.http.HttpServletRequest;
32 import javax.servlet.http.HttpServletResponse;
33
34 import org.apache.log4j.LogManager;
35 import org.apache.log4j.Logger;
36 import org.limmen.crs.Constants;
37 import org.limmen.crs.api.ConfigurationService;
38 import org.limmen.crs.api.ConfigurationServiceFactory;
39 import org.limmen.crs.exception.ConfigurationException;
40 import org.limmen.crs.model.Setting;
41
42 public class ConfigurationServlet extends HttpServlet implements ServiceListener {
43
44 private static final Logger logger = LogManager.getLogger(ConfigurationServlet.class);
45
46 private static final long serialVersionUID = 6346387628740042262L;
47
48 private JmDNS jmdns;
49
50 @Override
51 public void destroy() {
52
53 jmdns.close();
54 }
55
56 private Logger getLogger() {
57
58 return logger;
59 }
60
61 @SuppressWarnings("unchecked")
62 @Override
63 public void init(ServletConfig config) throws ServletException {
64
65 getLogger().info("Registering service using Multicast DNS (ZeroConf)...");
66
67 int port = Integer.parseInt(config.getInitParameter("service-port"));
68 String contextPath = config.getInitParameter("service-contextpath");
69
70 try {
71
72 Enumeration<NetworkInterface> addressesEnum =
73 NetworkInterface.getNetworkInterfaces();
74
75 InetAddress inetAddress = addressesEnum.nextElement().getInetAddresses().nextElement();
76
77 while (addressesEnum.hasMoreElements()
78 && inetAddress.isLoopbackAddress()) {
79
80 inetAddress = addressesEnum.nextElement().getInetAddresses().nextElement();
81
82 }
83
84 jmdns = new JmDNS(inetAddress);
85 jmdns.addServiceListener(Constants.ZERO_CONF_SERVICE_TYPE, this);
86
87 Hashtable properties = new Hashtable();
88 properties.put(Constants.SERVICE_CONTEXTPATH_PROPERTY, contextPath);
89
90 ServiceInfo serviceInfo = new ServiceInfo(
91 Constants.ZERO_CONF_SERVICE_TYPE,
92 Constants.ZERO_CONF_SERVICE_NAME,
93 port,
94 0,
95 0,
96 properties);
97
98 jmdns.registerService(serviceInfo);
99 }
100 catch (Exception e) {
101
102 getLogger().error(e);
103
104 jmdns.close();
105
106 throw new ServletException(e);
107 }
108 }
109
110 @Override
111 public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
112
113 ConfigurationService configurationService = ConfigurationServiceFactory.getInstance().getConfigurationService();
114
115 String configurationId = request.getParameter("configurationId");
116 String section = request.getParameter("section");
117 String setting = request.getParameter("setting");
118 Setting configurationSetting = null;
119
120 getLogger().info(
121 String.format(
122 "Configuration request: config: %0$s, section: %1$s, " +
123 "setting: %2$s",
124 configurationId,
125 section,
126 setting));
127
128 try {
129
130 configurationSetting = configurationService.getSetting(configurationId, section, setting);
131 }
132 catch (ConfigurationException e) {
133
134 response.getWriter().write(response.encodeURL("error=" + e.getMessage()));
135 response.getWriter().write("\n");
136
137 return;
138 }
139
140 response.getWriter().write(response.encodeURL("type=" + configurationSetting.getType().name()));
141 response.getWriter().write("\n");
142 response.getWriter().write(response.encodeURL("value=" + configurationSetting.getValue()));
143 response.getWriter().write("\n");
144 }
145
146 @Override
147 public void serviceAdded(ServiceEvent event) {
148
149 getLogger().info("Service added: " + event.getName());
150 }
151
152 @Override
153 public void serviceRemoved(ServiceEvent event) {
154
155 getLogger().info("Service removed: " + event.getName());
156 }
157
158 @Override
159 public void serviceResolved(ServiceEvent event) {
160
161 getLogger().info("Service resolved: " + event.getName());
162 }
163 }