/**
* Դ�������ƣ�BasicMetadataService.java
* �������Ȩ���������ӹɷ�����˾ ��Ȩ����
* ϵͳ���ƣ�JRES Studio
* ģ�����ƣ�com.hundsun.ares.studio.jres.metadata.core
* ����˵����$desc
* ����ĵ���
* ���ߣ���Ҷ��
*/
package com.hundsun.ares.studio.jres.metadata.internal.service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import com.hundsun.ares.studio.core.IARESProject;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.core.context.IResStatisticProvider;
import com.hundsun.ares.studio.core.context.JRESContextManager;
import com.hundsun.ares.studio.core.context.statistic.IResourceTable;
import com.hundsun.ares.studio.jres.metadata.constant.IMetadataRefType;
import com.hundsun.ares.studio.jres.metadata.service.IBusinessDataType;
import com.hundsun.ares.studio.jres.metadata.service.IDictionaryType;
import com.hundsun.ares.studio.jres.metadata.service.IErrorNoItem;
import com.hundsun.ares.studio.jres.metadata.service.IMetadataItem;
import com.hundsun.ares.studio.jres.metadata.service.IMetadataService;
import com.hundsun.ares.studio.jres.metadata.service.IStandardDataType;
import com.hundsun.ares.studio.jres.metadata.service.IStandardField;
import com.hundsun.ares.studio.jres.metadata.service.ITypeDefaultValue;
import com.hundsun.ares.studio.jres.metadata.service.IUserConstantItem;
import com.hundsun.ares.studio.jres.model.metadata.BusinessDataType;
import com.hundsun.ares.studio.jres.model.metadata.ConstantItem;
import com.hundsun.ares.studio.jres.model.metadata.DictionaryType;
import com.hundsun.ares.studio.jres.model.metadata.ErrorNoItem;
import com.hundsun.ares.studio.jres.model.metadata.MetadataItem;
import com.hundsun.ares.studio.jres.model.metadata.MetadataPackage;
import com.hundsun.ares.studio.jres.model.metadata.StandardDataType;
import com.hundsun.ares.studio.jres.model.metadata.StandardField;
import com.hundsun.ares.studio.jres.model.metadata.TypeDefaultValue;
import com.hundsun.ares.studio.jres.model.metadata.decrypt.DeMetadataItem;
import com.hundsun.ares.studio.jres.model.metadata.util.MetadataUtil;
import com.hundsun.ares.studio.model.reference.ReferenceInfo;
import com.hundsun.ares.studio.reference.ReferenceManager;
/**
* @author gongyf
*
*/
public class BasicMetadataService implements IMetadataService {
final private IARESProject project;
private List<ITypeDefaultValue> defValueList = null;
private List<IStandardDataType> stdTypeList = null;
private List<IBusinessDataType> bizTypeList = null;
private List<IStandardField> stdFieldList = null;
private List<IUserConstantItem> constList = null;
private List<IErrorNoItem> errorNoList = null;
private List<IDictionaryType> dictList = null;
private Map<String, ITypeDefaultValue> defValueMap = null;
private Map<String, IStandardDataType> stdTypeMap = null;
private Map<String, IBusinessDataType> bizTypeMap = null;
private Map<String, IStandardField> stdFieldMap = null;
private Map<String, IUserConstantItem> constMap = null;
private Map<String, IErrorNoItem> errorNoMap = null;
private Map<String, IDictionaryType> dictMap = null;
/**
* @param project
*/
public BasicMetadataService(IARESProject project) {
super();
this.project = project;
}
protected Map<String, ITypeDefaultValue> getAllTypeDefaultValueMap() {
if (defValueMap == null) {
defValueMap = getMetadataItemMap(IMetadataRefType.DefValue);
}
return defValueMap;
}
protected Map<String, IStandardDataType> getAllStandardDataTypeMap() {
if (stdTypeMap == null) {
stdTypeMap = getMetadataItemMap(IMetadataRefType.StdType);
}
return stdTypeMap;
}
protected Map<String, IBusinessDataType> getAllBusinessDataTypeMap() {
if (bizTypeMap == null) {
bizTypeMap = getMetadataItemMap(IMetadataRefType.BizType);
}
return bizTypeMap;
}
protected Map<String, IStandardField> getAllStandardFieldMap() {
if (stdFieldMap == null) {
stdFieldMap = getMetadataItemMap(IMetadataRefType.StdField);
}
return stdFieldMap;
}
protected Map<String, IUserConstantItem> getAllUserConstantMap() {
if (constMap == null) {
constMap = getMetadataItemMap(IMetadataRefType.Const);
}
return constMap;
}
protected Map<String, IErrorNoItem> getAllErrorNoMap() {
if (errorNoMap == null) {
errorNoMap = getMetadataItemMap(IMetadataRefType.ErrNo);
}
return errorNoMap;
}
protected Map<String, IDictionaryType> getAllDictionaryTypeMap() {
if (dictMap == null) {
dictMap = getMetadataItemMap(IMetadataRefType.Dict);
}
return dictMap;
}
protected <T extends IMetadataItem> List<T> getMetadataItemList(Map<String, T> map) {
List<T> list = new ArrayList<T>(map.values());
Collections.sort(list, new Comparator<T>(){
@Override
public int compare(T o1, T o2) {
return o1.getName().compareTo(o2.getName());
}});
return list;
}
protected static DeMetadataItem<?> decrypt(MetadataItem item, IARESResource resource) {
if (ObjectUtils.equals(item.eClass(), MetadataPackage.Literals.TYPE_DEFAULT_VALUE)) {
return MetadataUtil.decrypt((TypeDefaultValue)item, resource);
} else if (ObjectUtils.equals(item.eClass(), MetadataPackage.Literals.STANDARD_DATA_TYPE)) {
return MetadataUtil.decrypt((StandardDataType)item, resource);
} else if (ObjectUtils.equals(item.eClass(), MetadataPackage.Literals.BUSINESS_DATA_TYPE)) {
return MetadataUtil.decrypt((BusinessDataType)item, resource);
} else if (ObjectUtils.equals(item.eClass(), MetadataPackage.Literals.STANDARD_FIELD)) {
return MetadataUtil.decrypt((StandardField)item, resource);
} else if (ObjectUtils.equals(item.eClass(), MetadataPackage.Literals.ERROR_NO_ITEM)) {
return MetadataUtil.decrypt((ErrorNoItem)item, resource);
} else if (ObjectUtils.equals(item.eClass(), MetadataPackage.Literals.CONSTANT_ITEM)) {
return MetadataUtil.decrypt((ConstantItem)item, resource);
} else if (ObjectUtils.equals(item.eClass(), MetadataPackage.Literals.DICTIONARY_TYPE)) {
return MetadataUtil.decrypt((DictionaryType)item, resource);
}
throw new UnsupportedOperationException();
}
protected <T extends IMetadataItem> Map<String, T> getMetadataItemMap(String refType) {
Map<String, T> map = new HashMap<String, T>();
Set<String> errNameSet = new HashSet<String>();
ReferenceManager manager = ReferenceManager.getInstance();
List<ReferenceInfo> refInfos = manager.getReferenceInfos(project, refType, true);
for (ReferenceInfo ref : refInfos) {
IARESResource res = ref.getResource();
MetadataItem owner = (MetadataItem) ref.getObject();
DeMetadataItem<?> d = decrypt(owner, res);
String key = d.getName();
if (StringUtils.isBlank(key)) {
continue;
}
if (map.containsKey(key)) {
// ����ɾ��������ӵ�������
map.remove(key);
errNameSet.add(key);
} else if (errNameSet.contains(key)) {
// �Ѿ����������������Ҫ���
} else {
map.put(key, (T) d);
}
}
return map;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.service.IMetadataService#getTypeDefaultValueList()
*/
@Override
public List<ITypeDefaultValue> getTypeDefaultValueList() {
if (defValueList == null) {
defValueList = Collections.unmodifiableList(getMetadataItemList(getAllTypeDefaultValueMap()));
}
return defValueList;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.service.IMetadataService#getTypeDefaultValue(java.lang.String)
*/
@Override
public ITypeDefaultValue getTypeDefaultValue(String name) {
return getAllTypeDefaultValueMap().get(name);
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.service.IMetadataService#getStandardDataTypeList()
*/
@Override
public List<IStandardDataType> getStandardDataTypeList() {
if (stdTypeList == null) {
stdTypeList = Collections.unmodifiableList(getMetadataItemList(getAllStandardDataTypeMap()));
}
return stdTypeList;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.service.IMetadataService#getStandardDataType(java.lang.String)
*/
@Override
public IStandardDataType getStandardDataType(String name) {
return getAllStandardDataTypeMap().get(name);
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.service.IMetadataService#getBusinessDataTypeList()
*/
@Override
public List<IBusinessDataType> getBusinessDataTypeList() {
if (bizTypeList == null) {
bizTypeList = Collections.unmodifiableList(getMetadataItemList(getAllBusinessDataTypeMap()));
}
return bizTypeList;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.service.IMetadataService#getBusinessDataType(java.lang.String)
*/
@Override
public IBusinessDataType getBusinessDataType(String name) {
return getAllBusinessDataTypeMap().get(name);
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.service.IMetadataService#getStandardFieldList()
*/
@Override
public List<IStandardField> getStandardFieldList() {
if (stdFieldList == null) {
stdFieldList = Collections.unmodifiableList(getMetadataItemList(getAllStandardFieldMap()));
}
return stdFieldList;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.service.IMetadataService#getStandardField(java.lang.String)
*/
@Override
public IStandardField getStandardField(String name) {
return getAllStandardFieldMap().get(name);
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.service.IMetadataService#getErrorNoList()
*/
@Override
public List<IErrorNoItem> getErrorNoList() {
if (errorNoList == null) {
errorNoList = Collections.unmodifiableList(getMetadataItemList(getAllErrorNoMap()));
}
return errorNoList;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.service.IMetadataService#getErrorNo(java.lang.String)
*/
@Override
public IErrorNoItem getErrorNo(String name) {
return getAllErrorNoMap().get(name);
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.service.IMetadataService#getUserConstantList()
*/
@Override
public List<IUserConstantItem> getUserConstantList() {
if (constList == null) {
constList = Collections.unmodifiableList(getMetadataItemList(getAllUserConstantMap()));
}
return constList;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.service.IMetadataService#getUserConstant(java.lang.String)
*/
@Override
public IUserConstantItem getUserConstant(String name) {
return getAllUserConstantMap().get(name);
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.service.IMetadataService#getDictionaryTypeList()
*/
@Override
public List<IDictionaryType> getDictionaryTypeList() {
if (dictList == null) {
dictList = Collections.unmodifiableList(getMetadataItemList(getAllDictionaryTypeMap()));
}
return dictList;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.service.IMetadataService#getDictionary(java.lang.String)
*/
@Override
public IDictionaryType getDictionary(String name) {
return getAllDictionaryTypeMap().get(name);
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.core.service.IDataService#refresh()
*/
@Override
public void refresh() {
defValueList = null;
defValueMap = null;
stdTypeList = null;
stdTypeMap = null;
bizTypeList = null;
bizTypeMap = null;
stdFieldList = null;
stdFieldMap = null;
constList = null;
constMap = null;
errorNoList = null;
errorNoMap = null;
dictList = null;
dictMap = null;
}
}