/******************************************************************************* * Copyright (c) 2015 Composent, Inc. and others. 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: * Composent, Inc. - initial API and implementation ******************************************************************************/ package com.mycorp.examples.timeservice.internal.provider.rest.host; import java.io.IOException; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.ecf.core.ContainerCreateException; import org.eclipse.ecf.core.ContainerTypeDescription; import org.eclipse.ecf.core.IContainer; import org.eclipse.ecf.core.identity.ID; import org.eclipse.ecf.core.identity.Namespace; import org.eclipse.ecf.remoteservice.provider.RemoteServiceContainerInstantiator; import org.eclipse.ecf.remoteservice.rest.identity.RestNamespace; import org.eclipse.ecf.remoteservice.servlet.HttpServiceComponent; import org.eclipse.ecf.remoteservice.servlet.RemoteServiceHttpServlet; import org.eclipse.ecf.remoteservice.servlet.ServletServerContainer; import org.json.JSONException; import org.json.JSONObject; import org.osgi.service.http.NamespaceException; import com.mycorp.examples.timeservice.ITimeService; public class TimeServiceServerContainer extends ServletServerContainer { public static final String TIMESERVICE_HOST_CONFIG_NAME = "com.mycorp.examples.timeservice.rest.host"; public static final String TIMESERVICE_SERVLET_NAME = "/" + ITimeService.class.getName(); TimeServiceServerContainer(ID id) throws ServletException, NamespaceException { super(id); // Register our servlet with the given httpService with the // TIMESERVICE_SERVLET_NAME // which is "/com.mycorp.examples.timeservice.ITimeService" TimeServiceHttpServiceComponent.getDefault().registerServlet(TIMESERVICE_SERVLET_NAME, new TimeRemoteServiceHttpServlet(), null, null); } @Override public void dispose() { TimeServiceHttpServiceComponent.getDefault().unregisterServlet(TIMESERVICE_SERVLET_NAME); super.dispose(); } @Override public Namespace getConnectNamespace() { return RestNamespace.INSTANCE; } class TimeRemoteServiceHttpServlet extends RemoteServiceHttpServlet { private static final long serialVersionUID = 3906126401901826462L; // Handle remote time service get call here. @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // Get local OSGi ITimeService ITimeService timeService = HttpServiceComponent.getDefault().getService(ITimeService.class); // Call local service to get the current time Long currentTime = timeService.getCurrentTime(); // Serialize response and send as http response try { resp.getOutputStream().print(new JSONObject().put("time", currentTime).toString()); } catch (JSONException e) { throw new ServletException("json response object could not be created for time service", e); } } } public static class Instantiator extends RemoteServiceContainerInstantiator { @Override public IContainer createInstance(ContainerTypeDescription description, Map<String, ?> parameters) throws ContainerCreateException { try { return new TimeServiceServerContainer( RestNamespace.INSTANCE.createInstance(new Object[] { (String) parameters.get("id") })); } catch (Exception e) { throw new ContainerCreateException("Could not create time service server", e); } } public String[] getSupportedConfigs(ContainerTypeDescription description) { return new String[] { TIMESERVICE_HOST_CONFIG_NAME }; } } }