// ============================================================================ // // Copyright (C) 2006-2016 Talend Inc. - www.talend.com // // This source code is available under agreement available at // %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt // // You should have received a copy of the agreement // along with this program; if not, write to Talend SA // 9 rue Pages 92150 Suresnes, France // // ============================================================================ package org.talend.dataprofiler.core.ui.imex.model; import java.io.File; import java.util.HashMap; import java.util.List; import java.util.regex.Pattern; import org.apache.commons.lang.ArrayUtils; import org.apache.log4j.Logger; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.emf.ecore.util.EcoreUtil; import org.junit.Assert; import org.junit.Test; import org.talend.commons.emf.EMFUtil; import org.talend.commons.exception.PersistenceException; import org.talend.commons.utils.WorkspaceUtils; import org.talend.core.context.Context; import org.talend.core.context.RepositoryContext; import org.talend.core.language.ECodeLanguage; import org.talend.core.model.general.Project; import org.talend.core.model.properties.Property; import org.talend.core.model.properties.Status; import org.talend.core.model.properties.User; import org.talend.core.model.properties.helper.StatusHelper; import org.talend.core.model.repository.ERepositoryObjectType; import org.talend.core.repository.constants.FileConstants; import org.talend.core.repository.model.IRepositoryFactory; import org.talend.core.repository.model.ProxyRepositoryFactory; import org.talend.core.repository.model.RepositoryFactoryProvider; import org.talend.core.repository.utils.ProjectHelper; import org.talend.core.repository.utils.XmiResourceManager; import org.talend.core.runtime.CoreRuntimePlugin; import org.talend.dataprofiler.core.exception.ExceptionHandler; import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl; import org.talend.dataprofiler.core.manager.DQStructureManager; import org.talend.dataquality.analysis.Analysis; import org.talend.dataquality.analysis.AnalysisContext; import org.talend.dataquality.analysis.AnalysisFactory; import org.talend.dataquality.analysis.AnalysisResult; import org.talend.dataquality.indicators.IndicatorsFactory; import org.talend.dataquality.indicators.NullCountIndicator; import org.talend.dataquality.indicators.RowCountIndicator; import org.talend.dataquality.indicators.definition.DefinitionFactory; import org.talend.dataquality.indicators.definition.IndicatorDefinition; import org.talend.dataquality.properties.PropertiesFactory; import org.talend.dataquality.properties.TDQAnalysisItem; import org.talend.dataquality.properties.TDQIndicatorDefinitionItem; import org.talend.dq.helper.PropertyHelper; import org.talend.dq.writer.impl.AnalysisWriter; import org.talend.dq.writer.impl.ElementWriterFactory; import org.talend.model.bridge.ReponsitoryContextBridge; import org.talend.repository.ProjectManager; import org.talend.repository.model.RepositoryConstants; import org.talend.utils.sugars.ReturnCode; /** * DOC talend class global comment. Detailled comment */ public class ItemRecordTest { private Logger log = Logger.getLogger(ItemRecordTest.class); /** * Test method for {@link org.talend.dataprofiler.core.ui.imex.model.ItemRecord#loadProperty()}. * * @throws PersistenceException */ @Test public void testLoadProperty() throws PersistenceException { chooseRightProject(); Property analysisProperty = createAnalysis("ItemRecordTestanalysis1"); //$NON-NLS-1$ TDQAnalysisItem item = (TDQAnalysisItem) analysisProperty.getItem(); Analysis analysis = item.getAnalysis(); AnalysisResult createAnalysisResult = analysis.getResults(); Assert.assertEquals(0, createAnalysisResult.getIndicators().size()); // create Indicator RowCountIndicator rowCountIndicator = IndicatorsFactory.eINSTANCE.createRowCountIndicator(); String rowCountPropertyID = EcoreUtil.generateUUID(); saveIndicatorDefintion(rowCountPropertyID, "ItemRecordWithRefreshedTestIndicatorDefinition1"); //$NON-NLS-1$ rowCountIndicator.setIndicatorDefinition(((TDQIndicatorDefinitionItem) ProxyRepositoryFactory.getInstance() .getLastVersion(rowCountPropertyID).getProperty().getItem()).getIndicatorDefinition()); Assert.assertNotNull("Row count indicator definition should not be null", rowCountIndicator.getIndicatorDefinition()); //$NON-NLS-1$ Assert.assertEquals( "ItemRecordWithRefreshedTestIndicatorDefinition1", rowCountIndicator.getIndicatorDefinition().getLabel()); //$NON-NLS-1$ createAnalysisResult.getIndicators().add(rowCountIndicator); Assert.assertEquals(1, createAnalysisResult.getIndicators().size()); ReturnCode saveAnalysis = saveAnalysis(analysis); Assert.assertEquals(1, ((TDQAnalysisItem) analysisProperty.getItem()).getAnalysis().getResults().getIndicators().size()); Assert.assertTrue("The analysis first time saving is not work", saveAnalysis.isOk()); //$NON-NLS-1$ File analysisFile = WorkspaceUtils.ifileToFile(PropertyHelper.getItemFile(analysisProperty)); ItemRecord itemRecord = new ItemRecord(analysisFile); Assert.assertEquals(1, itemRecord.getDependencySet().size()); // create Indicator NullCountIndicator nullCountIndicator = IndicatorsFactory.eINSTANCE.createNullCountIndicator(); String nullCountPropertyID = EcoreUtil.generateUUID(); saveIndicatorDefintion(nullCountPropertyID, "ItemRecordWithRefreshedTestIndicatorDefinition2"); //$NON-NLS-1$ nullCountIndicator.setIndicatorDefinition(((TDQIndicatorDefinitionItem) ProxyRepositoryFactory.getInstance() .getLastVersion(nullCountPropertyID).getProperty().getItem()).getIndicatorDefinition()); analysis = item.getAnalysis(); analysis.getResults().getIndicators().add(nullCountIndicator); ReturnCode saveAnalysis2 = saveAnalysis(analysis); Assert.assertTrue("The analysis second time saving is not work", saveAnalysis2.isOk()); //$NON-NLS-1$ // get last resource so that the dependecy will not changed itemRecord = new ItemRecord(analysisFile); Assert.assertEquals(1, itemRecord.getDependencySet().size()); // after clear the resource will be lastest so that the dependency is added ItemRecord.clear(); itemRecord = new ItemRecord(analysisFile); Assert.assertEquals(2, itemRecord.getDependencySet().size()); } /** * DOC zshen Comment method "chooseRightProject". */ private void chooseRightProject() { String projectName = "TEST_NOLOGIN"; //getAppArgValue("-project", "TEST_NOLOGIN"); //$NON-NLS-1$ log.debug("##############current setting Project name is " + projectName); //$NON-NLS-1$ IProject rootProject = ReponsitoryContextBridge.getRootProject(); if (!projectName.equals(rootProject.getName())) { log.debug("##############Project name is different"); //$NON-NLS-1$ log.debug("##############current Project is " + rootProject.getName() + " decided reset project"); //$NON-NLS-1$ IProject initProject = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName); // rootProject.delete(true, true, null); log.debug("##############get Project name is " + initProject + " decided reset project"); //$NON-NLS-1$ initProxyRepository(initProject); rootProject = ReponsitoryContextBridge.getRootProject(); log.debug("##############After reset current Project is " + rootProject.getName() + " decided reset project"); //$NON-NLS-1$ if (DQStructureManager.getInstance().isNeedCreateStructure()) { DQStructureManager.getInstance().createDQStructure(); } } } /** * DOC talend Comment method "initProxyRepository". */ private void initProxyRepository(IProject rootProject) { Project project = null; log.debug("##############ProxyRepositoryFactory.getInstance()"); //$NON-NLS-1$ ProxyRepositoryFactory proxyRepository = ProxyRepositoryFactory.getInstance(); log.debug("##############RepositoryFactoryProvider.getRepositoriyById(RepositoryConstants.REPOSITORY_LOCAL_ID)"); //$NON-NLS-1$ IRepositoryFactory repository = RepositoryFactoryProvider.getRepositoriyById(RepositoryConstants.REPOSITORY_LOCAL_ID); proxyRepository.setRepositoryFactoryFromProvider(repository); try { log.debug("##############proxyRepository.checkAvailability()"); //$NON-NLS-1$ proxyRepository.checkAvailability(); log.debug("##############proxyRepository.initialize()"); //$NON-NLS-1$ try { proxyRepository.initialize(); } catch (Exception e) { log.error(e, e); } proxyRepository.logOffProject(); XmiResourceManager xmiResourceManager = new XmiResourceManager(); log.debug("##############rootProject.getFile(FileConstants.LOCAL_PROJECT_FILENAME).exists()"); //$NON-NLS-1$ if (rootProject.getFile(FileConstants.LOCAL_PROJECT_FILENAME).exists()) { // Initialize TDQ EMF model packages. log.debug("##############Project name is " + rootProject.getName()); //$NON-NLS-1$ new EMFUtil(); project = new Project(xmiResourceManager.loadProject(rootProject)); log.debug("############## after loadProject Project name is " + project.getTechnicalLabel()); //$NON-NLS-1$ } else { User user = org.talend.core.model.properties.impl.PropertiesFactoryImpl.eINSTANCE.createUser(); user.setLogin("talend@talend.com"); //$NON-NLS-1$ user.setPassword("talend@talend.com".getBytes()); //$NON-NLS-1$ String projectName = rootProject.getName(); log.debug("##############default project is not exist then create new project which is " + projectName); //$NON-NLS-1$ String projectDesc = ResourcesPlugin.getWorkspace().newProjectDescription(projectName).getComment(); Project projectInfor = ProjectHelper.createProject(projectName, projectDesc, ECodeLanguage.JAVA.getName(), user); // MOD zshen create project by proxyRepository checkFileName(projectInfor.getLabel(), RepositoryConstants.PROJECT_PATTERN); project = proxyRepository.getRepositoryFactoryFromProvider().createProject(projectInfor); } if (project != null) { initRepositoryContext(project); // add status String defaultTechnicalStatusList = "DEV development;TEST testing;PROD production"; //$NON-NLS-1$ List<Status> statusList = StatusHelper.parse(defaultTechnicalStatusList); proxyRepository.setTechnicalStatus(statusList); } } catch (PersistenceException e) { ExceptionHandler.process(e); Assert.fail(e.getMessage()); } catch (Exception e) { log.error(e, e); log.debug("##############exception message is " + e.getMessage()); //$NON-NLS-1$ } } private void initRepositoryContext(Project project) { RepositoryContext repositoryContext = new RepositoryContext(); Context ctx = CoreRuntimePlugin.getInstance().getContext(); ctx.putProperty(Context.REPOSITORY_CONTEXT_KEY, repositoryContext); repositoryContext.setUser(project.getAuthor()); repositoryContext.setClearPassword(project.getLabel()); repositoryContext.setProject(project); repositoryContext.setFields(new HashMap<String, String>()); // repositoryContext.getFields().put(IProxyRepositoryFactory.BRANCH_SELECTION + "_" + project.getTechnicalLabel(), ""); //$NON-NLS-1$ //$NON-NLS-2$ ProjectManager.getInstance().setMainProjectBranch(project, null); ReponsitoryContextBridge.initialized(project.getEmfProject(), project.getAuthor()); // MOD zshen for bug tdq-4757 remove this init from corePlugin.start() to here because the initLocal command of // commandLine // SqlExplorerUtils.getDefault().initSqlExplorerRootProject(); } /** * * DOC zshen Comment method "checkFileName". * * @param fileName * @param pattern * * copy the method from ProxyRepositoryFactory to avoid tos migeration. */ private void checkFileName(String fileName, String pattern) { if (!Pattern.matches(pattern, fileName)) { Assert.fail(DefaultMessagesImpl.getString("ProxyRepositoryFactory.illegalArgumentException.labelNotMatchPattern", //$NON-NLS-1$ new Object[] { fileName, pattern })); throw new IllegalArgumentException(DefaultMessagesImpl.getString( "ProxyRepositoryFactory.illegalArgumentException.labelNotMatchPattern", new Object[] { fileName, pattern })); //$NON-NLS-1$ } } private String getAppArgValue(String arg, String defaultValue) { String value = defaultValue; int index = ArrayUtils.indexOf(Platform.getApplicationArgs(), arg); if (index > 0) { if (index + 1 < Platform.getApplicationArgs().length) { value = Platform.getApplicationArgs()[index + 1]; } } return value; } /** * DOC zshen Comment method "saveAnalysis". * * @param analysis */ private ReturnCode saveAnalysis(Analysis analysis) { AnalysisWriter createAnalysisWriter = ElementWriterFactory.getInstance().createAnalysisWrite(); return createAnalysisWriter.save(analysis); } private Property createAnalysis(String name) throws PersistenceException { // create analysis Analysis createAnalysis = AnalysisFactory.eINSTANCE.createAnalysis(); AnalysisResult createAnalysisResult = AnalysisFactory.eINSTANCE.createAnalysisResult(); AnalysisContext createAnalysisContext = AnalysisFactory.eINSTANCE.createAnalysisContext(); createAnalysis.setResults(createAnalysisResult); createAnalysis.setContext(createAnalysisContext); createAnalysis.setName(name); // create analysis item TDQAnalysisItem createTDQAnalysisItem = PropertiesFactory.eINSTANCE.createTDQAnalysisItem(); createTDQAnalysisItem.setAnalysis(createAnalysis); Property createAnalysisProperty = org.talend.core.model.properties.PropertiesFactory.eINSTANCE.createProperty(); createAnalysisProperty.setLabel(name); createTDQAnalysisItem.setProperty(createAnalysisProperty); createAnalysisProperty.setId(EcoreUtil.generateUUID()); ProxyRepositoryFactory.getInstance().create(createTDQAnalysisItem, Path.EMPTY, false); return createAnalysisProperty; } private void saveIndicatorDefintion(String uuid, String name) throws PersistenceException { // create definition IndicatorDefinition createIndicatorDefinition = DefinitionFactory.eINSTANCE.createIndicatorDefinition(); TDQIndicatorDefinitionItem createTDQIndicatorDefinitionItem = PropertiesFactory.eINSTANCE .createTDQIndicatorDefinitionItem(); createTDQIndicatorDefinitionItem.setIndicatorDefinition(createIndicatorDefinition); Property createProperty = org.talend.core.model.properties.PropertiesFactory.eINSTANCE.createProperty(); createProperty.setLabel(name); createIndicatorDefinition.setLabel(name); createIndicatorDefinition.setName(name); createTDQIndicatorDefinitionItem.setProperty(createProperty); createProperty.setId(uuid); ProxyRepositoryFactory.getInstance().create(createTDQIndicatorDefinitionItem, new Path(ERepositoryObjectType.TDQ_SYSTEM_INDICATORS.getFolder()).removeFirstSegments(2), false); } }