/*******************************************************************************
* Copyright (c) 2015 IBH SYSTEMS GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBH SYSTEMS GmbH - initial API and implementation
*******************************************************************************/
package org.eclipse.packagedrone.repo.adapter.npm;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.packagedrone.repo.channel.ChannelNotFoundException;
import org.eclipse.packagedrone.repo.channel.ChannelService;
import org.eclipse.packagedrone.repo.channel.ReadableChannel;
import org.eclipse.packagedrone.repo.channel.ChannelService.By;
import org.eclipse.packagedrone.repo.manage.system.SystemService;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.util.tracker.ServiceTracker;
public class NpmServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
private ServiceTracker<ChannelService, ChannelService> tracker;
private ServiceTracker<SystemService, SystemService> sysTracker;
@Override
public void init () throws ServletException
{
super.init ();
final BundleContext context = FrameworkUtil.getBundle ( NpmServlet.class ).getBundleContext ();
this.tracker = new ServiceTracker<> ( context, ChannelService.class, null );
this.tracker.open ();
this.sysTracker = new ServiceTracker<> ( context, SystemService.class, null );
this.sysTracker.open ();
}
@Override
public void destroy ()
{
this.tracker.close ();
this.sysTracker.close ();
super.destroy ();
}
@Override
protected void doGet ( final HttpServletRequest request, final HttpServletResponse response ) throws ServletException, IOException
{
String path = request.getPathInfo ();
if ( path == null )
{
path = "/";
}
if ( "/".equals ( path ) )
{
response.getWriter ().write ( "NPM adapter" );
return;
}
final ChannelService service = this.tracker.getService ();
final SystemService sysService = this.sysTracker.getService ();
if ( service == null || sysService == null )
{
response.getWriter ().write ( "System not operational" );
response.setStatus ( HttpServletResponse.SC_SERVICE_UNAVAILABLE );
return;
}
path = path.replaceAll ( "^/+", "" );
final String toks[] = path.split ( "/" );
if ( toks.length < 1 )
{
notFound ( request, response );
return;
}
try
{
service.accessRun ( By.nameOrId ( toks[0] ), ReadableChannel.class, channel -> {
processGet ( request, response, sysService, channel, toks );
} );
}
catch ( final ChannelNotFoundException e )
{
response.getWriter ().format ( "Channel '%s' not found", toks[0] );
response.setStatus ( HttpServletResponse.SC_NOT_FOUND );
}
}
private void processGet ( final HttpServletRequest request, final HttpServletResponse response, final SystemService service, final ReadableChannel channel, final String[] toks ) throws IOException
{
if ( toks.length == 2 )
{
new ModuleHandler ( service, channel, toks[1], true ).process ( response );
return;
}
response.getWriter ().write ( "No handler" );
response.setStatus ( HttpServletResponse.SC_NOT_FOUND );
}
private void notFound ( final HttpServletRequest request, final HttpServletResponse response ) throws IOException
{
response.getWriter ().format ( "Resource '%s' not found", request.getPathInfo () );
response.setStatus ( HttpServletResponse.SC_NOT_FOUND );
}
}