protected synchronized @Override Module retrieveModule(final String locator, final long revision)
	throws StorageException {
		// bottleneck alert: the file storage implementation is not really meant for multithreading use
		assert (locator != null): "Supplied locator is null";
		assert (!"".equals(locator)): "No storage for a proof module";
		if (revision != -1) {
			logger.error("File based storage does not support versioning");
			logger.debug("Supplied locator:        " + locator);
			logger.debug("Supplied version number: " + revision);
			throw new StorageException("File based storage does not support versioning");
		}
		Module interfaceModule;
		try {
			interfaceModule = DataFactory.getInstance().createInterface(locator, revision);
		} catch (DataException e) {
			final AssertionError err = new AssertionError("Bad revision number. This cannot happen");
			err.initCause(e);
			throw err;
		}
		try {
			String fileName = fileName(locator);
			logger.debug("file name is " + fileName);
			final InputStream interfaceFile = WikiInputStream.create(fileName);
			final TokenFeed tokenFeed = ScannerFactory.getInstance()
				.createTokenFeed(interfaceFile);
			CommandFactory.getInstance().processCommands(interfaceModule, tokenFeed);
		} catch (ScannerException e) {
			logger.error("Scanner error while scanning interface " + locator, e);
			logger.debug("Scanner context: " + e.getScanner().getContextString());
			throw new StorageException("Scanner error while scanning interface", e);
		} catch (CommandException e) {
			logger.error("Command failed to execute while loading interface " + locator, e);
			throw new StorageException("Command failed to execute while loading interface", e);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return interfaceModule;
	}