001 /**
002 * Copyright 2010 The Kuali Foundation Licensed under the
003 * Educational Community License, Version 2.0 (the "License"); you may
004 * not use this file except in compliance with the License. You may
005 * obtain a copy of the License at
006 *
007 * http://www.osedu.org/licenses/ECL-2.0
008 *
009 * Unless required by applicable law or agreed to in writing,
010 * software distributed under the License is distributed on an "AS IS"
011 * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
012 * or implied. See the License for the specific language governing
013 * permissions and limitations under the License.
014 */
015
016 package org.kuali.student.common.test.spring;
017
018 import java.io.File;
019
020 import org.junit.internal.runners.InitializationError;
021 import org.junit.internal.runners.JUnit4ClassRunner;
022 import org.junit.runner.notification.RunNotifier;
023 import org.mortbay.jetty.Connector;
024 import org.mortbay.jetty.Handler;
025 import org.mortbay.jetty.Server;
026 import org.mortbay.jetty.handler.DefaultHandler;
027 import org.mortbay.jetty.handler.HandlerCollection;
028 import org.mortbay.jetty.nio.SelectChannelConnector;
029 import org.mortbay.jetty.webapp.WebAppContext;
030 import org.slf4j.Logger;
031 import org.slf4j.LoggerFactory;
032
033 @Deprecated
034 public class IntegrationServiceTestClassRunner extends JUnit4ClassRunner {
035 final static Logger logger = LoggerFactory.getLogger(IntegrationServiceTestClassRunner.class);
036
037 private Class<?> testClass;
038 private Server server;
039 private String webAppPath;
040 private String contextPath;
041 private int port = 9090;
042
043 public IntegrationServiceTestClassRunner(Class<?> klass) throws InitializationError {
044 super(klass);
045 testClass = klass;
046 }
047
048 private void getAnnotations() {
049 IntegrationServer webapp = this.testClass.getAnnotation(IntegrationServer.class);
050 this.port = webapp.port();
051 this.webAppPath = webapp.webappPath();
052 this.contextPath = webapp.contextPath();
053
054 if (logger.isDebugEnabled()) {
055 logger.debug("port="+this.port);
056 logger.debug("webAppPath="+this.webAppPath);
057 logger.debug("contextPath="+this.contextPath);
058 }
059 }
060
061 private void setProperties() {
062 if (System.getProperty("catalina.base") == null) {
063 System.setProperty("catalina.base", "./target");
064 }
065
066 SystemProperties systemProperties = this.testClass.getAnnotation(SystemProperties.class);
067 if (systemProperties != null) {
068 for(Property property : systemProperties.properties()) {
069 System.setProperty(property.key(), property.value());
070 }
071 }
072 }
073
074 @Override
075 public void run(RunNotifier notifier) {
076 startServer();
077 super.run(notifier);
078 stopServer();
079 }
080
081 private void startServer() {
082 getAnnotations();
083 setProperties();
084
085 this.server = new Server();
086 Connector connector = new SelectChannelConnector();
087 connector.setPort(this.port);
088 this.server.setConnectors(new Connector[] { connector });
089
090 // Metro: Additional debugging info to console
091 // com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true;
092
093 String root = IntegrationServiceTestClassRunner.class.getResource("/").getPath();
094 File webAppsPath = new File(root + this.webAppPath);
095
096 try {
097 if(!webAppsPath.isDirectory()) {
098 throw new RuntimeException("Webapps directory does not exist. " +
099 "Webapps directory must be an exploded (war) directory: " +
100 webAppsPath.getCanonicalPath());
101 }
102
103 if (logger.isDebugEnabled()) {
104 logger.debug("WebApps Path="+webAppsPath.getCanonicalPath());
105 }
106
107 WebAppContext webAppcontext = new WebAppContext();
108 webAppcontext.setParentLoaderPriority(true);
109 webAppcontext.setContextPath(this.contextPath); // e.g. /brms-ws-0.1.0-SNAPSHOT
110 webAppcontext.setWar(webAppsPath.getCanonicalPath());
111 //webAppcontext.setTempDirectory(new File(root));
112
113 HandlerCollection handlers = new HandlerCollection();
114 handlers.setHandlers(new Handler[] { webAppcontext, new DefaultHandler() });
115 this.server.setHandler(handlers);
116
117 this.server.start();
118 } catch (Exception e) {
119 throw new RuntimeException("Starting Jetty server failed", e);
120 }
121 }
122
123 private void stopServer() {
124 try {
125 this.server.stop();
126 } catch (Exception e) {
127 throw new RuntimeException("Stopping Jetty server failed", e);
128 }
129 }
130 }