/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.api.project.server.template; import com.google.inject.Inject; import org.eclipse.che.api.project.templates.shared.dto.ProjectTemplateDescriptor; import org.eclipse.che.dto.server.DtoFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.PostConstruct; import javax.inject.Named; import javax.inject.Singleton; import javax.validation.constraints.NotNull; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; /** * Reads project template descriptions that may be described in separate json-files for every project type. This file should be named as * <project_type_id>.json. * * @author Artem Zatsarynnyi * @author Dmitry Shnurenko */ @Singleton public class ProjectTemplateDescriptionLoader { private static final Logger LOG = LoggerFactory.getLogger(ProjectTemplateRegistry.class); private final String templateDescriptionLocationDir; private final ProjectTemplateRegistry templateRegistry; /** * @param templateDescriptionLocationDir * Describes value which is a path the directory with template descriptors (not sources). * @param templateRegistry * registry which contains templates associated with tags */ @Inject public ProjectTemplateDescriptionLoader(@Named("che.template.storage") String templateDescriptionLocationDir, ProjectTemplateRegistry templateRegistry) { this.templateDescriptionLocationDir = templateDescriptionLocationDir; this.templateRegistry = templateRegistry; } @PostConstruct public void start() { if (templateDescriptionLocationDir == null || !Files.exists(Paths.get(templateDescriptionLocationDir)) || !Files.isDirectory(Paths.get(templateDescriptionLocationDir))) { LOG.error(getClass() + " The configuration of project templates descriptors wasn't found or some problem with configuration was found."); } else { load(Paths.get(templateDescriptionLocationDir)); } } private void load(@NotNull Path dirPath) { File templatesFolder = new File(dirPath.toString()); File[] files = templatesFolder.listFiles(); if (files == null) { LOG.error(getClass() + " The folder " + dirPath + "doesn't contain any template files."); return; } for (File file : files) { if (file.isDirectory()) { continue; } try (InputStream inputStream = new FileInputStream(file)) { resolveTemplate(inputStream); } catch (IOException exception) { LOG.error(getClass() + " Can't read file " + file.getPath()); } } } private void resolveTemplate(InputStream stream) throws IOException { final List<ProjectTemplateDescriptor> templates = DtoFactory.getInstance().createListDtoFromJson(stream, ProjectTemplateDescriptor.class); for (ProjectTemplateDescriptor template : templates) { templateRegistry.register(template.getTags(), template); } } }