class ContractManager implements ContractEventListener {

    public void loadBundle(ContractVersion contractVersion) {
        log.debug("LoadBundle : contractVersion={}", contractVersion);
        // step 1. exist file and download file.
        File contractFile = null;
        if (isContractFileExist(contractVersion)) {
            contractFile = new File(contractFilePath(contractVersion));
        } else {
            contractFile = Downloader.downloadContract(contractPath, contractVersion);
        }

        if (!verifyContractFile(contractFile, contractVersion)) {
            return;
        }

        // step 2. install and start
        Bundle bundle = getBundle(contractVersion);

        if (bundle == null) {
            try {
                bundle = bundleService.install(contractVersion, contractFile);
            } catch (IOException | BundleException e) {
                // Mark : throw runtime error?
                log.error("ContractFile {} failed to install with {}", contractVersion, e.getMessage());
                return;
            }
        }

        try {
            bundleService.start(contractVersion);
        } catch (BundleException e) {
            log.error("Bundle {} failed to start with {}", bundle.getSymbolicName(), e.getMessage());
            return;
        }

        // step 3. register service and injectBundle
        registerServiceMap(contractVersion, bundle);
        injectBundle(bundle);
    }

      ContractManager(GenesisBlock genesis, BundleService bundleService, DefaultConfig defaultConfig,
                    ContractStore contractStore, LogStore logStore, SystemProperties systemProperties);

}