Search in sources :

Example 1 with TemplateMetadata

use of com.thinkbiganalytics.repository.api.TemplateMetadata in project kylo by Teradata.

the class FilesystemRepositoryService method jsonToMetadata.

private TemplateMetadataWrapper jsonToMetadata(Path path, TemplateRepository repository, Optional<Set<String>> registeredTemplates) {
    try {
        TemplateMetadata templateMetaData = mapper.readValue(path.toFile(), TemplateMetadata.class);
        TemplateMetadataWrapper wrapper = new TemplateMetadataWrapper(templateMetaData);
        Path templatePath = Paths.get(repository.getLocation() + "/" + templateMetaData.getFileName());
        if (registeredTemplates.isPresent() && registeredTemplates.get().contains(templateMetaData.getTemplateName())) {
            byte[] content = ImportUtil.streamToByteArray(new FileInputStream(templatePath.toFile()));
            InputStream inputStream = new ByteArrayInputStream(content);
            ImportTemplate importTemplate = ImportUtil.openZip(templatePath.getFileName().toString(), inputStream);
            RegisteredTemplate template = importTemplate.getTemplateToImport();
            templateUpdateInfoCache.get(templateMetaData.getTemplateName(), () -> templateMetaData.isUpdateAvailable());
            // set updated flag if file is modified.
            if (templateMetaData.getLastModified() < template.getUpdateDate().getTime()) {
                String checksum = DigestUtils.md5DigestAsHex(content);
                // capturing checksum first time or it has actually changed?
                boolean templateModified = !StringUtils.equals(templateMetaData.getChecksum(), checksum);
                templateMetaData.setUpdateAvailable(templateModified);
                templateUpdateInfoCache.put(templateMetaData.getTemplateName(), templateModified);
                mapper.writerWithDefaultPrettyPrinter().writeValue(path.toFile(), templateMetaData);
                wrapper = new TemplateMetadataWrapper(templateMetaData);
            }
            if (wrapper.isUpdateAvailable()) {
                wrapper.getUpdates().addAll(template.getChangeComments());
            }
            wrapper.setInstalled(true);
        }
        wrapper.setRepository(repository);
        return wrapper;
    } catch (Exception e) {
        log.error("Error reading metadata", e);
    }
    return null;
}
Also used : Path(java.nio.file.Path) ByteArrayInputStream(java.io.ByteArrayInputStream) ByteArrayInputStream(java.io.ByteArrayInputStream) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) TemplateMetadataWrapper(com.thinkbiganalytics.repository.api.TemplateMetadataWrapper) ImportTemplate(com.thinkbiganalytics.feedmgr.service.template.importing.model.ImportTemplate) RegisteredTemplate(com.thinkbiganalytics.feedmgr.rest.model.RegisteredTemplate) TemplateMetadata(com.thinkbiganalytics.repository.api.TemplateMetadata) FileInputStream(java.io.FileInputStream)

Example 2 with TemplateMetadata

use of com.thinkbiganalytics.repository.api.TemplateMetadata in project kylo by Teradata.

the class FilesystemRepositoryService method publishTemplate.

