// ============================================================================
//
// 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.helper;
import java.io.File;
import java.io.FileInputStream;
import java.net.URL;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.navigator.CommonViewer;
import org.eclipse.ui.part.FileEditorInput;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.commons.utils.WorkspaceUtils;
import org.talend.core.model.properties.FolderItem;
import org.talend.core.model.properties.Item;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.Folder;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.dataprofiler.core.CorePlugin;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.ui.utils.MessageUI;
import org.talend.dq.helper.FileUtils;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.nodes.JrxmlTempSubFolderNode;
import org.talend.dq.nodes.JrxmlTempleteRepNode;
import org.talend.dq.nodes.SourceFileRepNode;
import org.talend.dq.nodes.SourceFileSubFolderNode;
import org.talend.repository.ProjectManager;
import org.talend.repository.RepositoryWorkUnit;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.RepositoryNode;
import org.talend.resource.ResourceManager;
import org.talend.utils.sugars.ReturnCode;
import orgomg.cwm.objectmodel.core.ModelElement;
/**
* DOC mzhao class global comment. Detailled comment
*/
public final class WorkspaceResourceHelper {
public static final String COMMA = ", "; //$NON-NLS-1$
private WorkspaceResourceHelper() {
}
/**
*
* DOC Administrator Comment method "getModelElementPath".
*
* @param me
* @return
*/
public static IPath getModelElementPath(ModelElement me) {
return WorkspaceUtils.getModelElementResource(me).getFullPath();
}
/**
* DOC bZhou Comment method "getInstallPath".
*
* @return the install path for the current release.
*/
public static String getInstallPath() {
return Platform.getInstallLocation().getURL().getPath().substring(1);
}
/**
* DOC bZhou Comment method "getLocationPath".
*
* @return
*/
public static String getLocationPath() {
return Platform.getInstanceLocation().getURL().getPath().substring(1);
}
/**
* DOC bZhou Comment method "computeFileFromPlugin".
*
* @param plugin
* @param srcPath
* @param recurse
* @param desFolder
* @param suffix
* @param type
* @param resultMap
* @throws Exception
*/
public static void computeFileFromPlugin(Plugin plugin, String srcPath, boolean recurse, Folder desFolder,
Set<String> suffix, ERepositoryObjectType type, Map<File, IPath> resultMap) throws Exception {
if (plugin == null || srcPath == null) {
return;
}
IProject project = ResourceManager.getRootProject();
Enumeration<String> paths = plugin.getBundle().getEntryPaths(srcPath);
while (paths != null && paths.hasMoreElements()) {
String nextElement = paths.nextElement();
String currentPath = "/" + nextElement; //$NON-NLS-1$
URL resourceURL = plugin.getBundle().getEntry(currentPath);
URL fileURL = null;
File file = null;
fileURL = FileLocator.toFileURL(resourceURL);
file = new File(fileURL.getFile());
String fileName = file.getName();
if (file.isDirectory() && recurse) {
if (fileName.startsWith(".")) { //$NON-NLS-1$
continue;
}
Folder folder = null;
if (!project.getFolder(fileName).exists()) {
folder = ProxyRepositoryFactory.getInstance().createFolder(type, Path.EMPTY, fileName);
} else {
IPath fullPath = new Path(file.getPath());
int count = fullPath.segmentCount();
FolderItem folderItem = ProxyRepositoryFactory.getInstance().getFolderItem(
ProjectManager.getInstance().getCurrentProject(), type, fullPath.removeFirstSegments(count - 1));
if (folderItem == null) {
folder = ProxyRepositoryFactory.getInstance().createFolder(type, Path.EMPTY, fileName);
} else {
folder = new Folder(folderItem.getProperty(), type);
}
}
computeFileFromPlugin(plugin, currentPath, recurse, folder, suffix, type, resultMap);
continue;
}
// MOD msjian TDQ-4608 2012-3-6: deal with the *.jasper file
if (suffix != null && !suffix.contains(FileUtils.getExtension(file))) {
continue;
}
String folderName = null;
folderName = file.getParentFile().getName();
// TDQ-4608 ~
IFolder folder = project.getFolder(folderName);
int segmentCount = folder.getFullPath().segmentCount();
IPath parentPath = folder.getFullPath().removeFirstSegments(segmentCount - 1);
resultMap.put(file, parentPath);
}
}
/**
* if the source file has been opened then return true.
*
* @param sourceNode the source file node
* @return
*/
public static boolean sourceFileHasBeenOpened(IRepositoryNode sourceNode) {
boolean opened = false;
if (sourceNode != null) {
IWorkbenchWindow workbenchWindow = CorePlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
if (workbenchWindow == null) {
IWorkbenchWindow[] workbenchWindows = CorePlugin.getDefault().getWorkbench().getWorkbenchWindows();
if (workbenchWindows != null && workbenchWindows.length > 0) {
workbenchWindow = workbenchWindows[0];
}
}
if (workbenchWindow != null) {
IWorkbenchPage activePage = workbenchWindow.getActivePage();
if (activePage != null) {
IEditorReference[] editorReferences = activePage.getEditorReferences();
if (editorReferences != null) {
for (IEditorReference reference : editorReferences) {
try {
IEditorInput editorInput = reference.getEditorInput();
if (editorInput != null && editorInput instanceof FileEditorInput) {
FileEditorInput fileInput = (FileEditorInput) editorInput;
IFile nodeFile = RepositoryNodeHelper.getIFile(sourceNode);
if (nodeFile != null
&& nodeFile.getFullPath().toString()
.equals(fileInput.getFile().getFullPath().toString())) {
opened = true;
break;
}
}
} catch (PartInitException e) {
e.printStackTrace();
}
}
}
}
}
}
return opened;
}
/**
* DOC xqliu Comment method "checkSourceFileNodeOpening".
*
* @param node
* @return
*/
public static ReturnCode checkSourceFileNodeOpening(RepositoryNode node) {
boolean opened = false;
String msg = ""; //$NON-NLS-1$
if (WorkspaceResourceHelper.sourceFileHasBeenOpened(node)) {
opened = true;
msg += node.getLabel() + COMMA;
}
return new ReturnCode(msg, opened);
}
/**
* DOC xqliu Comment method "checkSourceFileSubFolderNodeOpening".
*
* @param node
* @return
*/
public static ReturnCode checkSourceFileSubFolderNodeOpening(RepositoryNode node) {
boolean opened = false;
String msg = ""; //$NON-NLS-1$
List<IRepositoryNode> children = node.getChildren();
for (IRepositoryNode iNode : children) {
if (iNode instanceof SourceFileRepNode || iNode instanceof JrxmlTempleteRepNode) {
ReturnCode rc = checkSourceFileNodeOpening((RepositoryNode) iNode);
if (rc.isOk()) {
opened = rc.isOk();
msg += rc.getMessage();
}
} else if (iNode instanceof SourceFileSubFolderNode || iNode instanceof JrxmlTempSubFolderNode) {
ReturnCode rc = checkSourceFileSubFolderNodeOpening((RepositoryNode) iNode);
if (rc.isOk()) {
opened = rc.isOk();
msg += rc.getMessage();
}
}
}
return new ReturnCode(msg, opened);
}
/**
* DOC xqliu Comment method "showSourceFilesOpeningWarnMessages".
*
* @param openSourceFileNames
*/
public static void showSourceFilesOpeningWarnMessages(String openSourceFileNames) {
if (openSourceFileNames == null || openSourceFileNames.trim().length() == 0) {
return;
}
String sourcFileNames = openSourceFileNames;
if (sourcFileNames.endsWith(COMMA)) {
sourcFileNames = openSourceFileNames.substring(0, openSourceFileNames.lastIndexOf(COMMA));
}
String msgTag = "SourceFileAction.sourceFileOpening"; //$NON-NLS-1$
if (sourcFileNames.indexOf(COMMA) > -1) {
msgTag = "SourceFileAction.sourceFilesOpening"; //$NON-NLS-1$
}
MessageUI.openWarning(DefaultMessagesImpl.getString(msgTag, sourcFileNames));
}
/**
* Refresh the related Repository node of the item in the view
*
* @param item
*/
public static void refreshItem(Item item) {
// if repository view don't open we will not need to do it
CommonViewer dqCommonViewer = RepositoryNodeHelper.getDQCommonViewer();
if (dqCommonViewer != null) {
RepositoryNode recursiveFind = RepositoryNodeHelper.recursiveFind(item.getProperty());
CorePlugin.getDefault().refreshDQView(recursiveFind);
}
}
/**
*
* create a IFile from File inputStream.
*
* @param sourceFile
* @param targetIFile
* @param message
*/
public static void createIFileFromFile(File sourceFile, IFile targetIFile, String message) {
final IFile ifile = targetIFile;
final File srcFile = sourceFile;
RepositoryWorkUnit<Object> workUnit = new RepositoryWorkUnit<Object>(message) {
@Override
protected void run() {
try {
File targetfile = WorkspaceUtils.ifileToFile(ifile);
if (!targetfile.exists() || srcFile.lastModified() > targetfile.lastModified()) {
FileInputStream fileInputStream = new FileInputStream(srcFile);
ifile.create(fileInputStream, Boolean.TRUE, new NullProgressMonitor());
fileInputStream.close();
}
} catch (Exception e) {
ExceptionHandler.process(e);
}
}
};
workUnit.setAvoidUnloadResources(true);
ProxyRepositoryFactory.getInstance().executeRepositoryWorkUnit(workUnit);
}
}