/*******************************************************************************
* Copyright (c) 2017 Rogue Wave Software 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:
* Rogue Wave Software Inc. - initial implementation
*******************************************************************************/
package org.eclipse.php.profile.core.engine;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.php.debug.core.debugger.IDebugHandler;
import org.eclipse.php.internal.debug.core.zend.debugger.CodeCoverageData;
import org.eclipse.php.internal.debug.core.zend.debugger.DebugError;
import org.eclipse.php.internal.debug.core.zend.debugger.IRemoteDebugger;
import org.eclipse.php.internal.debug.core.zend.model.ServerDebugHandler;
import org.eclipse.php.profile.core.PHPProfileCoreMessages;
import org.eclipse.php.profile.core.PHPProfileCorePlugin;
import org.eclipse.php.profile.core.data.ProfilerCallTrace;
import org.eclipse.php.profile.core.data.ProfilerData;
import org.eclipse.php.profile.core.data.ProfilerFileData;
import org.eclipse.php.profile.core.data.ProfilerGlobalData;
/**
* Debug handler implementation for Zend profiler.
*/
public class ZProfiler extends ServerDebugHandler implements IProfiler, IDebugHandler {
private ProfilerDBManager fDBManager;
private String fAdditionalOptions = ""; //$NON-NLS-1$
private boolean fParsingErrorOccurred;
/*
* (non-Javadoc)
*
* @see com.zend.php.debug.core.debugger.AdvancedDebugHandler#
* createRemoteDebugger ()
*/
protected IRemoteDebugger createRemoteDebugger() {
return new ZRemoteProfiler(this, fDebugConnection);
}
public ProfilerDB getProfilerDB() {
return fDBManager;
}
/*
* (non-Javadoc)
*
* @see com.zend.php.profile.core.profiler.IProfiler#getProfilerGlobalData()
*/
public ProfilerGlobalData getProfilerGlobalData() {
ZRemoteProfiler remoteProfiler = (ZRemoteProfiler) getRemoteDebugger();
return remoteProfiler.getProfilerGlobalData();
}
/*
* (non-Javadoc)
*
* @see
* com.zend.php.profile.core.profiler.IProfiler#getProfilerFileData(int)
*/
public ProfilerFileData getProfilerFileData(int fileNumber) {
ZRemoteProfiler remoteProfiler = (ZRemoteProfiler) getRemoteDebugger();
return remoteProfiler.getProfilerFileData(fileNumber);
}
/*
* (non-Javadoc)
*
* @see com.zend.php.profile.core.profiler.IProfiler#getProfilerCallTrace()
*/
public ProfilerCallTrace getProfilerCallTrace() {
ZRemoteProfiler remoteProfiler = (ZRemoteProfiler) getRemoteDebugger();
return remoteProfiler.getProfilerCallTrace();
}
/*
* (non-Javadoc)
*
* @see com.zend.php.profile.core.profiler.IProfiler#getProfilerData()
*/
public ProfilerData getProfilerData() {
ZRemoteProfiler remoteProfiler = (ZRemoteProfiler) getRemoteDebugger();
return remoteProfiler.getProfilerData();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.php.internal.debug.core.debugger.IDebugHandler#
* handleScriptEnded ()
*/
public void handleScriptEnded() {
try {
if (fParsingErrorOccurred) {
super.handleScriptEnded();
} else {
Job profileJob = new Job(PHPProfileCoreMessages.ZProfiler_0) {
@Override
protected IStatus run(IProgressMonitor monitor) {
if (!monitor.isCanceled()) {
try {
fDBManager = new ProfilerDBManager(new DefaultProfilerDB(ZProfiler.this));
ProfilerGlobalData globalData = fDBManager.getGlobalData();
if (globalData != null) {
globalData.setOptions(fAdditionalOptions);
}
} finally {
monitor.done();
}
}
return Status.OK_STATUS;
}
};
profileJob.schedule();
profileJob.join();
// Call super
super.handleScriptEnded();
if (fDBManager.getGlobalData() != null) {
CodeCoverageData[] codeCoverageData = getLastCodeCoverageData();
if (codeCoverageData != null) {
for (int i = 0; i < codeCoverageData.length; ++i) {
ProfilerFileData fileData = fDBManager.getFileData(codeCoverageData[i].getFileName());
if (fileData != null) {
fileData.setCodeCoverageData(codeCoverageData[i]);
}
}
}
ProfileSessionsManager.addSession(fDBManager);
}
}
} catch (Exception e) {
PHPProfileCorePlugin.log(e);
} finally {
getDebugTarget().terminated();
}
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.php.internal.debug.core.debugger.IDebugHandler#sessionStarted
* (java.lang.String, java.lang.String, java.lang.String, java.lang.String)
*/
public void sessionStarted(String fileName, String uri, String query, String options) {
super.sessionStarted(fileName, uri, query, options);
fParsingErrorOccurred = false;
}
/*
* (non-Javadoc)
*
* @seeorg.eclipse.php.internal.debug.core.model.ServerDebugHandler#
* parsingErrorOccured
* (org.eclipse.php.internal.debug.core.debugger.DebugError)
*/
public void parsingErrorOccured(DebugError debugError) {
if (DebugError.isError(debugError)) {
fParsingErrorOccurred = true;
}
super.parsingErrorOccured(debugError);
}
}