blob: abc8dfbc8e7bc15395acc8f0229fa6f29ccd92f5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Martin Kloesch 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:
* Martin Kloesch - initial API and implementation
*******************************************************************************/
package org.eclipse.ease.lang.python.debugger;
import java.io.File;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import org.eclipse.ease.Script;
import org.eclipse.ease.debugging.ScriptRegistry;
/**
* Default implementation of {@link IPythonScriptRegistry} simply using maps to perform 1:1 mapping.
*/
public class PythonScriptRegistry extends ScriptRegistry implements IPythonScriptRegistry {
/** List of framework files that should be ignored by script registry. */
private static final List<String> IGNORED_FILES = Arrays.asList(new String[] { "cp1252.py", "bdb.py", "ast.py", "threading.py" });
/** Lookup from {@link Script} in EASE world to {@link String} in Python world */
private final Map<Script, String> fScriptMap = new HashMap<>();
/** Reverse lookup from {@link String} in Python world to {@link Script} in EASE world */
private final Map<String, Script> fStringMap = new HashMap<>();
@Override
public void put(Script script) {
// IResource <-> Script mapping
super.put(script);
// Script <-> String mapping
final String reference = uid(script);
fStringMap.put(reference, script);
fScriptMap.put(script, reference);
}
@Override
public Script getScript(String reference) {
Script script = fStringMap.get(reference);
if (script == null) {
final File file = new File(reference);
if (file.exists()) {
if (!IGNORED_FILES.contains(file.getName())) {
script = new Script(file);
put(script);
}
}
}
return script;
}
@Override
public String getReference(Script script) {
return fScriptMap.get(script);
}
/**
* Creates a unique reference identifier for the given script.
*
* @param script
* Script to get unique identifier for.
* @return Unique identifer for script.
*/
private String uid(final Script script) {
final Set<String> existingKeys = fStringMap.keySet();
final StringBuilder buffer = new StringBuilder("__ref_");
buffer.append(script.isDynamic() ? "dyn" : script.getCommand().toString());
buffer.append("_");
for (int index = 0; index < 10; index++)
buffer.append((char) ('a' + new Random().nextInt(26)));
if (existingKeys.contains(buffer.toString()))
return uid(script);
return buffer.toString();
}
}