| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| package org.apache.synapse; |
| |
| import org.apache.axis2.util.OptionsParser; |
| import org.apache.axis2.context.ConfigurationContext; |
| import org.apache.axis2.context.ConfigurationContextFactory; |
| import org.apache.axis2.engine.ListenerManager; |
| import org.apache.axis2.description.TransportInDescription; |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| |
| import javax.xml.namespace.QName; |
| import java.io.File; |
| import java.util.Iterator; |
| import java.net.ServerSocket; |
| import java.net.Socket; |
| |
| /** |
| * Starts all transports as specified on the axis2.xml |
| */ |
| public class SynapseServer { |
| |
| private static final Log log = LogFactory.getLog(SynapseServer.class); |
| |
| public static void printUsage() { |
| System.out.println("Usage: SynapseServer <repository>"); |
| System.out.println(" Opts: -? this message"); |
| System.exit(1); |
| } |
| |
| public static void main(String[] args) throws Exception { |
| |
| // first check if we should print usage |
| if (args.length != 1 || !new File(args[0]).exists()) { |
| printUsage(); |
| } |
| |
| System.out.println("[SynapseServer] Using the Axis2 Repository " |
| + new File(args[0]).getAbsolutePath()); |
| |
| try { |
| ConfigurationContext configctx = ConfigurationContextFactory. |
| createConfigurationContextFromFileSystem(args[0], null); |
| |
| ListenerManager listenerManager = configctx.getListenerManager(); |
| if (listenerManager == null) { |
| listenerManager = new ListenerManager(); |
| listenerManager.init(configctx); |
| } |
| |
| // decide on HTTP port to execute |
| selectPort(configctx); |
| |
| Iterator iter = configctx.getAxisConfiguration(). |
| getTransportsIn().keySet().iterator(); |
| while (iter.hasNext()) { |
| QName trp = (QName) iter.next(); |
| TransportInDescription trsIn = (TransportInDescription) |
| configctx.getAxisConfiguration().getTransportsIn().get(trp); |
| listenerManager.addListener(trsIn, false); |
| String msg = "[SynapseServer] Starting transport " + trsIn.getName(); |
| if (trsIn.getParameter("port") != null) { |
| msg += " on port " + trsIn.getParameter("port").getValue(); |
| } |
| System.out.println(msg); |
| } |
| System.out.println("[SynapseServer] Ready"); |
| |
| } catch (Throwable t) { |
| t.printStackTrace(); |
| System.out.println("[SynapseServer] Startup failed..."); |
| } |
| } |
| |
| private static void selectPort(ConfigurationContext configCtx) { |
| // check if configured port is available |
| TransportInDescription trsIn = (TransportInDescription) |
| configCtx.getAxisConfiguration().getTransportsIn().get(new QName("http")); |
| |
| if (trsIn != null) { |
| |
| int port = 8080; |
| |
| String strPort = System.getProperty("port"); |
| if(strPort != null) { |
| // port is specified as a VM parameter |
| try { |
| port = new Integer(strPort).intValue(); |
| } catch (NumberFormatException e) { |
| // user supplied parameter is not a valid integer. so use the port in configuration. |
| log.error("Given port is not a valid integer. Port specified in the configuration is used for the server."); |
| port = Integer.parseInt(trsIn.getParameter("port").getValue().toString()); |
| } |
| |
| } else { |
| port = Integer.parseInt(trsIn.getParameter("port").getValue().toString()); |
| } |
| |
| while (true) { |
| ServerSocket sock = null; |
| try { |
| sock = new ServerSocket(port); |
| trsIn.getParameter("port").setValue(Integer.toString(port)); |
| break; |
| } catch (Exception e) { |
| System.out.println("[SynapseServer] Port "+port+" already in use. Trying alternate"); |
| if (port == 8080) { |
| port = 8008; |
| } else { |
| port++; |
| } |
| } finally { |
| if (sock != null) { |
| try { |
| sock.close(); |
| } catch (Exception e) {} |
| } |
| } |
| } |
| } |
| } |
| |
| } |