// ============================================================================
//
// 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.dq.helper.resourcehelper;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.talend.commons.utils.platform.PluginChecker;
import org.talend.cwm.management.i18n.Messages;
import org.talend.dq.writer.AElementPersistance;
import org.talend.dq.writer.EMFSharedResources;
import org.talend.dq.writer.impl.ElementWriterFactory;
import org.talend.resource.ResourceManager;
import org.talend.utils.sugars.ReturnCode;
import orgomg.cwm.objectmodel.core.ModelElement;
/**
* DOC rli class global comment. Detailled comment
*
*/
public abstract class ResourceFileMap {
private static Logger log = Logger.getLogger(ResourceFileMap.class);
public static List<ModelElement> getAll() {
List<ModelElement> all = new ArrayList<ModelElement>();
all.addAll(AnaResourceFileHelper.getInstance().getAllElement());
all.addAll(DQRuleResourceFileHelper.getInstance().getAllElement());
all.addAll(IndicatorResourceFileHelper.getInstance().getAllElement());
all.addAll(PatternResourceFileHelper.getInstance().getAllElement());
all.addAll(PrvResourceFileHelper.getInstance().getAllElement());
if (!PluginChecker.isOnlyTopLoaded()) {
all.addAll(RepResourceFileHelper.getInstance().getAllElement());
}
return all;
}
/**
* DOC bZhou Comment method "getFileResource".
*
* @param file
* @return get null if the file is not exist.
*/
public synchronized Resource getFileResource(IFile file) {
if (file.exists()) {
URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), false);
Resource res = EMFSharedResources.getInstance().getResource(uri, false);
if (EMFSharedResources.getInstance().isNeedReload(res)) {
res = EMFSharedResources.getInstance().reloadResource(uri);
}
return res;
}
return null;
}
/**
* DOC bZhou Comment method "findCorrespondingFile".
*
* @param element
* @return
*/
public static IFile findCorrespondingFile(ModelElement element) {
assert element != null;
URI uri = null;
if (element.eIsProxy()) {
uri = ((InternalEObject) element).eProxyURI();
} else {
uri = element.eResource().getURI();
}
if (uri != null && uri.isPlatform()) {
IPath path = new Path(uri.toPlatformString(false));
return ResourceManager.getRoot().getFile(path);
}
return null;
}
/**
* DOC bZhou Comment method "getModelElement".
*
* @param IFile
* @return
*/
public final ModelElement getModelElement(IFile file) {
return getModelElement(getFileResource(file));
}
/**
* DOC bZhou Comment method "getModelElement".
*
* @param resource
* @return
*/
public final ModelElement getModelElement(Resource resource) {
if (resource != null) {
EList<EObject> contents = resource.getContents();
if (contents.isEmpty()) {
log.error(Messages.getString("ResourceFileMap.NOCONTENT") + resource);//$NON-NLS-1$
}
if (log.isDebugEnabled()) {
log.debug("Nb elements in contents " + contents.size());//$NON-NLS-1$
log.debug("for URI: " + resource.getURI());//$NON-NLS-1$
}
for (EObject object : contents) {
ModelElement switchObject = doSwitch(object);
if (switchObject != null) {
return switchObject;
}
}
}
return null;
}
/**
* DOC bZhou Comment method "getAll".
*
* @param parentFolder
* @return
*/
public List<? extends ModelElement> getAllElement(IFolder parentFolder) {
List<ModelElement> elementList = new ArrayList<ModelElement>();
try {
List<IFile> allIFiles = searchAllIFiles(parentFolder);
// MOD qiongli 2011-4-19.bug 20566,avoid NPE
ModelElement mod = null;
for (IFile file : allIFiles) {
mod = getModelElement(file);
if (mod != null) {
// MOD msjian TDQ-4672 2012-2-17: modify another issue
elementList.add(mod);
// TDQ-4672~
}
}
} catch (CoreException e) {
log.error(e);
}
return elementList;
}
/**
* DOC bZhou Comment method "getAllElement".
*
* @return
*/
public List<? extends ModelElement> getAllElement() {
return getAllElement(getTypedFolder());
}
/**
* DOC bZhou Comment method "save".
*
* @param dqrule
* @return
* @deprecated use {@link AElementPersistance#save(org.talend.core.model.properties.Item, boolean)} class instead
*/
@Deprecated
public ReturnCode save(ModelElement element) {
AElementPersistance writer = ElementWriterFactory.getInstance().create(element);
return writer.save(element);
}
private List<IFile> searchAllIFiles(IFolder folder) throws CoreException {
List<IFile> fileList = new ArrayList<IFile>();
for (IResource resource : folder.members()) {
if (resource.getType() == IResource.FOLDER) {
fileList.addAll(searchAllIFiles(folder.getFolder(resource.getName())));
continue;
}
IFile file = (IFile) resource;
if (checkFile(file)) {
fileList.add(file);
}
}
return fileList;
}
public abstract IFolder getTypedFolder();
public abstract ModelElement doSwitch(EObject object);
protected abstract boolean checkFile(IFile file);
}