/* Copyright (C) 2010 Mobile Sorcery AB This program is free software; you can redistribute it and/or modify it under the terms of the Eclipse Public License v1.0. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Eclipse Public License v1.0 for more details. You should have received a copy of the Eclipse Public License v1.0 along with this program. It is also available at http://www.eclipse.org/legal/epl-v10.html */ package com.mobilesorcery.sdk.profiling.emulator; import java.util.Calendar; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; import com.mobilesorcery.sdk.core.IBuildConfiguration; import com.mobilesorcery.sdk.core.IBuildVariant; import com.mobilesorcery.sdk.core.IFilter; import com.mobilesorcery.sdk.core.MergeFilter; import com.mobilesorcery.sdk.core.MoSyncProject; import com.mobilesorcery.sdk.core.ParseException; import com.mobilesorcery.sdk.core.ReverseFilter; import com.mobilesorcery.sdk.core.SLD; import com.mobilesorcery.sdk.internal.launch.EmulatorLaunchConfigurationDelegate; import com.mobilesorcery.sdk.profiling.IInvocation; import com.mobilesorcery.sdk.profiling.ProfilingPlugin; import com.mobilesorcery.sdk.profiling.IProfilingListener.ProfilingEventType; import com.mobilesorcery.sdk.profiling.filter.NameFilter; import com.mobilesorcery.sdk.profiling.filter.NameFilter.MatchType; import com.mobilesorcery.sdk.profiling.internal.ProfilingDataParser; public class EmulatorProfilingLaunchConfigurationDelegate extends EmulatorLaunchConfigurationDelegate { public static final String FD_FILTER = "func.filter"; public static final String FILE_FILTER = "file.filter"; public static final String USE_REG_EXP = "filter.reg.exp"; @Override public void launchSync(ILaunchConfiguration launchConfig, String mode, ILaunch launch, int emulatorId, IProgressMonitor monitor) throws CoreException { IProject project = getProject(launchConfig); ProfilingSession session; try { session = createProfilingSession(launchConfig); } catch (ParseException e) { throw new CoreException(new Status(IStatus.ERROR, ProfilingPlugin.PLUGIN_ID, "Invalid filter: " + e.getMessage())); } session.setLocationProvider(new DefaultLocationProvider(project)); ProfilingPlugin.getDefault().notifyProfilingListeners(ProfilingEventType.STARTED, session); super.launchSync(launchConfig, mode, launch, emulatorId, monitor); MoSyncProject mosyncProject = MoSyncProject.create(project); // At this point, we parse profiling data only post-mortem. IBuildVariant variant = getVariant(launchConfig, mode); IPath launchDir = getLaunchDir(mosyncProject, variant); IBuildConfiguration buildConfiguration = mosyncProject.getBuildConfiguration(variant.getConfigurationId()); SLD sld = mosyncProject.getSLD(buildConfiguration); IPath profilingFile = launchDir.append("fp.xml"); ProfilingDataParser parser = new ProfilingDataParser(); try { IInvocation profilingResult = parser.parse(profilingFile.toFile(), sld); session.setInvocation(profilingResult); session.setSLD(sld); session.setProfilingFile(profilingFile.toFile()); ProfilingPlugin.getDefault().notifyProfilingListeners(ProfilingEventType.STOPPED, session); } catch (Exception e) { throw new CoreException(new Status(IStatus.ERROR, ProfilingPlugin.PLUGIN_ID, "Could not parse profiling data.", e)); } } private ProfilingSession createProfilingSession(ILaunchConfiguration config) throws CoreException, ParseException { ProfilingSession session = new ProfilingSession(config.getName(), Calendar.getInstance()); session.setFilter(createProfilingFilters(config)); return session; } public static IFilter<IInvocation> createProfilingFilters(ILaunchConfiguration config) throws ParseException, CoreException { MatchType matchType = config.getAttribute(USE_REG_EXP, false) ? MatchType.REGEXP : MatchType.CONTAINS; IFilter<IInvocation> funcFilter = NameFilter.create(config.getAttribute(FD_FILTER, ""), NameFilter.Criteria.NAME, matchType, false); IFilter<IInvocation> fileFilter = NameFilter.create(config.getAttribute(FILE_FILTER, ""), NameFilter.Criteria.FILE, matchType, false); return MergeFilter.create(MergeFilter.AND, funcFilter, fileFilter); } @Override public boolean allowsExternalEmulators() { return false; } }