package org.alien4cloud.tosca.catalog;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
import org.alien4cloud.tosca.catalog.index.ArchiveIndexer;
import org.alien4cloud.tosca.model.CSARDependency;
import org.alien4cloud.tosca.model.Csar;
import org.springframework.stereotype.Component;
import com.google.common.collect.Maps;
import alien4cloud.common.AlienConstants;
import alien4cloud.component.repository.exception.CSARUsedInActiveDeployment;
import alien4cloud.component.repository.exception.ToscaTypeAlreadyDefinedInOtherCSAR;
import alien4cloud.model.components.CSARSource;
import alien4cloud.model.git.CsarDependenciesBean;
import alien4cloud.suggestions.services.SuggestionService;
import alien4cloud.tosca.context.ToscaContextual;
import alien4cloud.tosca.model.ArchiveRoot;
import alien4cloud.tosca.parser.ParsingContext;
import alien4cloud.tosca.parser.ParsingErrorLevel;
import alien4cloud.tosca.parser.ParsingException;
import alien4cloud.tosca.parser.ParsingResult;
import lombok.extern.slf4j.Slf4j;
@Component
@Slf4j
public class ArchiveUploadService {
@Inject
private ArchiveParser parser;
@Inject
private ArchiveIndexer archiveIndexer;
@Inject
private SuggestionService suggestionService;
/**
* Upload a TOSCA archive and index its components.
*
* @param path The archive path.
* @param csarSource The source of the upload.
* @return The Csar object from the parsing.
* @throws ParsingException
* @throws CSARUsedInActiveDeployment
*/
@ToscaContextual
public ParsingResult<Csar> upload(Path path, CSARSource csarSource, String workspace)
throws ParsingException, CSARUsedInActiveDeployment, ToscaTypeAlreadyDefinedInOtherCSAR {
// parse the archive.
ParsingResult<ArchiveRoot> parsingResult = parser.parseWithExistingContext(path, workspace);
final ArchiveRoot archiveRoot = parsingResult.getResult();
// check if any blocker error has been found during parsing process.
if (parsingResult.hasError(ParsingErrorLevel.ERROR)) {
// do not save anything if any blocker error has been found during import.
return ArchiveParserUtil.toSimpleResult(parsingResult);
}
archiveIndexer.importArchive(archiveRoot, csarSource, path, parsingResult.getContext().getParsingErrors());
try {
suggestionService.postProcessSuggestionFromArchive(parsingResult);
suggestionService.setAllSuggestionIdOnPropertyDefinition();
} catch (Exception e) {
log.error("Could not post process suggestion for the archive <" + archiveRoot.getArchive().getName() + "/" + archiveRoot.getArchive().getVersion()
+ ">", e);
}
return ArchiveParserUtil.toSimpleResult(parsingResult);
}
@ToscaContextual
public Map<CSARDependency, CsarDependenciesBean> preParsing(Set<Path> paths, List<ParsingResult<Csar>> parsingResults) {
Map<CSARDependency, CsarDependenciesBean> csarDependenciesBeans = Maps.newHashMap();
for (Path path : paths) {
try {
// FIXME cleanup git import archives
ParsingResult<ArchiveRoot> parsingResult = parser.parse(path, AlienConstants.GLOBAL_WORKSPACE_ID);
CsarDependenciesBean csarDepContainer = new CsarDependenciesBean();
csarDepContainer.setPath(path);
csarDepContainer
.setSelf(new CSARDependency(parsingResult.getResult().getArchive().getName(), parsingResult.getResult().getArchive().getVersion()));
csarDepContainer.setDependencies(parsingResult.getResult().getArchive().getDependencies());
csarDependenciesBeans.put(csarDepContainer.getSelf(), csarDepContainer);
} catch (ParsingException e) {
ParsingResult<Csar> failedResult = new ParsingResult<>();
failedResult.setContext(new ParsingContext(path.getFileName().toString()));
failedResult.getContext().setParsingErrors(e.getParsingErrors());
parsingResults.add(failedResult);
log.debug("Not able to parse archive, ignoring it", e);
}
}
return csarDependenciesBeans;
}
}