/**
* Դ�������ƣ�MetadataItemRefResourceChange.java
* �������Ȩ���������ӹɷ�����˾ ��Ȩ����
* ϵͳ���ƣ�JRES Studio
* ģ�����ƣ�com.hundsun.ares.studio.jres.metadata.ui
* ����˵����$desc
* ����ĵ���
* ���ߣ�
*/
package com.hundsun.ares.studio.jres.metadata.ui.refactor;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.resource.ResourceChange;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.core.ResourceTypeMapping;
import com.hundsun.ares.studio.core.model.IReferenceProvider;
import com.hundsun.ares.studio.core.model.Reference;
import com.hundsun.ares.studio.core.model.impl.ConditionReference;
import com.hundsun.ares.studio.core.registry.ARESResRegistry;
import com.hundsun.ares.studio.core.registry.IResDescriptor;
import com.hundsun.ares.studio.jres.model.metadata.MetadataItem;
/**
* @author qinyuan
*
*/
public class MetadataItemRefResourceChange extends ResourceChange {
private String oldName;
private String newName;
private MetadataItem item;
private IARESResource selfResource; //Ԫ���ݵ���Դ���������ķ�����
private IARESResource resource; //��������item���ڵ���Դ
/**
* @param oldName
* @param newName
* @param item
*/
public MetadataItemRefResourceChange(String oldName, String newName,IARESResource selfRes ,IARESResource tarRes) {
this.oldName = oldName;
this.newName = newName;
this.selfResource = selfRes;
this.resource = tarRes;
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.resource.ResourceChange#getModifiedResource()
*/
@Override
protected IResource getModifiedResource() {
return resource.getResource();
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.Change#getName()
*/
@Override
public String getName() {
return oldName + " ������Ϊ: " + this.newName;
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.Change#perform(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public Change perform(IProgressMonitor pm) throws CoreException {
Class<?> clazz = null;
IReferenceProvider provider = (IReferenceProvider)resource.getAdapter(IReferenceProvider.class);
String type = ResourceTypeMapping.getInstance().getReferenceType(selfResource.getType());
boolean isChanged = false;
for ( Reference reference : provider.getReferences()) {
if (reference instanceof ConditionReference){//��������������reference
Map<Object,Object> parameters = new HashMap<Object,Object>();
String version = selfResource.getARESProject().getProjectProperty().getVersion();
parameters.put("oldValue", oldName);
parameters.put("newValue", newName);
parameters.put("version", version);
if(StringUtils.equals(type, reference.getType())&& ((ConditionReference)reference).canDo(parameters)){//�Ƿ��ܹ�Ҫ��������������ȷ��
reference.setValue(newName);
isChanged = true;
}
}else if(StringUtils.equals(type, reference.getType()) && StringUtils.equals(oldName, reference.getValue())){//һ�����ع�
reference.setValue(newName);
isChanged = true;
}
}
//����ļ�¼
ARESResRegistry reg = ARESResRegistry.getInstance();
IResDescriptor desc = reg.getResDescriptor(resource.getElementName());
if (desc == null){
desc = reg.getResDescriptor(resource.getType());
}
clazz = desc.createInfo().getClass();
if(isChanged){
//����ļ�¼
resource.save(resource.getInfo(clazz), true, null);//ÿ����Դֻ����һ��
}
return new MetadataItemRefResourceChange(newName , oldName ,selfResource , resource);
}
}