@Override
public TemplateMetadataWrapper publishTemplate(String repositoryName, String repositoryType, String templateId, boolean overwrite) throws Exception {
    // export template
    ExportTemplate zipFile = templateExporter.exportTemplate(templateId);
    // get repository
    TemplateRepository repository = getRepositoryByNameAndType(repositoryName, repositoryType);
    // Check if template already exists
    Optional<TemplateMetadataWrapper> foundMetadataOpt = Optional.empty();
    for (TemplateMetadataWrapper item : listTemplatesByRepository(repository)) {
        if (item.getTemplateName().equals(zipFile.getTemplateName())) {
            foundMetadataOpt = Optional.of(item);
            break;
        }
    }
    if (foundMetadataOpt.isPresent()) {
        if (!overwrite) {
            throw new UnsupportedOperationException("Template with same name already exists.");
        }
        log.info("Overwriting template with same name.");
    }
    String digest = DigestUtils.md5DigestAsHex(zipFile.getFile());
    Path templatePath = Paths.get(repository.getLocation() + "/" + zipFile.getFileName());
    TemplateMetadata metadata = new TemplateMetadata(zipFile.getTemplateName(), zipFile.getDescription(), zipFile.getFileName().toString(), digest, zipFile.isStream(), false, templatePath.toFile().lastModified());
    // create repositoryItem
    TemplateMetadataWrapper templateMetadata = foundMetadataOpt.isPresent() ? foundMetadataOpt.get() : new TemplateMetadataWrapper(metadata);
    String baseName = FilenameUtils.getBaseName(templateMetadata.getFileName());
    // write file in first of templateLocations
    Files.write(templatePath, zipFile.getFile());
    log.info("Finished publishing template {} to repository {}.", templateMetadata.getTemplateName(), repository.getName());
    return new TemplateMetadataWrapper(metadata);
}
Also used : Path(java.nio.file.Path) TemplateRepository(com.thinkbiganalytics.repository.api.TemplateRepository) TemplateMetadataWrapper(com.thinkbiganalytics.repository.api.TemplateMetadataWrapper) ExportTemplate(com.thinkbiganalytics.metadata.api.template.export.ExportTemplate) TemplateMetadata(com.thinkbiganalytics.repository.api.TemplateMetadata)

Example 3 with TemplateMetadata

use of com.thinkbiganalytics.repository.api.TemplateMetadata in project kylo by Teradata.

the class FilesystemRepositoryServiceTest method testPublishTemplate_ExistingTemplate_OverwriteFalse.

@Test(expected = UnsupportedOperationException.class)
public void testPublishTemplate_ExistingTemplate_OverwriteFalse() throws Exception {
    ExportTemplate template = new ExportTemplate("testFile", "testTemplate", "testDesc", false, new byte[0]);
    TemplateMetadata existingTemplate = new TemplateMetadata("testTemplate", "testDesc", "xyz.zip", false);
    List<TemplateMetadataWrapper> templates = new ArrayList<>();
    templates.add(new TemplateMetadataWrapper(existingTemplate));
    when(templateExporter.exportTemplate(anyString())).thenReturn(template);
    FilesystemRepositoryService spy = PowerMockito.spy(filesystemRepositoryService);
    doReturn(repository).when(spy, "getRepositoryByNameAndType", anyString(), anyString());
    doReturn(templates).when(spy, "listTemplatesByRepository", repository);
    spy.publishTemplate("test", "test", "test", false);
    PowerMockito.verifyStatic(never());
    FilenameUtils.getBaseName(anyString());
}
Also used : TemplateMetadataWrapper(com.thinkbiganalytics.repository.api.TemplateMetadataWrapper) ArrayList(java.util.ArrayList) ExportTemplate(com.thinkbiganalytics.metadata.api.template.export.ExportTemplate) TemplateMetadata(com.thinkbiganalytics.repository.api.TemplateMetadata) PrepareForTest(org.powermock.core.classloader.annotations.PrepareForTest) Test(org.junit.Test) SpringBootTest(org.springframework.boot.test.context.SpringBootTest)

Example 4 with TemplateMetadata

use of com.thinkbiganalytics.repository.api.TemplateMetadata in project kylo by Teradata.

the class FilesystemRepositoryService method importTemplate.

