View Javadoc

1   /*
2      Copyright 2007 Ivo Limmen
3   
4      Licensed under the Apache License, Version 2.0 (the "License");
5      you may not use this file except in compliance with the License.
6      You may obtain a copy of the License at
7   
8          http://www.apache.org/licenses/LICENSE-2.0
9   
10     Unless required by applicable law or agreed to in writing, software
11     distributed under the License is distributed on an "AS IS" BASIS,
12     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13     See the License for the specific language governing permissions and
14     limitations under the License.
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 }