public void execute() {

		SimpleDateFormat sdf = new SimpleDateFormat("EEEE d MMMM yyyy 'at' h:mm a z");
		sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
		logger.info(Messages.STARTING.value());
		// logger.info(Messages.STARTING_PARAM_PROJECT.value(this.mavenProject));
		logger.info(Messages.STARTING_PARAM_REPO.value(this.repositoryPath));
		logger.info(Messages.STARTING_PARAM_DOC.value(this.documentationURL));

		RepositoryDescriptor repositoryDescriptor = locator.getDescriptor(repositoryPath);

		if (repositoryDescriptor == null) {
			logger.warn("No update site descriptor found at the specified file. Returns.");
			return;
		}

		Collections.sort(repositoryDescriptor.getCategoryDescriptors());
		for (CategoryDescriptor categoryDescriptor : repositoryDescriptor.getCategoryDescriptors()) {
			Collections.sort(categoryDescriptor.getFeatureDescriptors());
		}

		// Initializes Velocity
		VelocityEngine ve = new VelocityEngine();
		ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
		ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
		ve.init();

		// Generate index.html file using velocity template
		try {
			logger.debug(Messages.START_INDEX_GEN.value());
			File index = new File(this.pathToOutputFile.concat("index.html"));
			index.createNewFile();
			VelocityContext context = new VelocityContext();
			context.put("repositoryDescriptor", repositoryDescriptor);
			context.put("projectURL", documentationURL);
			context.put("dateNow", new Date());
			context.put("dateSite", sdf.format(new Date(repositoryDescriptor.getTimestamp())));
			context.put("version", this.version);

			String localVersion = getLocalVersion();
			if (localVersion != null) {
				context.put("localVersion", localVersion);
			}

			Template template = ve.getTemplate("index.html.vm");
			FileWriter fileWriter = new FileWriter(index);
			template.merge(context, fileWriter);
			fileWriter.close();
			logger.info(Messages.DONE_INDEX_GEN.value(index.getPath()));
		} catch (Exception e) {
			logger.error(Messages.ERROR_INDEX_GEN.value(e.getMessage()), e);
			return;
		}

		// Creates empty style.css file & generates its contents using velocity
		try {
			logger.debug(Messages.START_STYLE_GEN.value());
			File f = new File(this.pathToOutputFile.concat("style.css"));
			f.createNewFile();
			VelocityContext context = new VelocityContext();
			context.put("dateNow", new Date());
			context.put("version", this.version);

			String localVersion = getLocalVersion();
			if (localVersion != null) {
				context.put("localVersion", localVersion);
			}

			Template template = ve.getTemplate("style.css.vm");
			FileWriter fileWriter = new FileWriter(f);
			template.merge(context, fileWriter);
			fileWriter.close();
			logger.info(Messages.DONE_STYLE_GEN.value(f.getPath()));
		} catch (IOException e) {
			logger.error(Messages.ERROR_STYLE_GEN.value(e.getMessage()), e);
			return;
		}

		if (this.generateJSon) {
			try {
				logger.debug(Messages.START_JSON_GEN.value());
				File f = new File(this.pathToOutputFile.concat("index.json"));
				f.createNewFile();
				Gson gson = new GsonBuilder().setPrettyPrinting().create();
				String json = gson.toJson(repositoryDescriptor);
				FileWriter fileWriter = new FileWriter(f);
				fileWriter.write(json);
				fileWriter.close();
				logger.info(Messages.DONE_JSON_GEN.value(f.getPath()));
			} catch (IOException e) {
				logger.error(Messages.ERROR_JSON_GEN.value(e.getMessage()), e);
				return;
			}
		} else {
			logger.debug(Messages.NO_JSON_GEN.value());
		}
	}