/**
* <p>Copyright: Copyright (c) 2013</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.model.reference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.reference.ViewerUtils;
/**
* @author liaogc
* ������ù�ϵһϵ�з�������
*
*/
public class RelationOperator {
private RelationRefTypesMapEntry entry = null;
public RelationOperator(RelationRefTypesMapEntry entry){
this.entry = entry;
}
/**
* ����refType,resName�Լ�refNamespace��ù�ϵ�б�
* @param refType
* @param refName
* @param refNamespace
* @return
*/
public EList<RelationInfo> getRelationInfos(String refType, String refName, String refNamespace){
EList<RelationInfo> result = new BasicEList<RelationInfo>();
RelationRefNamesMapEntry refNamesMapEntry = entry.getRelations().get(refType);
if (refNamesMapEntry != null){
List<RelationInfo> relationInfoList =refNamesMapEntry.getRelationInfoByRefName(refName);
if(StringUtils.isNotBlank(refNamespace)){
for(RelationInfo relationInfo:relationInfoList){
if(StringUtils.equals(relationInfo.getUsedRefNamespace(), refNamespace)){
result.add(relationInfo);
}
}
}else{
result.addAll(refNamesMapEntry.getRelationInfoByRefName(refName));
}
}
return result;
}
/**
* ����refType�Լ�resName��ù�ϵ�б�
* @param refType
* @param refName
* @return
*/
public EList<RelationInfo> getRelationInfos(String refType, String refName){
EList<RelationInfo> result = new BasicEList<RelationInfo>();
result.addAll(entry.getRelationInfosByRefTypeAndRefName(refType, refName));
return result;
}
/**
* ����Դɾ��ʱ�����ù�ϵ
* @param resource
*/
public void removeRelationsByResource(IARESResource resource){
//�����ٶȿ��ܸ���
List<RelationInfo> allRelationList = ViewerUtils.getRelationInfos(resource, Collections.emptyMap());
ListMultimap<String,RelationInfo> allRelationMap = getRelationCategoryByRefType(allRelationList);
for(String refType:allRelationMap.keySet()){
for(RelationInfo relationInfo:allRelationMap.get(refType)){
RelationRefNamesMapEntry refNamesMapEntry = entry.getRelations().get(refType);
if(refNamesMapEntry!=null){
refNamesMapEntry.getRelationInfoByRefName(relationInfo.getUsedRefName()).remove(relationInfo);
}
}
}
}
/**
* ����Դ��ʱ�������ù�ϵ
*
* @param resource
*/
public void updateRelationsByResourceChange(IARESResource resource,List<RelationInfo> oldElements, List<RelationInfo> newElements) {
ListMultimap<String,RelationInfo> oldMap = getRelationCategoryByRefType(oldElements);
ListMultimap<String,RelationInfo> newMap = getRelationCategoryByRefType(newElements);
//���������ù�ϵɾ���ɵĹ�ϵ
for(String refType:oldMap.keySet()){
for(RelationInfo oldRelationInfo:oldMap.get(refType)){
RelationRefNamesMapEntry refNamesMapEntry = entry.getRelations().get(refType);
if(refNamesMapEntry!=null){
refNamesMapEntry.getRelationInfoByRefName(oldRelationInfo.getUsedRefName()).remove(oldRelationInfo);
}
}
}
//�����µĹ�ϵ
for(String refType:newMap.keySet()){
for(RelationInfo newRelationInfo:newMap.get(refType)){
RelationRefNamesMapEntry refNamesMapEntry = entry.getRelations().get(refType);
if(refNamesMapEntry!=null){
refNamesMapEntry.addRelation(newRelationInfo);
}else{
RelationRefNamesMapEntry newRefTypeMapEntry = new RelationRefNamesMapEntry();
newRefTypeMapEntry.addRelation(newRelationInfo);
entry.getRelations().put(newRelationInfo.getUsedRefType(), newRefTypeMapEntry);
}
}
}
}
/**
* ������еĹ�ϵ
* @return
*/
public List<RelationInfo> getAllRelation(){
List<RelationInfo> allRelationInfo = new ArrayList<RelationInfo>();
for(String refType:entry.getRelations().keySet()){
RelationRefNamesMapEntry refNamesMapEntry = entry.getRelations().get(refType);
if(refNamesMapEntry!=null){
allRelationInfo.addAll(refNamesMapEntry.values());
}
}
return allRelationInfo;
}
/**
* ��ʼ�����ù�ϵ
* @param relationInfoList
*/
public void initProjectRelation( List<RelationInfo> relationInfoList ){
ListMultimap<String,RelationInfo> relationInfoMap = getRelationCategoryByRefType(relationInfoList);
for(String refType:relationInfoMap.keySet()){
RelationRefNamesMapEntry refNamesMapEntry = entry.getRelations().get(refType);
if(refNamesMapEntry!=null){
for(RelationInfo relationInfo:relationInfoMap.get(refType)){
refNamesMapEntry.addRelation(relationInfo);
}
}else{
RelationRefNamesMapEntry newRefNamesMapEntry = new RelationRefNamesMapEntry();
for(RelationInfo relationInfo:relationInfoMap.get(refType)){
newRefNamesMapEntry.addRelation(relationInfo);
}
entry.getRelations().put(refType, newRefNamesMapEntry);
}
}
}
/**
* ���ݹ�ϵ���ͷ���
* @param relationInfoList
* @return
*/
private ListMultimap<String,RelationInfo> getRelationCategoryByRefType(List<RelationInfo> relationInfoList){
ListMultimap<String,RelationInfo> relationInfoMap = ArrayListMultimap.create() ;
for(RelationInfo relationInfo:relationInfoList){
relationInfoMap.get(relationInfo.getUsedRefType()).add(relationInfo);
}
return relationInfoMap;
}
}