@Override
public ImportTemplate importTemplate(String repositoryName, String repositoryType, String fileName, String uploadKey, String importComponents) throws Exception {
    Optional<TemplateRepository> repository = listRepositories().stream().filter(r -> StringUtils.equals(r.getName(), repositoryName) && StringUtils.equals(r.getType().getKey(), repositoryType)).findFirst();
    Path filePath = Paths.get(repository.get().getLocation() + "/" + fileName);
    if (!filePath.toFile().exists()) {
        throw new RuntimeException("Unable to find template file to import: " + fileName);
    }
    log.info("Begin template import {}", fileName);
    ImportTemplateOptions options = new ImportTemplateOptions();
    options.setUploadKey(uploadKey);
    byte[] content = ImportUtil.streamToByteArray(new FileInputStream(filePath.toFile()));
    String checksum = DigestUtils.md5DigestAsHex(content);
    uploadProgressService.newUpload(uploadKey);
    ImportTemplate importTemplate = null;
    TemplateImporter templateImporter = null;
    if (importComponents == null) {
        templateImporter = templateImporterFactory.apply(fileName, content, options);
        importTemplate = templateImporter.validate();
        importTemplate.setSuccess(false);
    } else {
        options.setImportComponentOptions(ObjectMapperSerializer.deserialize(importComponents, new TypeReference<Set<ImportComponentOption>>() {
        }));
        templateImporter = templateImporterFactory.apply(fileName, content, options);
        importTemplate = templateImporter.validateAndImport();
    }
    log.info("End template import {} - {}", fileName, importTemplate.isSuccess());
    // update template metadata
    String baseName = FilenameUtils.getBaseName(fileName);
    Path metadataPath = Paths.get(repository.get().getLocation() + "/" + baseName + ".json");
    TemplateMetadata templateMetadata = mapper.readValue(metadataPath.toFile(), TemplateMetadata.class);
    templateMetadata.setChecksum(checksum);
    long updateTime = importTemplate.getTemplateToImport().getUpdateDate().getTime();
    templateMetadata.setLastModified(updateTime);
    templateMetadata.setUpdateAvailable(false);
    mapper.writer(new DefaultPrettyPrinter()).writeValue(metadataPath.toFile(), templateMetadata);
    log.info("Generated checksum for {} - {}", templateMetadata.getTemplateName(), checksum);
    templateUpdateInfoCache.put(templateMetadata.getTemplateName(), false);
    return importTemplate;
}
Also used : UploadProgressService(com.thinkbiganalytics.feedmgr.service.UploadProgressService) RegisteredTemplateService(com.thinkbiganalytics.feedmgr.service.template.RegisteredTemplateService) LoggerFactory(org.slf4j.LoggerFactory) Autowired(org.springframework.beans.factory.annotation.Autowired) TemplateImporter(com.thinkbiganalytics.feedmgr.service.template.importing.TemplateImporter) StringUtils(org.apache.commons.lang3.StringUtils) TemplateChangeEvent(com.thinkbiganalytics.metadata.api.event.template.TemplateChangeEvent) ObjectMapperSerializer(com.thinkbiganalytics.json.ObjectMapperSerializer) ByteArrayInputStream(java.io.ByteArrayInputStream) ImportUtil(com.thinkbiganalytics.feedmgr.util.ImportUtil) TemplateSearchFilter(com.thinkbiganalytics.repository.api.TemplateSearchFilter) TypeReference(com.fasterxml.jackson.core.type.TypeReference) MetadataAccess(com.thinkbiganalytics.metadata.api.MetadataAccess) Path(java.nio.file.Path) RepositoryService(com.thinkbiganalytics.repository.api.RepositoryService) ResourceLoader(org.springframework.core.io.ResourceLoader) ImportTemplate(com.thinkbiganalytics.feedmgr.service.template.importing.model.ImportTemplate) MetadataEventListener(com.thinkbiganalytics.metadata.api.event.MetadataEventListener) FILESYSTEM(com.thinkbiganalytics.repository.api.TemplateRepository.RepositoryType.FILESYSTEM) Set(java.util.Set) MetadataEventService(com.thinkbiganalytics.metadata.api.event.MetadataEventService) Collectors(java.util.stream.Collectors) ExportTemplate(com.thinkbiganalytics.metadata.api.template.export.ExportTemplate) List(java.util.List) Principal(java.security.Principal) Stream(java.util.stream.Stream) PostConstruct(javax.annotation.PostConstruct) ImportTemplateOptions(com.thinkbiganalytics.feedmgr.rest.model.ImportTemplateOptions) Optional(java.util.Optional) TemplateChange(com.thinkbiganalytics.metadata.api.event.template.TemplateChange) FilenameUtils(org.apache.commons.io.FilenameUtils) SearchResultImpl(com.thinkbiganalytics.rest.model.search.SearchResultImpl) TemplateComparator.valueOf(com.thinkbiganalytics.repository.api.TemplateSearchFilter.TemplateComparator.valueOf) DigestUtils(org.springframework.util.DigestUtils) PropertySource(org.springframework.context.annotation.PropertySource) Scheduled(org.springframework.scheduling.annotation.Scheduled) TemplateMetadataWrapper(com.thinkbiganalytics.repository.api.TemplateMetadataWrapper) ArrayList(java.util.ArrayList) Value(org.springframework.beans.factory.annotation.Value) HashSet(java.util.HashSet) Inject(javax.inject.Inject) TemplateRepository(com.thinkbiganalytics.repository.api.TemplateRepository) TemplateModelTransform(com.thinkbiganalytics.feedmgr.service.template.TemplateModelTransform) Service(org.springframework.stereotype.Service) DefaultPrettyPrinter(com.fasterxml.jackson.core.util.DefaultPrettyPrinter) MetadataChange(com.thinkbiganalytics.metadata.api.event.MetadataChange) RegisteredTemplate(com.thinkbiganalytics.feedmgr.rest.model.RegisteredTemplate) TemplateImporterFactory(com.thinkbiganalytics.feedmgr.service.template.importing.TemplateImporterFactory) NAME(com.thinkbiganalytics.repository.api.TemplateSearchFilter.TemplateComparator.NAME) Logger(org.slf4j.Logger) Files(java.nio.file.Files) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) TemplateExporter(com.thinkbiganalytics.metadata.api.template.export.TemplateExporter) FileInputStream(java.io.FileInputStream) SearchResult(com.thinkbiganalytics.rest.model.search.SearchResult) TemplateMetadata(com.thinkbiganalytics.repository.api.TemplateMetadata) Paths(java.nio.file.Paths) Cache(com.google.common.cache.Cache) Comparator(java.util.Comparator) Collections(java.util.Collections) ImportComponentOption(com.thinkbiganalytics.feedmgr.rest.model.ImportComponentOption) InputStream(java.io.InputStream) Path(java.nio.file.Path) DefaultPrettyPrinter(com.fasterxml.jackson.core.util.DefaultPrettyPrinter) TemplateRepository(com.thinkbiganalytics.repository.api.TemplateRepository) ImportTemplateOptions(com.thinkbiganalytics.feedmgr.rest.model.ImportTemplateOptions) ImportComponentOption(com.thinkbiganalytics.feedmgr.rest.model.ImportComponentOption) ImportTemplate(com.thinkbiganalytics.feedmgr.service.template.importing.model.ImportTemplate) FileInputStream(java.io.FileInputStream) TemplateImporter(com.thinkbiganalytics.feedmgr.service.template.importing.TemplateImporter) TypeReference(com.fasterxml.jackson.core.type.TypeReference) TemplateMetadata(com.thinkbiganalytics.repository.api.TemplateMetadata)

