/**
   * Install module to selected server
   *
   * @param serverId
   * @param groupId
   * @param artifactId
   * @param version
   * @throws MojoExecutionException
   * @throws MojoFailureException
   */
  public void installModule(String serverId, String groupId, String artifactId, String version)
      throws MojoExecutionException, MojoFailureException {
    AttributeHelper helper = new AttributeHelper(prompter);
    if (serverId == null) {
      File currentProperties = helper.getCurrentServerPath();
      if (currentProperties != null) serverId = currentProperties.getName();
    }
    File serverPath = helper.getServerPath(serverId);
    Artifact artifact = getArtifactForSelectedParameters(helper, groupId, artifactId, version);
    String originalId = artifact.getArtifactId();
    artifact.setArtifactId(artifact.getArtifactId() + "-omod");
    File modules = new File(serverPath, SDKConstants.OPENMRS_SERVER_MODULES);
    modules.mkdirs();
    Element[] artifactItems = new Element[1];
    artifactItems[0] = artifact.toElement(modules.getPath());
    File[] listOfModules = modules.listFiles();
    boolean versionUpdated = false;
    boolean removed = false;
    for (File itemModule : listOfModules) {
      String[] parts = itemModule.getName().split("-");
      String oldV = StringUtils.join(Arrays.copyOfRange(parts, 1, parts.length), "-");
      if (originalId.equals(parts[0])) {
        try {
          Version oldVersion = new Version(oldV.substring(0, oldV.lastIndexOf('.')));
          Version newVersion = new Version(artifact.getVersion());
          if (oldVersion.higher(newVersion)) {
            throw new MojoExecutionException(
                String.format(TEMPLATE_DOWNGRADE, oldVersion.toString(), newVersion.toString()));
          } else if (oldVersion.lower(newVersion)) {
            boolean agree =
                helper.dialogYesNo(String.format(TEMPLATE_UPDATE, artifact.getVersion()));
            if (!agree) {
              return;
            }
          }
          versionUpdated = true;
          removed = itemModule.delete();
          break;

        } catch (PrompterException e) {
          throw new MojoExecutionException(e.getMessage());
        }
      }
    }
    executeMojo(
        plugin(
            groupId(SDKConstants.PLUGIN_DEPENDENCIES_GROUP_ID),
            artifactId(SDKConstants.PLUGIN_DEPENDENCIES_ARTIFACT_ID),
            version(SDKConstants.PLUGIN_DEPENDENCIES_VERSION)),
        goal("copy"),
        configuration(element(name("artifactItems"), artifactItems)),
        executionEnvironment(mavenProject, mavenSession, pluginManager));
    PropertyManager properties =
        new PropertyManager(new File(serverPath, SDKConstants.OPENMRS_SERVER_PROPERTIES).getPath());
    String[] params = {artifact.getGroupId(), originalId, artifact.getVersion()};
    String module = StringUtils.join(params, "/");
    properties.addToValueList(SDKConstants.PROPERTY_USER_MODULES, module);
    properties.apply();
    if (versionUpdated) {
      if (removed)
        getLog().info(String.format(DEFAULT_UPDATE_MESSAGE, originalId, artifact.getVersion()));
    } else getLog().info(String.format(DEFAULT_OK_MESSAGE, originalId));
  }