/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.test.infrastructure.process;
import static org.mule.runtime.deployment.model.api.application.ApplicationDescriptor.DEFAULT_CONFIGURATION_RESOURCE;
import static org.mule.test.infrastructure.process.MuleContextProcessBuilder.MULE_CORE_EXTENSIONS_PROPERTY;
import org.mule.runtime.container.api.MuleCoreExtension;
import org.mule.runtime.core.api.config.MuleProperties;
import org.mule.runtime.core.util.ClassUtils;
import org.mule.runtime.core.util.FileUtils;
import org.mule.test.infrastructure.deployment.FakeMuleServer;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class MuleContextProcessApplication {
public static final String TEST_APPLICATION_NAME = "test-app";
private static Socket logSocket;
private static Socket commandSocket;
public static void main(String args[]) throws IOException {
try {
long initialTime = System.currentTimeMillis();
replaceSystemOutputWithSocketOutput();
System.out.println("MuleContextProcessApplication attached to log port");
System.out.println("Creating fake mule server");
String muleHomeSystemProperty = System.getProperty(MuleProperties.MULE_HOME_DIRECTORY_PROPERTY);
System.out.println("Using mule home: " + muleHomeSystemProperty);
FakeMuleServer fakeMuleServer = new FakeMuleServer(muleHomeSystemProperty, retrieveConfiguredCoreExtensions());
File appsDirectory = fakeMuleServer.getAppsDir();
System.out.println("Creating test app directory");
File applicationDirectory = new File(appsDirectory, TEST_APPLICATION_NAME);
if (!applicationDirectory.exists() && !applicationDirectory.mkdir()) {
throw new RuntimeException("Could not create test-app directory to create test application within fake mule serevr");
}
System.out.println("Test app directory created");
System.out.println("Creating app config file");
String applicationConfiguration = System.getProperty(MuleContextProcessBuilder.CONFIG_FILE_KEY);
File applicationConfigurationFile =
new File(MuleContextProcessApplication.class.getClassLoader().getResource(applicationConfiguration).getFile());
if (!applicationConfigurationFile.exists()) {
throw new RuntimeException("Could not find file for application configuration " + applicationConfiguration);
}
FileUtils.copyFile(applicationConfigurationFile, new File(applicationDirectory, DEFAULT_CONFIGURATION_RESOURCE));
System.out.println("Test app config file created");
ApplicationStartedDeploymentListener applicationStartedDeploymentListener = new ApplicationStartedDeploymentListener();
fakeMuleServer.addDeploymentListener(applicationStartedDeploymentListener);
System.out.println("Starting fake mule server");
fakeMuleServer.start();
System.out.println("Fake mule server started");
applicationStartedDeploymentListener.waitUntilApplicationDeployed();
notifyMuleContextStarted();
while (true) {
if (System.currentTimeMillis()
- initialTime > (Integer.valueOf(System.getProperty(MuleContextProcessBuilder.TIMEOUT_IN_SECONDS)) * 1000)) {
System.exit(-1);
}
Thread.sleep(1000);
}
} catch (Throwable e) {
System.out.println("Failure starting process: " + e.getMessage());
e.printStackTrace();
throw new RuntimeException(e);
} finally {
closeQuietly(logSocket);
}
}
private static List<MuleCoreExtension> retrieveConfiguredCoreExtensions() {
List<MuleCoreExtension> muleCoreExtensions = new ArrayList<MuleCoreExtension>();
String coreExtensionsProperty = System.getProperty(MULE_CORE_EXTENSIONS_PROPERTY);
if (coreExtensionsProperty != null) {
String[] coreExtensionsAsString = coreExtensionsProperty.split(",");
for (String coreExtensionClassName : coreExtensionsAsString) {
try {
muleCoreExtensions.add((MuleCoreExtension) ClassUtils.getClass(coreExtensionClassName).newInstance());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
return muleCoreExtensions;
}
private static void notifyMuleContextStarted() throws IOException {
System.out.println("About to send mule context started notification");
String commandServerPort = System.getProperty(MuleContextProcessBuilder.COMMAND_PORT_PROPERTY);
commandSocket = new Socket("localhost", Integer.valueOf(commandServerPort));
System.out.println("Connecting command client to " + commandServerPort);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(commandSocket.getOutputStream());
outputStreamWriter.write(CommandServer.MULE_CONTEXT_STARTED_COMMAND + "\n");
outputStreamWriter.flush();
System.out.println("Mule context started notification sent");
}
private static void replaceSystemOutputWithSocketOutput() throws IOException {
String tcpPortForLoggingPropertyValue = System.getProperty(MuleContextProcessBuilder.LOG_PORT_PROPERTY);
logSocket = new Socket("localhost", Integer.valueOf(tcpPortForLoggingPropertyValue));
System.setOut(new PrintStream(logSocket.getOutputStream(), true));
System.setErr(new PrintStream(logSocket.getOutputStream(), true));
}
private static void closeQuietly(Socket socket) {
try {
socket.close();
} catch (IOException e) {
// nothing to do.
}
}
}