// ============================================================================
//
// 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.manager;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Enumeration;
import org.apache.log4j.Logger;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.undo.CreateProjectOperation;
import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.utils.VersionUtils;
import org.talend.commons.utils.platform.PluginChecker;
import org.talend.core.context.Context;
import org.talend.core.model.properties.ByteArray;
import org.talend.core.model.properties.FolderItem;
import org.talend.core.model.properties.Project;
import org.talend.core.model.properties.PropertiesFactory;
import org.talend.core.model.properties.Property;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.Folder;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.runtime.CoreRuntimePlugin;
import org.talend.dataprofiler.core.CorePlugin;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.migration.helper.WorkspaceVersionHelper;
import org.talend.dataprofiler.core.ui.progress.ProgressUI;
import org.talend.dataprofiler.core.ui.utils.HadoopClusterUtils;
import org.talend.dataprofiler.core.ui.utils.WorkbenchUtils;
import org.talend.dataprofiler.core.ui.views.provider.RepositoryNodeBuilder;
import org.talend.dataquality.PluginConstant;
import org.talend.dataquality.properties.TDQSourceFileItem;
import org.talend.dq.factory.ModelElementFileFactory;
import org.talend.dq.helper.ProxyRepositoryManager;
import org.talend.dq.indicators.definitions.DefinitionHandler;
import org.talend.dq.writer.AElementPersistance;
import org.talend.dq.writer.impl.ElementWriterFactory;
import org.talend.repository.ProjectManager;
import org.talend.repository.RepositoryWorkUnit;
import org.talend.repository.model.IProxyRepositoryFactory;
import org.talend.resource.EResourceConstant;
import org.talend.resource.ResourceManager;
import org.talend.resource.ResourceService;
import org.talend.utils.ProductVersion;
import orgomg.cwm.objectmodel.core.ModelElement;
/**
* Create the folder structure for the DQ Reponsitory view.
*
*/
public final class DQStructureManager {
protected static Logger log = Logger.getLogger(DQStructureManager.class);
private static final String DEMO_PATH = "/demo"; //$NON-NLS-1$
public static final String RULES_PATH = "/dqrules"; //$NON-NLS-1$
public static final String RULES_PARSER = "/parser"; //$NON-NLS-1$
private static final String PATTERN_PATH = "/patterns"; //$NON-NLS-1$
private static final String SQL_LIKE_PATH = "/sql_like";//$NON-NLS-1$
public static final String SYSTEM_INDICATOR_PATH = "/indicators";//$NON-NLS-1$
private static DQStructureManager manager;
public static DQStructureManager getInstance() {
if (manager == null) {
manager = new DQStructureManager();
}
return manager;
}
/**
* DOC bZhou DQStructureManager constructor comment.
*/
private DQStructureManager() {
ResourceService.refreshStructure();
}
/**
* DOC bZhou Comment method "getCurrentProject".
*
* @return
*/
public Project getCurrentProject() {
Context ctx = CoreRuntimePlugin.getInstance().getContext();
return (Project) ctx.getProperty(Context.REPOSITORY_CONTEXT_KEY);
}
/**
* DOC bZhou Comment method "createDQStructure".
*/
public void createDQStructure() {
RepositoryWorkUnit<Object> workUnit = new RepositoryWorkUnit<Object>(
DefaultMessagesImpl.getString("DQStructureManager.SVN_LOG_CREATE_STRUCTURE")) { //$NON-NLS-1$
@Override
protected void run() {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRunnable operation = new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
createDQStructureUnit();
}
};
ISchedulingRule schedulingRule = workspace.getRoot();
try {
workspace.run(operation, schedulingRule, IWorkspace.AVOID_UPDATE, new NullProgressMonitor());
} catch (CoreException e) {
log.error(e, e);
}
}
};
workUnit.setAvoidUnloadResources(true);
ProxyRepositoryFactory.getInstance().executeRepositoryWorkUnit(workUnit);
}
/**
* DOC zhao Comment method "createDQStructureUnit".
*/
private void createDQStructureUnit() {
RepositoryNodeBuilder instance = RepositoryNodeBuilder.getInstance();
Plugin plugin = CorePlugin.getDefault();
try {
IProject project = ResourceManager.getRootProject();
if (!project.exists()) {
project = createNewProject(ResourceManager.getRootProjectName());
}
if (!project.getFolder(EResourceConstant.DB_CONNECTIONS.getPath()).exists()) {
ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.METADATA, Path.EMPTY,
EResourceConstant.DB_CONNECTIONS.getName());
}
if (!project.getFolder(EResourceConstant.FILEDELIMITED.getPath()).exists()) {
ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.METADATA, Path.EMPTY,
EResourceConstant.FILEDELIMITED.getName());
}
if (!project.getFolder(EResourceConstant.ANALYSIS.getPath()).exists()) {
ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.TDQ_DATA_PROFILING, Path.EMPTY,
EResourceConstant.ANALYSIS.getName());
}
if (PluginChecker.isTDQLoaded()) {
if (!project.getFolder(EResourceConstant.REPORTS.getPath()).exists()) {
ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.TDQ_DATA_PROFILING, Path.EMPTY,
EResourceConstant.REPORTS.getName());
}
// Added 20150421 TDQ-9605
if (!project.getFolder(EResourceConstant.HADOOP_CLUSTER.getPath()).exists()
&& HadoopClusterUtils.getDefault().isServiceInstalled()) {
ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.METADATA, Path.EMPTY,
EResourceConstant.HADOOP_CLUSTER.getName());
}
}
if (!project.getFolder(EResourceConstant.PATTERNS.getPath()).exists()) {
ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.TDQ_LIBRARIES, Path.EMPTY,
EResourceConstant.PATTERNS.getName());
}
if (!project.getFolder(EResourceConstant.RULES.getPath()).exists()) {
ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.TDQ_LIBRARIES, Path.EMPTY,
EResourceConstant.RULES.getName());
}
Folder rulesSQLFoler = null;
if (!project.getFolder(EResourceConstant.RULES_SQL.getPath()).exists()) {
rulesSQLFoler = ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.TDQ_RULES, Path.EMPTY,
EResourceConstant.RULES_SQL.getName());
} else {
rulesSQLFoler = instance.getObjectFolder(EResourceConstant.RULES_SQL);
}
rulesSQLFoler.getProperty().getItem().getState().setPath(ERepositoryObjectType.TDQ_RULES_SQL.getFolder());
Folder rulesMatchLFoler = null;
if (!project.getFolder(EResourceConstant.RULES_MATCHER.getPath()).exists()) {
rulesMatchLFoler = ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.TDQ_RULES, Path.EMPTY,
EResourceConstant.RULES_MATCHER.getName());
} else {
rulesMatchLFoler = instance.getObjectFolder(EResourceConstant.RULES_MATCHER);
}
rulesMatchLFoler.getProperty().getItem().getState().setPath(ERepositoryObjectType.TDQ_RULES_MATCHER.getFolder());
Folder rulesParserFoler = null;
if (!project.getFolder(EResourceConstant.RULES_PARSER.getPath()).exists()) {
if (PluginChecker.isTDQLoaded()) {
rulesParserFoler = ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.TDQ_RULES,
Path.EMPTY, EResourceConstant.RULES_PARSER.getName());
}
} else {
rulesParserFoler = instance.getObjectFolder(EResourceConstant.RULES_PARSER);
}
if (rulesParserFoler != null) {
rulesParserFoler.getProperty().getItem().getState().setPath(ERepositoryObjectType.TDQ_RULES_PARSER.getFolder());
}
if (!project.getFolder(EResourceConstant.EXCHANGE.getPath()).exists()) {
ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.TDQ_LIBRARIES, Path.EMPTY,
EResourceConstant.EXCHANGE.getName());
}
if (!project.getFolder(EResourceConstant.INDICATORS.getPath()).exists()) {
ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.TDQ_LIBRARIES, Path.EMPTY,
EResourceConstant.INDICATORS.getName());
}
Folder systemIndicatorFoler = null;
if (!project.getFolder(EResourceConstant.SYSTEM_INDICATORS.getPath()).exists()) {
systemIndicatorFoler = ProxyRepositoryFactory.getInstance().createFolder(
ERepositoryObjectType.TDQ_INDICATOR_ELEMENT, Path.EMPTY, EResourceConstant.SYSTEM_INDICATORS.getName());
} else {
systemIndicatorFoler = instance.getObjectFolder(EResourceConstant.SYSTEM_INDICATORS);
}
systemIndicatorFoler.getProperty().getItem().getState()
.setPath(ERepositoryObjectType.TDQ_SYSTEM_INDICATORS.getFolder());
if (!project.getFolder(EResourceConstant.USER_DEFINED_INDICATORS.getPath()).exists()) {
ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.TDQ_INDICATOR_ELEMENT, Path.EMPTY,
EResourceConstant.USER_DEFINED_INDICATORS.getName());
}
if (!project.getFolder(EResourceConstant.USER_DEFINED_INDICATORS_LIB.getPath()).exists()) {
// MOD zhsne 18724: Java UDI enhancements add lib folder under UDI folder.
ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.TDQ_USERDEFINE_INDICATORS, Path.EMPTY,
EResourceConstant.USER_DEFINED_INDICATORS_LIB.getName());
}
if (PluginChecker.isTDQLoaded()) {
if (!project.getFolder(EResourceConstant.JRXML_TEMPLATE.getPath()).exists()) {
ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.TDQ_LIBRARIES, Path.EMPTY,
EResourceConstant.JRXML_TEMPLATE.getName());
}
}
Folder patternRegexFoler = null;
if (!project.getFolder(EResourceConstant.PATTERN_REGEX.getPath()).exists()) {
patternRegexFoler = ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.TDQ_PATTERN_ELEMENT,
Path.EMPTY, EResourceConstant.PATTERN_REGEX.getName());
} else {
patternRegexFoler = instance.getObjectFolder(EResourceConstant.PATTERN_REGEX);
}
patternRegexFoler.getProperty().getItem().getState().setPath(ERepositoryObjectType.TDQ_PATTERN_REGEX.getFolder());
Folder patternSQLFoler = null;
if (!project.getFolder(EResourceConstant.PATTERN_SQL.getPath()).exists()) {
patternSQLFoler = ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.TDQ_PATTERN_ELEMENT,
Path.EMPTY, EResourceConstant.PATTERN_SQL.getName());
} else {
patternSQLFoler = instance.getObjectFolder(EResourceConstant.PATTERN_SQL);
}
patternSQLFoler.getProperty().getItem().getState().setPath(ERepositoryObjectType.TDQ_PATTERN_SQL.getFolder());
Folder sourceFileFoler = null;
if (!project.getFolder(EResourceConstant.SOURCE_FILES.getPath()).exists()) {
sourceFileFoler = ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType.TDQ_LIBRARIES,
Path.EMPTY, EResourceConstant.SOURCE_FILES.getName());
} else {
sourceFileFoler = instance.getObjectFolder(EResourceConstant.SOURCE_FILES);
}
sourceFileFoler.getProperty().getItem().getState().setPath(ERepositoryObjectType.TDQ_SOURCE_FILE_ELEMENT.getFolder());
// use the tos create folder API
if (systemIndicatorFoler != null && patternRegexFoler != null && patternSQLFoler != null && sourceFileFoler != null
&& rulesSQLFoler != null) {
copyFilesToFolder(plugin, SYSTEM_INDICATOR_PATH, true, systemIndicatorFoler, null,
ERepositoryObjectType.TDQ_SYSTEM_INDICATORS);
copyFilesToFolder(plugin, PATTERN_PATH, true, patternRegexFoler, null, ERepositoryObjectType.TDQ_PATTERN_REGEX);
copyFilesToFolder(plugin, SQL_LIKE_PATH, true, patternSQLFoler, null, ERepositoryObjectType.TDQ_PATTERN_SQL);
copyFilesToFolder(plugin, DEMO_PATH, true, sourceFileFoler, null, ERepositoryObjectType.TDQ_SOURCE_FILE_ELEMENT);
copyFilesToFolder(plugin, RULES_PATH, true, rulesSQLFoler, null, ERepositoryObjectType.TDQ_RULES_SQL);
}
if (rulesParserFoler != null) {
copyFilesToFolder(plugin, RULES_PARSER, true, rulesParserFoler, null, ERepositoryObjectType.TDQ_RULES_PARSER);
}
WorkspaceVersionHelper.storeVersion();
// MOD qiongli 2011-12-6 TDQ-4095,make the definition file commit to svn with the DQ struct files.move
// this code from DQRespositoryView.initWorkspace()
IFile defFile = ResourceManager.getLibrariesFolder().getFile(DefinitionHandler.FILENAME);
if (!defFile.exists()) {
DefinitionHandler handler = DefinitionHandler.getInstance();
// TDQ-4714 update the aggregateDefinitions tag for some indicator definition.
handler.updateAggregates();
}
ResourceService.refreshStructure();
} catch (Exception ex) {
ExceptionHandler.process(ex);
ProxyRepositoryManager.getInstance().save();
}
}
/**
*
* DOC klliu Comment method "copyFilesToFolder".
*
* @param plugin
* @param srcPath
* @param recurse
* @param desFolder
* @param suffix
* @param type
* @throws IOException
* @throws CoreException
*/
public void copyFilesToFolder(Plugin plugin, String srcPath, boolean recurse, Folder desFolder, String suffix,
ERepositoryObjectType type) throws IOException, CoreException {
if (plugin == null) {
return;
}
IProject project = ResourceManager.getRootProject();
Enumeration<?> paths = null;
paths = plugin.getBundle().getEntryPaths(srcPath);
if (paths == null) {
return;
}
while (paths.hasMoreElements()) {
String nextElement = (String) paths.nextElement();
String currentPath = "/" + nextElement; //$NON-NLS-1$
URL resourceURL = plugin.getBundle().getEntry(currentPath);
URL fileURL = null;
File file = null;
try {
fileURL = FileLocator.toFileURL(resourceURL);
file = new File(fileURL.getFile());
if (file.isDirectory() && recurse) {
if (file.getName().startsWith(".")) { //$NON-NLS-1$
continue;
}
Folder sourcefolder = null;
IFolder targetfolder = WorkbenchUtils.folder2IFolder(desFolder);
if (!targetfolder.getFolder(file.getName()).exists()) {
sourcefolder = ProxyRepositoryFactory.getInstance().createFolder(type, Path.EMPTY, file.getName());
} else {
FolderItem folderItem = ProxyRepositoryFactory.getInstance().getFolderItem(
ProjectManager.getInstance().getCurrentProject(), type, new Path(file.getName()));
if (folderItem == null) {
sourcefolder = ProxyRepositoryFactory.getInstance().createFolder(type, Path.EMPTY, file.getName());
String subSourceFolder = type.getFolder().concat("/").concat(file.getName()); //$NON-NLS-1$
sourcefolder.getProperty().getItem().getState().setPath(subSourceFolder);
} else {
String subSourceFolder = type.getFolder().concat("/").concat(file.getName()); //$NON-NLS-1$
sourcefolder = new Folder(folderItem.getProperty(), type);
sourcefolder.getProperty().getItem().getState().setPath(subSourceFolder);
}
}
copyFilesToFolder(plugin, currentPath, recurse, sourcefolder, suffix, type);
continue;
}
if (suffix != null && !file.getName().endsWith(suffix)) {
continue;
}
String fileName = new Path(fileURL.getPath()).lastSegment();
InputStream openStream = fileURL.openStream();
String folderName = null;
if (type.equals(ERepositoryObjectType.TDQ_PATTERN_ELEMENT)) {
folderName = ERepositoryObjectType.getFolderName(type);
}
if (type.equals(ERepositoryObjectType.TDQ_RULES_SQL) || type.equals(ERepositoryObjectType.TDQ_RULES_PARSER)) {
folderName = ERepositoryObjectType.getFolderName(type);
} else if (type.equals(ERepositoryObjectType.TDQ_SOURCE_FILE_ELEMENT)) {
folderName = ERepositoryObjectType.getFolderName(type);
} else {
folderName = ERepositoryObjectType.getFolderName(type) + "/" + desFolder.getLabel(); //$NON-NLS-1$
}
if (folderName.equals("date")) { //$NON-NLS-1$
continue;
}
IFolder folder = project.getFolder(folderName);
if (type.equals(ERepositoryObjectType.TDQ_SOURCE_FILE_ELEMENT)) {
String name = file.getName();
int indexOf = name.indexOf("."); //$NON-NLS-1$
String label = name.substring(0, indexOf);
String extendtion = name.substring(indexOf + 1);
createSourceFileItem(file, Path.EMPTY, label, extendtion);
} else {
copyFileToFolder(openStream, fileName, folder);
}
openStream.close();
} catch (IOException e) {
log.error(e, e);
} catch (PersistenceException e) {
log.error(e, e);
}
}
}
/**
*
* DOC klliu Comment method "copyFileToFolder".
*
* @param inputStream
* @param fileName
* @param folder
* @throws CoreException
* @throws IOException
*/
private void copyFileToFolder(InputStream inputStream, String fileName, IFolder folder, boolean... isImportItem)
throws CoreException, IOException {
if (inputStream == null) {
return;
}
IFile elementFile = folder.getFile(fileName);
if (!elementFile.exists()) {
elementFile.create(inputStream, false, null);
ModelElement modelElement = ModelElementFileFactory.getModelElement(elementFile);
if (modelElement != null) {
AElementPersistance writer = ElementWriterFactory.getInstance().create(elementFile.getFileExtension());
if (writer != null) {
Property initProperty = writer.initProperty(modelElement);
String propFileName = initProperty.getLabel() + "_" + initProperty.getVersion() + "." //$NON-NLS-1$ //$NON-NLS-2$
+ elementFile.getFileExtension();
IFile file = elementFile.getParent().getFile(new Path(propFileName));
if (file == null || !file.exists()) {
writer.create(modelElement, folder, isImportItem);
}
elementFile.delete(true, null);
}
}
}
}
public TDQSourceFileItem createSourceFileItem(File initFile, IPath path, String label, String extension) {
Property property = PropertiesFactory.eINSTANCE.createProperty();
property.setVersion(VersionUtils.DEFAULT_VERSION);
property.setStatusCode(PluginConstant.EMPTY_STRING);
property.setLabel(label);
TDQSourceFileItem sourceFileItem = org.talend.dataquality.properties.PropertiesFactory.eINSTANCE
.createTDQSourceFileItem();
sourceFileItem.setProperty(property);
sourceFileItem.setName(label);
sourceFileItem.setExtension(extension);
ByteArray byteArray = PropertiesFactory.eINSTANCE.createByteArray();
try {
byteArray.setInnerContentFromFile(initFile);
} catch (IOException e) {
ExceptionHandler.process(e);
}
sourceFileItem.setContent(byteArray);
String sqlFileName = property.getLabel() + "_" + property.getVersion() + "." //$NON-NLS-1$ //$NON-NLS-2$
+ extension;
IFile file = ResourceManager.getSourceFileFolder().getFile(path.append(new Path(sqlFileName)));
if (file == null || !file.exists()) {
IProxyRepositoryFactory repositoryFactory = ProxyRepositoryFactory.getInstance();
try {
property.setId(repositoryFactory.getNextId());
repositoryFactory.create(sourceFileItem, path);
} catch (PersistenceException e) {
ExceptionHandler.process(e);
}
}
return sourceFileItem;
}
/**
*
* DOC qiongli Comment method "createSourceFileItem".
*
* @param content:cotanin sql sentence
* @param path
* @param label:file name
* @param extension:file extension
* @return
*/
public TDQSourceFileItem createSourceFileItem(String content, IPath path, String label, String extension) {
Property property = PropertiesFactory.eINSTANCE.createProperty();
property.setVersion(VersionUtils.DEFAULT_VERSION);
property.setStatusCode(PluginConstant.EMPTY_STRING);
property.setLabel(label);
TDQSourceFileItem sourceFileItem = org.talend.dataquality.properties.PropertiesFactory.eINSTANCE
.createTDQSourceFileItem();
sourceFileItem.setProperty(property);
sourceFileItem.setName(label);
sourceFileItem.setExtension(extension);
ByteArray byteArray = PropertiesFactory.eINSTANCE.createByteArray();
// MOD sizhaoliu 2012-04-02 for TDQ-5070 Encoding issue with saving generated sql query action
byteArray.setInnerContent(content.getBytes(Charset.forName("UTF-8"))); //$NON-NLS-1$
sourceFileItem.setContent(byteArray);
IProxyRepositoryFactory repositoryFactory = ProxyRepositoryFactory.getInstance();
try {
property.setId(repositoryFactory.getNextId());
repositoryFactory.create(sourceFileItem, path);
} catch (PersistenceException e) {
ExceptionHandler.process(e);
}
return sourceFileItem;
}
/**
* Method "isNeedCreateStructure" created by bzhou@talend.com.
*
* @return true if need to create new resource structure.
*/
public boolean isNeedCreateStructure() {
// MOD zshen when use commandLine application maybe there don't should have a project, so before there should
// create a new project firstly.
if (!ResourceManager.getRootProject().exists()) {
return false;
}
// ~zshen
// MOD klliu bug TDQ-3897 2011-11-08
// if (isSecludedVersion()) {
// return !ResourceService.checkSecludedResource();
// }
//
// return !ResourceService.checkResource();
// we only check the dq structure is on workspace,otherwise it will be created.
return !ResourceService.checkSecludedResource() && !ResourceService.checkResource();
}
/**
* DOC bZhou Comment method "isNeedMigration".
*
* @return
*/
public boolean isNeedMigration() {
if (isSecludedVersion()) {
return true;
}
ProductVersion wVersion = WorkspaceVersionHelper.getVesion();
ProductVersion cVersion = CorePlugin.getDefault().getProductVersion();
return wVersion.compareTo(cVersion) < 0;
}
/**
* Method "isSecludedVersion" created by bzhou@talend.com.
*
* @return true if version is before 3.0.0
*/
private boolean isSecludedVersion() {
return !WorkspaceVersionHelper.getVersionFile().exists();
}
/**
* Creates a new project resource with the special name.MOD mzhao 2009-03-18 make this method as public.For
* {@link org.talend.dataprofiler.core.migration.impl.TDCPFolderMergeTask} use.
*
* @return the created project resource, or <code>null</code> if the project was not created
* @throws InterruptedException
* @throws InvocationTargetException
* @throws CoreException
*/
public IProject createNewProject(String projectName) throws InvocationTargetException, InterruptedException, CoreException {
// get a project handle
final IProject newProjectHandle = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
IWorkspace workspace = ResourcesPlugin.getWorkspace();
final IProjectDescription description = workspace.newProjectDescription(newProjectHandle.getName());
// create the new project operation
IRunnableWithProgress op = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException {
CreateProjectOperation createProjOp = new CreateProjectOperation(description,
DefaultMessagesImpl.getString("DQStructureManager.createDataProfile")); //$NON-NLS-1$
try {
PlatformUI.getWorkbench().getOperationSupport().getOperationHistory()
.execute(createProjOp, monitor, WorkspaceUndoUtil.getUIInfoAdapter(null));
} catch (ExecutionException e) {
throw new InvocationTargetException(e);
}
}
};
// run the new project creation o`peration
// try {
// MOD mzhao 2009-03-16 Feature 6066 First check whether project with
// this name already exist or not. For TDCP
// launching,
// project always exist.
if (!newProjectHandle.exists()) {
ProgressUI.popProgressDialog(op);
}
return newProjectHandle;
}
/**
* DOC bzhou Comment method "createNewFolder".
*
* @param parent
* @param constant
* @return
* @throws CoreException
* @deprecated
*/
@Deprecated
public IFolder createNewFolder(IContainer parent, EResourceConstant constant) throws CoreException {
return createNewFolder(parent, constant.getName());
}
/**
* Method "createNewFolder" creates a new folder.
*
* @param parent
* @param folderName
* @return
* @throws CoreException
* @deprecated
*/
@Deprecated
public IFolder createNewFolder(IContainer parent, String folderName) throws CoreException {
IFolder desFolder = null;
if (parent instanceof IProject) {
desFolder = ((IProject) parent).getFolder(folderName);
} else if (parent instanceof IFolder) {
desFolder = ((IFolder) parent).getFolder(folderName);
}
assert desFolder != null;
if (desFolder != null && !desFolder.exists()) {
desFolder.create(false, true, null);
}
return desFolder;
}
/**
* Copy the files from srcPath to destination folder.
*
* @param srcPath The path name in which to look. The path is always relative to the root of this bundle and may
* begin with "/". A path value of "/" indicates the root of this bundle.
* @param srcPath
* @param recurse If <code>true</code>, recurse into subdirectories(contains directories). Otherwise only return
* entries from the specified path.
* @param desFolder
* @throws IOException
* @throws CoreException
*/
public void copyFilesToFolder(Plugin plugin, String srcPath, boolean recurse, IFolder desFolder, String suffix,
boolean... isImportItem) throws IOException, CoreException {
if (plugin == null) {
return;
}
Enumeration<?> paths = null;
paths = plugin.getBundle().getEntryPaths(srcPath);
if (paths == null) {
return;
}
while (paths.hasMoreElements()) {
String nextElement = (String) paths.nextElement();
String currentPath = "/" + nextElement; //$NON-NLS-1$
URL resourceURL = plugin.getBundle().getEntry(currentPath);
URL fileURL = null;
File file = null;
try {
fileURL = FileLocator.toFileURL(resourceURL);
file = new File(fileURL.getFile());
if (file.isDirectory() && recurse) {
if (file.getName().startsWith(".")) { //$NON-NLS-1$
continue;
}
IFolder folder = desFolder.getFolder(file.getName());
if (!folder.exists()) {
// ProxyRepositoryFactory.getInstance().createFolder(ERepositoryObjectType., path, label)
folder.create(true, true, null);
// this.createDQStructure();
}
copyFilesToFolder(plugin, currentPath, recurse, folder, suffix, isImportItem);
continue;
}
if (suffix != null && !file.getName().endsWith(suffix)) {
continue;
}
String fileName = new Path(fileURL.getPath()).lastSegment();
InputStream openStream = null;
openStream = fileURL.openStream();
copyFileToFolder(openStream, fileName, desFolder, isImportItem);
openStream.close();
} catch (IOException e) {
log.error(e, e);
}
}
}
public boolean isPathValid(IPath path, String label) {
IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(path);
IFolder newFolder = folder.getFolder(label);
return !newFolder.exists();
}
}