jonas
Rev 20434 | Rev 20449 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
/**
* JOnAS: Java(TM) Open Application Server
* Copyright (C) 2010 Bull S.A.S.
* Contact: jonas-team@ow2.org
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*
* --------------------------------------------------------------------------
* $Id: JonasVersionsServlet.java 20438 2010-10-08 15:57:50Z alitokmen $
* --------------------------------------------------------------------------
*/
package org.ow2.jonas.versions.servlet;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.jar.Attributes;
import java.util.logging.Logger;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Instantiate;
import org.apache.felix.ipojo.annotations.Invalidate;
import org.apache.felix.ipojo.annotations.Requires;
import org.apache.felix.ipojo.annotations.Validate;
import org.osgi.service.http.HttpContext;
import org.osgi.service.http.HttpService;
import org.osgi.service.http.NamespaceException;
import org.ow2.util.archive.api.IArchive;
import org.ow2.util.archive.api.IArchiveMetadata;
import org.ow2.util.archive.impl.ArchiveManager;
import org.ow2.util.ee.deploy.api.deployable.IDeployable;
import org.ow2.util.ee.deploy.impl.helper.DeployableHelper;
import org.ow2.util.ee.deploy.impl.helper.DeployableHelperException;
/**
* OSGi HTTP servlet that returns the contents of the versions.properties file
* as well as the versions of all files in <code>JONAS_BASE/deploy</code>.
*/
@Component(name = JonasVersionsServlet.COMPONENT_NAME, immediate = true)
@Instantiate(name = JonasVersionsServlet.COMPONENT_NAME)
public class JonasVersionsServlet implements Servlet {
public static final String COMPONENT_NAME = "JonasVersionsServlet";
public static final String CONTEXT = "/services/versions";
private static final String NEWLINE = "\r\n";
private static final String SEPARATOR = " ";
private static final Logger logger = Logger.getLogger(JonasVersionsServlet.class.getName());
@Requires
private HttpService httpService;
private ServletConfig servletConfig;
@Validate
public void start() throws ServletException, NamespaceException {
final HttpContext httpContext = this.httpService.createDefaultHttpContext();
Dictionary<String, String> initParams;
initParams = new Hashtable<String, String>();
initParams.put("servlet-name", JonasVersionsServlet.CONTEXT);
this.httpService.registerServlet(JonasVersionsServlet.CONTEXT, new JonasVersionsServlet(), initParams, httpContext);
JonasVersionsServlet.logger.info("JonasVersionsServlet listening on context " + JonasVersionsServlet.CONTEXT);
}
@Invalidate
public void stop() {
this.httpService.unregister(JonasVersionsServlet.CONTEXT);
}
public void init(final ServletConfig servletConfig) throws ServletException {
this.servletConfig = servletConfig;
}
public ServletConfig getServletConfig() {
return this.servletConfig;
}
public void service(final ServletRequest request, final ServletResponse rsp) throws ServletException, IOException {
HttpServletResponse response = (HttpServletResponse) rsp;
response.setContentType("text/plain;charset=us-ascii");
response.setCharacterEncoding("US-ASCII");
File[] jonasBaseDeployContents = new File(System.getProperty("jonas.base"), "deploy").listFiles();
if (jonasBaseDeployContents != null) {
response.getWriter().write("Deployables' versions");
response.getWriter().write(JonasVersionsServlet.NEWLINE);
response.getWriter().write(JonasVersionsServlet.NEWLINE);
for (File deployableFile : jonasBaseDeployContents) {
IArchive archive = ArchiveManager.getInstance().getArchive(deployableFile);
if (archive == null) {
continue;
}
IArchiveMetadata metadata = archive.getMetadata();
if (metadata == null) {
continue;
}
IDeployable<?> deployable;
try {
deployable = DeployableHelper.getDeployable(archive);
} catch (DeployableHelperException e) {
IOException exception = new IOException("Failed opening archive: " + e);
exception.initCause(e);
throw exception;
}
if (deployable == null) {
continue;
}
String versionNumber = metadata.get(Attributes.Name.IMPLEMENTATION_VERSION.toString());
String name = deployable.getModuleName();
if (name != null && versionNumber != null) {
String versionNumberSuffixShort = "-" + versionNumber;
String versionNumberSuffixLong = "-version" + versionNumber;
if (name.endsWith(versionNumberSuffixShort)) {
name = name.substring(0, name.length() - versionNumberSuffixShort.length());
} else if (name.endsWith(versionNumberSuffixLong)) {
name = name.substring(0, name.length() - versionNumberSuffixLong.length());
}
response.getWriter().write(name);
response.getWriter().write(JonasVersionsServlet.SEPARATOR);
response.getWriter().write(versionNumber);
response.getWriter().write(JonasVersionsServlet.NEWLINE);
}
}
response.getWriter().write(JonasVersionsServlet.NEWLINE);
response.getWriter().write(JonasVersionsServlet.NEWLINE);
}
BufferedReader versionsFileReader = new BufferedReader(new FileReader(new File(System.getProperty("jonas.root"),
"versions.properties")));
try {
String read;
while ((read = versionsFileReader.readLine()) != null) {
response.getWriter().write(read);
response.getWriter().write(JonasVersionsServlet.NEWLINE);
}
} finally {
versionsFileReader.close();
versionsFileReader = null;
}
}
public String getServletInfo() {
return this.toString();
}
public void destroy() {
// Nothing to do
}
}