// ============================================================================
//
// 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.mdm.repository.core.impl;
import java.io.IOException;
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.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.model.properties.ByteArray;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.PropertiesFactory;
import org.talend.core.model.properties.Property;
import org.talend.core.model.properties.ReferenceFileItem;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.repository.utils.XmiResourceManager;
import org.talend.mdm.repository.core.IRepositoryNodeResourceProvider;
import org.talend.mdm.repository.model.mdmproperties.ContainerItem;
import org.talend.mdm.repository.model.mdmproperties.MDMServerObjectItem;
/**
* DOC hbhong class global comment. Detailled comment <br/>
*
*/
public abstract class AbstractRepositoryNodeResourceProvider implements IRepositoryNodeResourceProvider {
Logger log = Logger.getLogger(AbstractRepositoryNodeResourceProvider.class);
protected XmiResourceManager xmiResourceManager = ProxyRepositoryFactory.getInstance().getRepositoryFactoryFromProvider()
.getResourceManager();
protected Resource createCommonItemResource(IProject project, Item item, ERepositoryObjectType repositoryType, IPath path)
throws PersistenceException {
return xmiResourceManager.createItemResource(project, item, path, repositoryType, false);
}
public boolean canHandleItem(Item item) {
if (item instanceof ContainerItem) {
return canHandleRepObjType(((ContainerItem) item).getRepObjType());
}
ERepositoryObjectType repObjType = getRepositoryObjectType(item);
return repObjType != null;
}
public Resource save(Item item) throws PersistenceException {
if (item instanceof MDMServerObjectItem) {
return xmiResourceManager.getItemResource(item);
}
return null;
}
public List<IRepositoryViewObject> findMember(IProject project, ERepositoryObjectType type, boolean hasSystemFolder) {
String folderPath = type.getFolder();
IFolder folder = project.getFolder(folderPath);
if (!folder.exists()) {
try {
folder.create(true, true, null);
} catch (CoreException e) {
log.error(e.getMessage(), e);
}
}
return findMember(folder, type);
}
/**
* DOC hbhong Comment method "findMember".
*
* @param folder
* @param type
* @return
*/
private List<IRepositoryViewObject> findMember(IFolder folder, ERepositoryObjectType type) {
List<IRepositoryViewObject> viewObjs = new ArrayList<IRepositoryViewObject>();
try {
for (IResource resource : folder.members()) {
if (resource instanceof IFile) {
if (xmiResourceManager.isPropertyFile((IFile) resource)) {
Property property = xmiResourceManager.loadProperty(resource);
}
}
}
} catch (CoreException e) {
log.error(e.getMessage(), e);
}
return null;
}
public boolean needSaveReferenceFile() {
return false;
}
public void handleReferenceFile(Item item) {
// do nothing
}
protected void linkReferenceFile(Item item, IFile file) {
linkReferenceFile(item, file, false);
}
public void linkReferenceFile(Item item, IFile file, boolean updateRefName) {
try {
file.refreshLocal(0, null);
ReferenceFileItem fileItem = findReferenceFileItem(item, file);
if (fileItem != null) {
fileItem.getContent().setInnerContentFromFile(file);
} else {
ReferenceFileItem procFileItem = PropertiesFactory.eINSTANCE.createReferenceFileItem();
ByteArray byteArray = PropertiesFactory.eINSTANCE.createByteArray();
byteArray.setInnerContentFromFile(file);
procFileItem.setContent(byteArray);
String fileExt = file.getFileExtension();
procFileItem.setExtension(fileExt);
// set name
if (updateRefName) {
String fileName = file.getName();
int index = fileName.lastIndexOf(fileExt);
if (index > 0) {
String name = fileName.substring(0, index - 1);
procFileItem.setName(name);
}
}
// item.getReferenceResources().clear();
item.getReferenceResources().add(procFileItem);
}
} catch (IOException e) {
log.error(e.getMessage(), e);
} catch (CoreException e) {
log.error(e.getMessage(), e);
}
}
private ReferenceFileItem findReferenceFileItem(Item item, IFile file) {
EList referenceResources = item.getReferenceResources();
if (referenceResources != null) {
for (Object refObj : referenceResources) {
ReferenceFileItem fileItem = (ReferenceFileItem) refObj;
URI uri = fileItem.getContent().eResource().getURI();
String name = uri.lastSegment();
if (name != null && name.equals(file.getName())) {
return fileItem;
}
}
}
return null;
}
public void postDelete(String name, String version) {
// do nothing
}
}