/**
* <p>Copyright: Copyright (c) 2009</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.core.validate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
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 com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import com.hundsun.ares.studio.core.ARESModelException;
import com.hundsun.ares.studio.core.ARESProblem;
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.IDependenceDescriptor;
import com.hundsun.ares.studio.core.IDependencyUnit;
import com.hundsun.ares.studio.core.IReferencedLibrary;
import com.hundsun.ares.studio.core.builder.DependencyBuilderUtil;
import com.hundsun.ares.studio.core.builder.IAresMarkers;
import com.hundsun.ares.studio.core.util.Util;
/**
* ���ã�������صļ�顣
*/
// * ��ʼ��ʱ��ֻ�����ð����������������ù��̣�����������ֲ�����ʣ����������漰�������ع�����ʱû�ġ�
public class ReferenceLibValidator {
/**
* ���һ����Ŀ����������Ĵ����������ռ��ͻ����������ڵ�...
* �������������ҪΪ�ڵ������ð��ĵط���֤������Ŀ�Ƿ���ڴ��� ��������builder�У��õ�����������������ƣ�����Ϊ�˷������
* Marker���õ�������һ������{@link DependencyBuilderUtil#validateDependencies()}}
* @see DependencyBuilderUtil
* @param project
* @param monitor
* @return
*/
// 2012-2-22 sundl ���������������Ϊ����������Դ���Ĺ��ܻ����ڵ����Ϸ���������Ϊ������·�����������
public static List<IARESProblem> validateProjectDependencies(IARESProject project, IProgressMonitor monitor) {
List<IDependencyUnit> dependencies = project.getDependencies();
List<IARESProblem> result = new ArrayList<IARESProblem>();
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) {
result.add(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();
}
result.addAll(problems);
monitor.worked(1);
}
monitor.done();
return result;
}
/**
* ���������������ռ�ij�ͻ��
* @param units
* @param unitToValidate
* @return
* @author sundl
*/
public static IARESProblem validateNameSpace(Collection<IDependencyUnit> units, IDependencyUnit unitToValidate) {
for (IDependencyUnit unit : units) {
if (unit == unitToValidate)
continue;
if (StringUtils.equals(unit.getId(), unitToValidate.getId())) {
IARESProblem problem = ARESProblem.createError(IAresMarkers.REFERLIB_MARKER_ID);
problem.setMessage(String.format("%s��%s�������ռ��ͻ��", unitToValidate.getDescriptionStr(), unit.getDescriptionStr()));
}
}
return null;
}
/**
* ���������Դ���������ռ�
*
* @param liblist
* ������Դ���б�
* @param slib
* �����������Դ��
* @return
*/
public static IARESProblem validateNameSpace(List<IReferencedLibrary> liblist, IReferencedLibrary slib) {
String sid = slib.getId();
for (IReferencedLibrary tlib : liblist) {
if (!slib.equals(tlib)) { // ��ͬ��������Դ��
String tid = tlib.getId();
if (StringUtils.equals(tid, sid) && StringUtils.equals(slib.getType(), tlib.getType())) {
// �����ռ��ͻ
IARESProblem problem = ARESProblem.createError(IAresMarkers.REFERLIB_MARKER_ID);
problem.setMessage(String.format("������Դ��:%s��������Դ��:%s�����ռ��ͻ��", slib.getElementName(), tlib.getElementName()));
return problem;
}
}
}
return null;
}
/**
* ������������Ŀ�������ռ������Ƿ��������Դ��(�����ù���)��ͻ
* @param aresProject ��Ҫ������Ŀ
* @return
*/
public static IARESProblem validateProjectNamespace(IARESProject aresProject) {
try {
IARESProjectProperty property = aresProject.getProjectProperty();
String pid = property.getId();
if (!StringUtils.isEmpty(pid)) {
for (IDependencyUnit dependency : aresProject.getDependencies()) {
if (StringUtils.equals(pid, dependency.getId())
// 2011-08-25 sundl ����������֤��ͨ��nature���жϣ�
&& aresProject.getProject().hasNature(String.valueOf(dependency.getType()))) {
// �����ռ��ͻ
IARESProblem problem = ARESProblem.createError(IAresMarkers.REFERLIB_MARKER_ID);
problem.setMessage(String.format("��Ŀ��:%s�����ռ��ͻ��", dependency.getDescriptionStr()));
return problem;
}
}
}
} catch (ARESModelException e1) {
e1.printStackTrace();
} catch (CoreException e2) {
e2.printStackTrace();
}
return null;
}
/**
* ���ָ�����������������ͻ
* @param unitToValidate
* @param units
* @return
*/
public static List<IARESProblem> validateIdConfilicts(IDependencyUnit unitToValidate, IARESProject project, Multimap<String, IDependencyUnit> units) {
List<IARESProblem> problems = new ArrayList<IARESProblem>();
// 2012-2-17 sundl BUG #2500 �����ռ�Ϊ��Ϊ�Ϸ������ټ�顣
if (StringUtils.isEmpty(unitToValidate.getId())) {
return problems;
}
// ���ȼ���Ƿ�͵�ǰ��Ŀ��ͻ
try {
if (StringUtils.equals(project.getInfo().getId(), unitToValidate.getId())
&& project.getProject().hasNature(unitToValidate.getType())) {
IARESProblem problem = ARESProblem.createError(IAresMarkers.REFERLIB_MARKER_ID);
problem.setMessage(String.format("%s�͵�ǰ������Ŀ�������ռ��ͻ��", unitToValidate.getDescriptionStr()));
problems.add(problem);
}
} catch (CoreException e) {
e.printStackTrace();
}
// ��������������ij�ͻ����ȡ����ID��ͬ��������������Ҳ��ͬ����Ϊ��ͻ
Collection<IDependencyUnit> unitsWithSameId = units.get(unitToValidate.getId());
//unitsWithSameId.remove(unitToValidate);
for (IDependencyUnit unit : unitsWithSameId) {
if (StringUtils.equals(unitToValidate.getType(), unit.getType())
&& !(unit.equals(unitToValidate))) {
IARESProblem problem = ARESProblem.createError(IAresMarkers.REFERLIB_MARKER_ID);
problem.setMessage(String.format("%s��%s�������ռ��ͻ��", unitToValidate.getDescriptionStr(), unit.getDescriptionStr()));
problems.add(problem);
}
}
return problems;
}
/**
* ���ָ���ĵ�Ԫ�������Ƿ�����
* @param unitToValidate
* @param units �����ģ���ǰ�Ѿ���ӵ����е������
* @return
*/
public static List<IARESProblem> validateDependencies(IDependencyUnit unitToValidate, Multimap<String, IDependencyUnit> units) {
List<IARESProblem> problems = new ArrayList<IARESProblem>();
List<IDependenceDescriptor> dependencyDescriptors = unitToValidate.getDependencyDescriptors();
for (IDependenceDescriptor desc : dependencyDescriptors) {
// ������������ָ�����������Ҳ�������Ӵ���
Collection<IDependencyUnit> unitsWithSameId = units.get(desc.getId());
boolean dependencyFound = false;
for (IDependencyUnit unit : unitsWithSameId) {
if (StringUtils.equals(desc.getType(), unit.getType())
&& StringUtils.equals(desc.getVersionConstraint(), unit.getVersion())) {
dependencyFound = true;
break;
}
}
if (!dependencyFound) {
IARESProblem problem = ARESProblem.createError(IAresMarkers.REFERLIB_MARKER_ID);
problem.setMessage(String.format("%s��������(ID:%s, Version:%s, Type:%s)û���ҵ�!",
unitToValidate.getDescriptionStr(),
desc.getId(),
desc.getVersionConstraint(),
desc.getType()));
problems.add(problem);
}
}
return problems;
}
}