code: public void installAssets(Collection<String> assetIds, File fromDir, RepositoryConnectionList loginInfo) throws InstallException {
          this.installAssets = new ArrayList<List<InstallAsset>>();
          ArrayList<InstallAsset> installAssets = new ArrayList<InstallAsset>();
          ArrayList<String> unresolvedFeatures = new ArrayList<String>();
          Collection<ESAAsset> autoFeatures = getResolveDirector().getAutoFeature(fromDir, InstallConstants.TO_USER);
          getResolveDirector().resolve(assetIds, fromDir, InstallConstants.TO_USER, false, installAssets, unresolvedFeatures);
          if (!unresolvedFeatures.isEmpty()) {
              log(Level.FINEST, "installAssets() determined unresolved features: " + unresolvedFeatures.toString() + " from " + fromDir.getAbsolutePath());
              installAssets(unresolvedFeatures, loginInfo);
          }
          if (!installAssets.isEmpty()) {
              getResolveDirector().resolveAutoFeatures(autoFeatures, installAssets);
              this.installAssets.add(installAssets);
          }
          if (this.installAssets.isEmpty()) {
              throw ExceptionUtils.createByKey(InstallException.ALREADY_EXISTS, "ASSETS_ALREADY_INSTALLED", assetIds.toString());
          }
      }
docs: Installs the specified assets from a specific directory
  
  @param assetIds Collection of assetIds to install
  @param fromDir Directory to get assets from
  @param loginInfo RepositoryConnectionList to obtain unresolved features
  @throws InstallException