$xml_validator = new XML_RNGValidator();
$transformer = new User\XML\Import\MappingFileOptimusPrimeTransformer($user_manager);
$logger = new ProjectXMLImporterLogger();
$builder = new User\XML\Import\UsersToBeImportedCollectionBuilder($user_manager, $logger, $security, $xml_validator);
$console = new Log_ConsoleLogger();
try {
    $user = $user_manager->forceLogin($username);
    if (!$user->isSuperUser() && !$user->isAdmin($project_id) || !$user->isActive()) {
        throw new RuntimeException($GLOBALS['Language']->getText('project_import', 'invalid_user', array($username)));
    }
    $archive = new ZipArchive();
    if ($archive->open($archive_path) !== true) {
        $console->error("Unable to open archive {$archive_path}");
        exit(1);
    }
    $collection_from_archive = $builder->buildFromArchive($archive);
    $users_collection = $transformer->transform($collection_from_archive, $mapping_path);
    $users_collection->process($user_manager, $console);
    $user_finder = new User\XML\Import\Mapping($user_manager, $users_collection, $logger);
    $xml_importer = new ProjectXMLImporter(EventManager::instance(), ProjectManager::instance(), $xml_validator, new UGroupManager(), $user_finder, new ProjectXMLImporterLogger());
    $xml_importer->importFromArchive($project_id, $archive);
    $archive->close();
    exit(0);
} catch (XML_ParseException $exception) {
    foreach ($exception->getErrors() as $parse_error) {
        $console->error('XML: ' . $parse_error . ' line:' . $exception->getSourceXMLForError($parse_error));
    }
} catch (Exception $exception) {
    $console->error($exception->getMessage());
}
exit(1);