Example 5 with TemplateMetadata

use of com.thinkbiganalytics.repository.api.TemplateMetadata in project kylo by Teradata.

the class RepositoryMonitor method createMetadata.

private void createMetadata(Path templateFilePath, Map<String, RegisteredTemplate> registeredTemplateMap) {
    RegisteredTemplate tmplt = null;
    try {
        File templateZipFile = templateFilePath.toFile();
        byte[] content = ImportUtil.streamToByteArray(new FileInputStream(templateZipFile));
        InputStream inputStream = new ByteArrayInputStream(content);
        ImportTemplate importTemplate = ImportUtil.openZip(templateFilePath.getFileName().toString(), inputStream);
        tmplt = importTemplate.getTemplateToImport();
        File json = getMetadataFileName(templateFilePath).toFile();
        String checksum = DigestUtils.md5DigestAsHex(content);
        boolean updateAvailable = false;
        TemplateMetadata metadata = new TemplateMetadata(tmplt.getTemplateName(), tmplt.getDescription(), templateFilePath.getFileName().toString(), checksum, tmplt.isStream(), updateAvailable, tmplt.getUpdateDate().getTime());
        // startup or new template is published
        if (!json.exists()) {
            if (registeredTemplateMap.containsKey(tmplt.getTemplateName())) {
                final String templateName = tmplt.getTemplateName();
                ExportTemplate zipFile = metadataAccess.read(() -> {
                    this.accessController.checkPermission(AccessController.SERVICES, FeedServicesAccessControl.ACCESS_TEMPLATES);
                    return templateExporter.exportTemplate(registeredTemplateMap.get(templateName).getId());
                }, MetadataAccess.SERVICE);
                String digest = DigestUtils.md5DigestAsHex(zipFile.getFile());
                updateAvailable = !StringUtils.equals(checksum, digest);
                metadata.setUpdateAvailable(updateAvailable);
                templateUpdateInfoCache.put(templateName, updateAvailable);
            }
        } else {
            // if registered template was updated
            metadata = mapper.readValue(json, TemplateMetadata.class);
            templateUpdateInfoCache.put(tmplt.getTemplateName(), metadata.isUpdateAvailable());
            if (metadata.getLastModified() >= tmplt.getUpdateDate().getTime()) {
                return;
            }
            if (StringUtils.equals(metadata.getChecksum(), checksum)) {
                return;
            }
            metadata.setUpdateAvailable(true);
            templateUpdateInfoCache.put(tmplt.getTemplateName(), true);
        }
        log.info("Writing template metadata for {}.", tmplt.getTemplateName());
        mapper.writerWithDefaultPrettyPrinter().writeValue(json, metadata);
    } catch (Exception e) {
        log.error("Error occurred trying to generate template metadata.", e);
        if (tmplt != null) {
            templateUpdateInfoCache.invalidate(tmplt.getTemplateName());
        }
    }
}
Also used : ByteArrayInputStream(java.io.ByteArrayInputStream) ByteArrayInputStream(java.io.ByteArrayInputStream) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) RegisteredTemplate(com.thinkbiganalytics.feedmgr.rest.model.RegisteredTemplate) ImportTemplate(com.thinkbiganalytics.feedmgr.service.template.importing.model.ImportTemplate) File(java.io.File) FileInputStream(java.io.FileInputStream) TemplateMetadata(com.thinkbiganalytics.repository.api.TemplateMetadata) ExportTemplate(com.thinkbiganalytics.metadata.api.template.export.ExportTemplate)

