blob: 7fe305b45601aa9a2a383925ac5a4c95fa6152be [file] [log] [blame]
/****************************************************************************
* 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();
}
}
}