// ============================================================================
//
// 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;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.regex.Pattern;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.help.internal.base.BaseHelpSystem;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.osgi.service.datalocation.Location;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.RefreshAction;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.talend.commons.emf.EMFUtil;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.context.Context;
import org.talend.core.context.RepositoryContext;
import org.talend.core.language.ECodeLanguage;
import org.talend.core.model.general.ILibrariesService;
import org.talend.core.model.general.Project;
import org.talend.core.model.metadata.builder.connection.Connection;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.model.properties.Item;
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.properties.impl.PropertiesFactoryImpl;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.prefs.ITalendCorePrefConstants;
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.core.runtime.services.IMavenUIService;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.ui.editor.AbstractItemEditorInput;
import org.talend.dataprofiler.core.ui.editor.CommonFormEditor;
import org.talend.dataprofiler.core.ui.editor.analysis.AnalysisEditor;
import org.talend.dataprofiler.core.ui.utils.WorkbenchUtils;
import org.talend.dataprofiler.core.ui.views.DQRespositoryView;
import org.talend.dataprofiler.core.ui.views.PatternTestView;
import org.talend.dataprofiler.core.ui.views.RespositoryDetailView;
import org.talend.dataprofiler.help.BookMarkEnum;
import org.talend.dataprofiler.migration.MigrationPlugin;
import org.talend.dataprofiler.service.ISemanticStudioService;
import org.talend.dataquality.analysis.impl.AnalysisImpl;
import org.talend.dataquality.reports.impl.TdReportImpl;
import org.talend.dq.CWMPlugin;
import org.talend.dq.helper.PropertyHelper;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.nodes.DQRepositoryNode;
import org.talend.model.bridge.ReponsitoryContextBridge;
import org.talend.repository.ProjectManager;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.RepositoryConstants;
import org.talend.resource.ResourceManager;
import org.talend.utils.ProductVersion;
import org.talend.utils.sugars.ReturnCode;
import orgomg.cwm.objectmodel.core.ModelElement;
/**
* The activator class controls the plug-in life cycle.
*/
public class CorePlugin extends AbstractUIPlugin {
protected static Logger log = Logger.getLogger(CorePlugin.class);
// The plug-in ID
public static final String PLUGIN_ID = "org.talend.dataprofiler.core"; //$NON-NLS-1$
// The shared instance
private static CorePlugin plugin;
private RefreshAction refreshAction;
private boolean repositoryInitialized = false;
private BundleContext bundleContext;
private ISemanticStudioService service;
/**
* Getter for context.
*
* @return the context
*/
public BundleContext getBundleContext() {
return this.bundleContext;
}
/**
* Getter for repositoryInitialized.
*
* @return the repositoryInitialized
*/
public boolean isRepositoryInitialized() {
return this.repositoryInitialized;
}
/**
* The constructor.
*/
public CorePlugin() {
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext )
*/
@SuppressWarnings("restriction")
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
this.bundleContext = context;
plugin = this;
getPreferenceStore().setDefault(PluginConstant.CHEAT_SHEET_VIEW, true);
getPreferenceStore().setValue(ITalendCorePrefConstants.PREVIEW_LIMIT, "50");//$NON-NLS-1$
getPreferenceStore().setValue(ITalendCorePrefConstants.LANGUAGE_SELECTOR, Locale.getDefault().getLanguage());
getPreferenceStore().setDefault(PluginConstant.MAX_NB_ROWS_ANALYSIS_EDITOR, 10000);
try {
for (BookMarkEnum bookMark : BookMarkEnum.VALUES) {
BaseHelpSystem.getBookmarkManager().addBookmark(bookMark.getHref(), bookMark.getLabel());
}
} catch (Exception e) {
log.error(e, e);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext )
*/
@Override
public void stop(BundleContext context) throws Exception {
plugin = null;
super.stop(context);
}
/**
* Returns the shared instance.
*
* @return the shared instance
*/
public static CorePlugin getDefault() {
return plugin;
}
/**
* Returns an image descriptor for the image file at the given plug-in relative path.
*
* @param path the path
* @return the image descriptor
*/
public static ImageDescriptor getImageDescriptor(String path) {
return imageDescriptorFromPlugin(PLUGIN_ID, path);
}
/**
* DOC Zqin Comment method "getCurrentActiveEditor".
*
* @return the current active editor;
*/
public IEditorPart getCurrentActiveEditor() {
return getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
}
/**
* DOC msjian Comment method "getAllDataProviders".
*
* @return
*/
public Collection<Connection> getAllDataProviders() {
Collection<Connection> allDataProviders = new ArrayList<Connection>();
try {
for (ConnectionItem connItem : ProxyRepositoryFactory.getInstance().getMetadataConnectionsItem()) {
allDataProviders.add(connItem.getConnection());
}
} catch (PersistenceException e) {
log.error(e, e);
}
return allDataProviders;
}
/**
* DOC bZhou Comment method "openEditor".
*
* @param file
* @param editorId
* @return
* @deprecated
*/
@Deprecated
public IEditorPart openEditor(IFile file, String editorId) {
FileEditorInput input = new FileEditorInput(file);
try {
return this.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor(input, editorId);
} catch (PartInitException e) {
ExceptionHandler.process(e);
return null;
}
}
/**
* DOC mzhao open editor with editor input.
*
* @param editorInput
* @param editorId
* @return
*/
public IEditorPart openEditor(IEditorInput editorInput, String editorId) {
try {
return this.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor(editorInput, editorId);
} catch (PartInitException e) {
ExceptionHandler.process(e);
return null;
}
}
/**
* get DQ repository view if the view is opening else return null
*
* @return
*/
public DQRespositoryView getRepositoryView() {
IViewPart view = WorkbenchUtils.getView(DQRespositoryView.ID, false);
return view != null ? (DQRespositoryView) view : null;
}
/**
* get DQ repository view without bring it to top.
*
* @return
*/
public DQRespositoryView getRepositoryViewWithoutBringToTop() {
IViewPart view = WorkbenchUtils.getView(DQRespositoryView.ID, false, false);
return view != null ? (DQRespositoryView) view : null;
}
/**
* get DQ repository view if the view is opening else will open it firstly
*
* @return
*/
public DQRespositoryView findAndOpenRepositoryView() {
IViewPart view = WorkbenchUtils.getView(DQRespositoryView.ID, true);
return view != null ? (DQRespositoryView) view : null;
}
/**
* DOC bzhou Comment method "getPatternTestView".
*
* @return
*/
public PatternTestView getPatternTestView() {
IViewPart view = WorkbenchUtils.getAndOpenView(PatternTestView.ID);
return view != null ? (PatternTestView) view : null;
}
public RespositoryDetailView getRespositoryDetailView() {
IViewPart view = WorkbenchUtils.getAndOpenView(RespositoryDetailView.ID);
return view != null ? (RespositoryDetailView) view : null;
}
public void refreshWorkSpace() {
if (refreshAction == null) {
refreshAction = new RefreshAction(PlatformUI.getWorkbench().getActiveWorkbenchWindow());
}
refreshAction.run();
}
/**
* refresh the whole DQReposirotyView.
*/
public void refreshDQView() {
DQRespositoryView repositoryView = getRepositoryView();
if (repositoryView != null && repositoryView.getCommonViewer() != null) {
repositoryView.getCommonViewer().refresh();
}
}
public IRepositoryNode getCurrentSelectionNode() {
DQRespositoryView repositoryView = getRepositoryView();
if (repositoryView == null) {
return null;
}
TreeItem[] selectionTreeItem = repositoryView.getCommonViewer().getTree().getSelection();
if (null != selectionTreeItem && selectionTreeItem.length > 0 && null != selectionTreeItem[0]) {
IRepositoryNode repoNode = (IRepositoryNode) selectionTreeItem[0].getData();
return repoNode;
} else {
return null;
}
}
/**
* refresh the object's status in the DQReposirotyView(if this object is null, then refresh all the
* DQReposirotyView).
*
* @param object
*/
public void refreshDQView(Object object) {
if (object == null) {
refreshDQView();
} else {
DQRespositoryView repositoryView = getRepositoryView();
if (repositoryView != null && repositoryView.getCommonViewer() != null) {
repositoryView.getCommonViewer().refresh(object);
}
}
}
/**
* after create analysis, do refresh
*/
public void refresh(ModelElement modelElement) {
if (modelElement instanceof AnalysisImpl || modelElement instanceof TdReportImpl) {
// MOD by zshen refresh the folder which contain the modelElement but not select it
CorePlugin.getDefault().refreshDQView(
RepositoryNodeHelper.findNearestSystemFolderNode(RepositoryNodeHelper.recursiveFind(modelElement)));
} else {
IRepositoryNode currentSelectionNode = CorePlugin.getDefault().getCurrentSelectionNode();
// if DqRepositoryView is not opened currentSelectionNode will be null and refreshDQView method will
// get one error log.
CorePlugin.getDefault().refreshDQView(currentSelectionNode);
}
CorePlugin.getDefault().refreshWorkSpace();
// MOD gdbu 2011-11-18 TDQ-3969 : after create items re-filter the tree , to create a new list .
if (DQRepositoryNode.isOnFilterring()) {
RepositoryNodeHelper.fillTreeList(null);
RepositoryNodeHelper
.setFilteredNode(RepositoryNodeHelper.getRootNode(ERepositoryObjectType.TDQ_DATA_PROFILING, true));
}
}
/**
* DOC bzhou Comment method "getProductVersion".
*
* @return
* @deprecated use MigrationPlugin.getDefault().getProductVersion()
*/
@Deprecated
public ProductVersion getProductVersion() {
return MigrationPlugin.getDefault().getProductVersion();
}
/**
* DOC qiongli close editor by file.
*
* @param fileRes
*/
public void closeEditorIfOpened(Item item) {
itemIsOpening(item, true);
}
/**
* check the item's editor is opening or not.
*
* @param item
* @return
*/
public boolean itemIsOpening(Item item) {
return itemIsOpening(item, false);
}
/**
* check the item's editor is opening or not.
*
* @param item
* @param closeEditor close the editor if it is opening
* @return
*/
public boolean itemIsOpening(Item item, boolean closeEditor) {
boolean opening = false;
IWorkbenchPage activePage = CorePlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorReference[] editorReferences = activePage.getEditorReferences();
IEditorInput editorInput = null;
Property property = item.getProperty();
for (IEditorReference reference : editorReferences) {
try {
editorInput = reference.getEditorInput();
if (editorInput instanceof FileEditorInput) {
FileEditorInput fileInput = (FileEditorInput) editorInput;
if (property.eResource() != null) {
IPath itemPath = PropertyHelper.getItemPath(property);
if (itemPath != null && itemPath.equals(fileInput.getFile().getFullPath())) {
opening = true;
if (closeEditor) {
activePage.closeEditor(reference.getEditor(false), false);
}
break;
}
}
} else if (editorInput instanceof AbstractItemEditorInput) {
AbstractItemEditorInput input = (AbstractItemEditorInput) editorInput;
Item it = input.getItem();
if (it != null && property != null && it.getProperty().getId().equals(property.getId())) {
opening = true;
if (closeEditor) {
activePage.closeEditor(reference.getEditor(false), false);
}
break;
}
}
} catch (PartInitException e) {
log.error(e);
continue;
}
}
return opening;
}
/**
*
* refresh the related connection which is opened in DQ side.
*
* @param item
*/
public void refreshOpenedEditor(Item item) {
if (item == null) {
return;
}
IWorkbenchPage activePage = CorePlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorReference[] editorReferences = activePage.getEditorReferences();
Property property = item.getProperty();
for (IEditorReference reference : editorReferences) {
try {
IEditorInput input = reference.getEditorInput();
if (input instanceof AbstractItemEditorInput) {
AbstractItemEditorInput itemInput = (AbstractItemEditorInput) input;
Item it = itemInput.getItem();
if (it != null && property != null && it.getProperty().getId().equals(property.getId())) {
// make sure the item in editorInput is latest.
if (!item.equals(it)) {
itemInput.setRepNode(RepositoryNodeHelper.recursiveFind(property));
}
CommonFormEditor editor = (CommonFormEditor) reference.getEditor(false);
editor.refreshEditor();
break;
}
}
} catch (PartInitException e) {
log.error(e);
continue;
}
}
}
public List<AnalysisEditor> getCurrentOpenAnalysisEditor() {
IWorkbenchPage activePage = CorePlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorReference[] editorReferences = activePage.getEditorReferences();
List<AnalysisEditor> result = new ArrayList<AnalysisEditor>();
for (IEditorReference iEditorReference : editorReferences) {
IEditorPart editor = iEditorReference.getEditor(false);
if (editor instanceof AnalysisEditor) {
result.add((AnalysisEditor) editor);
}
}
return result;
}
/**
* DOC zshen Comment method "initProxyRepository".
*/
public ReturnCode initProxyRepository() {
ReturnCode rc = new ReturnCode();
Project project = null;
RepositoryContext repositoryContext = (RepositoryContext) org.talend.core.runtime.CoreRuntimePlugin.getInstance()
.getContext().getProperty(Context.REPOSITORY_CONTEXT_KEY);
if (repositoryContext != null) {
project = repositoryContext.getProject();
User user = repositoryContext.getUser();
ReponsitoryContextBridge.initialized(project.getEmfProject(), user);
} else { // else project is null, then we are in TOP only
Location instanceLoc = Platform.getInstanceLocation();
try {
if (instanceLoc.isLocked()) {
rc.setMessage(DefaultMessagesImpl.getString("CorePlugin.workspaceInUse"));//$NON-NLS-1$
rc.setOk(false);
return rc;
} else {
instanceLoc.lock();
}
} catch (IOException e) {
log.error(e, e);
}
ProxyRepositoryFactory proxyRepository = ProxyRepositoryFactory.getInstance();
IRepositoryFactory repository = RepositoryFactoryProvider.getRepositoriyById(RepositoryConstants.REPOSITORY_LOCAL_ID);
if (repository == null) {
log.fatal(DefaultMessagesImpl.getString("CorePlugin.noLocalRepositoryFound")); //$NON-NLS-1$
rc.setMessage(DefaultMessagesImpl.getString("CorePlugin.noLocalRepositoryFound"));//$NON-NLS-1$
rc.setOk(false);
return rc;
}
proxyRepository.setRepositoryFactoryFromProvider(repository);
try {
proxyRepository.checkAvailability();
proxyRepository.initialize();
XmiResourceManager xmiResourceManager = new XmiResourceManager();
IProject rootProject = ResourceManager.getRootProject();
if (rootProject.getFile(FileConstants.LOCAL_PROJECT_FILENAME).exists()) {
// Initialize TDQ EMF model packages.
new EMFUtil();
project = new Project(xmiResourceManager.loadProject(rootProject));
} else {
User user = PropertiesFactoryImpl.eINSTANCE.createUser();
user.setLogin("talend@talend.com"); //$NON-NLS-1$
user.setPassword("talend@talend.com".getBytes()); //$NON-NLS-1$
String projectName = ResourceManager.getRootProjectName();
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);
// TDQ-11125:setup MavenResolver properties for TOP(like as generate
// 'maven_user_settings.xml').before set, must check user setting first.
if (org.talend.commons.utils.platform.PluginChecker.isOnlyTopLoaded()) {
if (GlobalServiceRegister.getDefault().isServiceRegistered(IMavenUIService.class)) {
IMavenUIService mavenUIService = (IMavenUIService) GlobalServiceRegister.getDefault().getService(
IMavenUIService.class);
if (mavenUIService != null) {
mavenUIService.checkUserSettings(new NullProgressMonitor());
mavenUIService.updateMavenResolver(false);
mavenUIService.addMavenConfigurationChangeListener();
}
}
// deploy libraries and maven index here
if (GlobalServiceRegister.getDefault().isServiceRegistered(ILibrariesService.class)) {
ILibrariesService librariesService = (ILibrariesService) GlobalServiceRegister.getDefault()
.getService(ILibrariesService.class);
if (librariesService != null) {
librariesService.syncLibraries();
// TDQ-9529 check libararies install status at here,so that
// "Optional third-party libraries" is displayed in the "Additional Talend Package"
// dialog.
librariesService.checkLibraries();
}
}
}
CWMPlugin.getDefault().createLibFolderIfNotExist();
}
} catch (PersistenceException e) {
ExceptionHandler.process(e);
rc.setMessage(e.getMessage());
rc.setOk(false);
return rc;
}
}
return rc;
}
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
// TODO TDQ-9378
// SQLExplorerPlugin.getDefault().setRootProject(ReponsitoryContextBridge.getRootProject());
// SqlExplorerUtils.getDefault().initSqlExplorerRootProject();
}
/**
* copy the method from ProxyRepositoryFactory to avoid tos migeration.
*
* @param fileName
* @param pattern
*/
private void checkFileName(String fileName, String pattern) {
if (!Pattern.matches(pattern, fileName)) {
throw new IllegalArgumentException(DefaultMessagesImpl.getString(
"ProxyRepositoryFactory.illegalArgumentException.labelNotMatchPattern", new Object[] { fileName, pattern })); //$NON-NLS-1$
}
}
public ISemanticStudioService getSemanticStudioService() {
if (service == null) {
ServiceReference<?> serviceReference = bundleContext.getServiceReference(ISemanticStudioService.class.getName());
if (serviceReference != null) {
service = (ISemanticStudioService) bundleContext.getService(serviceReference);
}
}
return service;
}
public synchronized void setSemanticStudioService(ISemanticStudioService service) {
System.out.println("Service was set. Thank you DS!");
this.service = service;
}
public synchronized void unsetSemanticStudioService(ISemanticStudioService service) {
System.out.println("Service was unset. Why did you do this to me?");
if (this.service == service) {
this.service = null;
}
}
}