Aggregations

TemplateMetadata (com.thinkbiganalytics.repository.api.TemplateMetadata)5 ExportTemplate (com.thinkbiganalytics.metadata.api.template.export.ExportTemplate)4 TemplateMetadataWrapper (com.thinkbiganalytics.repository.api.TemplateMetadataWrapper)4 RegisteredTemplate (com.thinkbiganalytics.feedmgr.rest.model.RegisteredTemplate)3 ImportTemplate (com.thinkbiganalytics.feedmgr.service.template.importing.model.ImportTemplate)3 ByteArrayInputStream (java.io.ByteArrayInputStream)3 FileInputStream (java.io.FileInputStream)3 InputStream (java.io.InputStream)3 Path (java.nio.file.Path)3 TemplateRepository (com.thinkbiganalytics.repository.api.TemplateRepository)2 TypeReference (com.fasterxml.jackson.core.type.TypeReference)1 DefaultPrettyPrinter (com.fasterxml.jackson.core.util.DefaultPrettyPrinter)1 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 Cache (com.google.common.cache.Cache)1 ImportComponentOption (com.thinkbiganalytics.feedmgr.rest.model.ImportComponentOption)1 ImportTemplateOptions (com.thinkbiganalytics.feedmgr.rest.model.ImportTemplateOptions)1 UploadProgressService (com.thinkbiganalytics.feedmgr.service.UploadProgressService)1 RegisteredTemplateService (com.thinkbiganalytics.feedmgr.service.template.RegisteredTemplateService)1 TemplateModelTransform (com.thinkbiganalytics.feedmgr.service.template.TemplateModelTransform)1 TemplateImporter (com.thinkbiganalytics.feedmgr.service.template.importing.TemplateImporter)1