/**
* Դ�������ƣ�DependencyBuilderUtil.java
* �������Ȩ���������ӹɷ�����˾ ��Ȩ����
* ϵͳ���ƣ�JRES Studio
* ģ�����ƣ�com.hundsun.ares.studio.jres.core
* ����˵����$desc
* ����ĵ���
* ���ߣ�sundl
*/
package com.hundsun.ares.studio.core.builder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import com.hundsun.ares.studio.core.ARESModelException;
import com.hundsun.ares.studio.core.IARESProblem;
import com.hundsun.ares.studio.core.IARESProject;
import com.hundsun.ares.studio.core.IARESProjectProperty;
import com.hundsun.ares.studio.core.IDependencyUnit;
import com.hundsun.ares.studio.core.IReferencedLibrary;
import com.hundsun.ares.studio.core.util.Util;
import com.hundsun.ares.studio.core.validate.ReferenceLibValidator;
import com.hundsun.ares.studio.internal.core.ARESProject;
/**
* ��������Build��
* @author sundl
*/
public class DependencyBuilderUtil {
/**
* �����Ŀ������
* @param project
* @param monitor
*/
public static void validateDependencies(IARESProject project, IProgressMonitor monitor) {
List<IDependencyUnit> dependencies = project.getDependencies();
monitor = Util.monitorFor(monitor);
monitor.beginTask("", dependencies.size() + 1);
// ��ʼ������������Ϣת��Map����ʽ������ʹ�ã�Ч��Ҳ����
Multimap<String , IDependencyUnit> units = ArrayListMultimap.create();
for (IDependencyUnit unit : dependencies) {
units.put(unit.getId(), unit);
}
monitor.subTask("�����Ŀ����ID");
IARESProblem problem = ReferenceLibValidator.validateProjectNamespace(project);
if (problem != null) {
// �����ռ��ͻ�Ĵ�����ӵ�����������
AresProjectBuilderUtil.markProblems(project.getProperty().getResource(), Arrays.asList(problem));
}
monitor.worked(1);
for (IDependencyUnit unit : dependencies) {
if (monitor.isCanceled())
break;
monitor.subTask("���ڼ��" + unit.getDescriptionStr());
List<IARESProblem> problems = new ArrayList<IARESProblem>();
// 1. �����ռ��Ƿ�������������ͻ
List<IARESProblem> conflicts = ReferenceLibValidator.validateIdConfilicts(unit, project, units);
problems.addAll(conflicts);
// 2. �Լ��������Ƿ�����
List<IARESProblem> dependencyProblems = ReferenceLibValidator.validateDependencies(unit, units);
problems.addAll(dependencyProblems);
IResource resToMark = null;
if (unit instanceof IReferencedLibrary) {
resToMark = ((IReferencedLibrary) unit).getResource();
}
// ����Ҳ������ʵĵط����Marker������ӵ���Ŀ��
if (resToMark == null) {
resToMark = project.getProject();
}
AresProjectBuilderUtil.clearMarkers(resToMark,IAresMarkers.REFERLIB_MARKER_ID,false);
AresProjectBuilderUtil.markProblems(resToMark, problems);
monitor.worked(1);
}
monitor.done();
}
/**
* @param project
* @param delta
* @return
*/
public static boolean needBuild(IARESProject project, IResourceDelta delta) {
try {
if (delta.findMember(new Path(ARESProject.RES_PATH_FILE)) != null
|| delta.findMember(new Path(IARESProjectProperty.PRO_FILE)) != null) {
return true;
} else {
List<IReferencedLibrary> libs = Arrays.asList(project.getReferencedLibs());
for (IReferencedLibrary lib : libs) {
IResourceDelta subDelta = delta.findMember(lib.getPath().makeRelativeTo(project.getProject().getFullPath()));
if (subDelta != null) {
// Ŀǰ�����������һ�����ð������˱仯���ͱ������¼�����еİ���Ϊ�˼�������ռ�
return true;
}
}
}
} catch (ARESModelException e) {
e.printStackTrace();
}
return false;
}
}