| /**************************************************************************** |
| * Copyright (c) 2008 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 org.eclipse.ecf.internal.examples.updatesite; |
| |
| import java.net.*; |
| import java.security.InvalidParameterException; |
| import java.util.Map; |
| import org.eclipse.ecf.core.ContainerFactory; |
| import org.eclipse.ecf.discovery.*; |
| import org.eclipse.ecf.discovery.identity.IServiceTypeID; |
| import org.eclipse.ecf.discovery.identity.ServiceIDFactory; |
| import org.eclipse.equinox.app.IApplication; |
| import org.eclipse.equinox.app.IApplicationContext; |
| import org.osgi.service.http.HttpService; |
| |
| /** |
| * |
| */ |
| public class DiscoverableServer implements IApplication { |
| |
| private static final String PROTO = "http"; //$NON-NLS-1$ |
| |
| static final String DEFAULT_UPDATE_SITE_SERVICE_TYPE = "updatesite"; //$NON-NLS-1$ |
| |
| private String username; |
| protected String serviceType; |
| private String serviceName; |
| |
| private String servicePath; |
| private String updateSiteName; |
| private URL updateSiteLocation; |
| |
| private IDiscoveryAdvertiser discovery; |
| private IServiceInfo serviceInfo; |
| |
| private boolean done = false; |
| |
| public DiscoverableServer() { |
| // nothing to do |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext) |
| */ |
| public Object start(IApplicationContext ctxt) throws Exception { |
| Map args = ctxt.getArguments(); |
| initializeFromArguments((String[]) args.get("application.args")); //$NON-NLS-1$ |
| |
| // Load and start ECF core bundles (to execute ecfstart jobs like discovery providers) |
| ContainerFactory.getDefault().getDescriptions(); |
| |
| // get discovery service |
| discovery = Activator.getDefault().waitForDiscoveryService(5000); |
| |
| // Create service id |
| IServiceTypeID serviceTypeID = ServiceIDFactory.getDefault().createServiceTypeID(discovery.getServicesNamespace(), new String[] {PROTO}, IServiceTypeID.DEFAULT_PROTO); |
| // create service info |
| URI uri = URI.create(PROTO + "://" + InetAddress.getLocalHost().getHostAddress() + ":" + getServicePort() + servicePath); //$NON-NLS-1$ //$NON-NLS-2$ |
| serviceInfo = new ServiceInfo(uri, serviceName, serviceTypeID, 0, 0, new ServiceProperties(new UpdateSiteProperties(serviceName).toProperties())); |
| |
| // get http service |
| final HttpService httpService = Activator.getDefault().waitForHttpService(2000); |
| |
| // start http service |
| httpService.registerResources(servicePath, "/", new UpdateSiteContext(httpService.createDefaultHttpContext(), updateSiteLocation)); //$NON-NLS-1$ |
| System.out.println("http server\n\tupdateSiteLocation=" + updateSiteLocation + "\n\turl=" + serviceInfo.getServiceID().getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ |
| |
| // setup discovery |
| discovery.registerService(serviceInfo); |
| System.out.println("discovery publish\n\tserviceName=" + serviceName + "\n\tserviceTypeID=" + serviceTypeID); //$NON-NLS-1$ //$NON-NLS-2$ |
| |
| // wait until done |
| synchronized (this) { |
| while (!done) { |
| wait(); |
| } |
| } |
| return new Integer(0); |
| } |
| |
| private int getServicePort() { |
| final String osgiPort = System.getProperty("org.osgi.service.http.port"); //$NON-NLS-1$ |
| Integer servicePort = new Integer(80); |
| if (osgiPort != null) { |
| servicePort = Integer.valueOf(osgiPort); |
| } |
| return servicePort.intValue(); |
| } |
| |
| private void initializeFromArguments(String[] args) throws Exception { |
| if (args == null) |
| return; |
| for (int i = 0; i < args.length; i++) { |
| if (!args[i].startsWith("-")) { //$NON-NLS-1$ |
| String arg = args[i++]; |
| if (!arg.endsWith("/")) //$NON-NLS-1$ |
| arg = arg + "/"; //$NON-NLS-1$ |
| updateSiteLocation = new URL(arg); |
| } else { |
| if (args[i - 1].equalsIgnoreCase("-username")) //$NON-NLS-1$ |
| username = args[++i]; |
| else if (args[i - 1].equalsIgnoreCase("-serviceType")) //$NON-NLS-1$ |
| serviceType = args[++i]; |
| else if (args[i - 1].equalsIgnoreCase("-serviceName")) //$NON-NLS-1$ |
| serviceName = args[++i]; |
| else if (args[i - 1].equalsIgnoreCase("-servicePath")) //$NON-NLS-1$ |
| servicePath = args[++i]; |
| else if (args[i - 1].equalsIgnoreCase("-updateSiteName")) //$NON-NLS-1$ |
| updateSiteName = args[++i]; |
| } |
| } |
| if (updateSiteLocation == null) { |
| usage(); |
| throw new InvalidParameterException("updateSiteDirectoryURL required"); //$NON-NLS-1$ |
| } |
| username = (username == null) ? System.getProperty("user.name") : username; //$NON-NLS-1$ |
| serviceType = (serviceType == null) ? DEFAULT_UPDATE_SITE_SERVICE_TYPE : serviceType; |
| serviceName = (serviceName == null) ? username + " update site" : serviceName; //$NON-NLS-1$ |
| servicePath = (servicePath == null) ? "/update" : servicePath; //$NON-NLS-1$ |
| updateSiteName = (updateSiteName == null) ? System.getProperty("updateSiteName", username + " update site") : updateSiteName; //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| private void usage() { |
| System.out.println("usage: eclipse -console [options] -application org.eclipse.ecf.examples.updatesite.server.updateSiteServer <updateSiteDirectoryURL>"); //$NON-NLS-1$ |
| System.out.println(" options: [-username <username>] default=<current user>"); //$NON-NLS-1$ |
| System.out.println(" [-serviceType <servicetype>] default=updatesite"); //$NON-NLS-1$ |
| System.out.println(" [-serviceName <name>] default=<current user> update site"); //$NON-NLS-1$ |
| System.out.println(" [-servicePath <path>] default=/update"); //$NON-NLS-1$ |
| System.out.println(" [-updateSiteName <name>] default=<current user> update site"); //$NON-NLS-1$ |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.equinox.app.IApplication#stop() |
| */ |
| public void stop() { |
| if (discovery != null && serviceInfo != null) { |
| discovery.unregisterService(serviceInfo); |
| discovery = null; |
| serviceInfo = null; |
| } |
| synchronized (this) { |
| done = true; |
| notifyAll(); |
| } |
| } |
| |
| } |