/** * Դ�������ƣ�BaseModelConverter.java * �������Ȩ���������ӹɷ����޹�˾ ��Ȩ���� * ϵͳ���ƣ�JRES Studio * ģ�����ƣ�com.hundsun.ares.studio.jres.modelconvert * ����˵�����ļ���ȡ�ͷ������е�������չʵ�� * ����ĵ��� * ���ߣ� */ package com.hundsun.ares.studio.jres.modelconvert; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; import org.eclipse.core.runtime.Assert; import com.hundsun.ares.studio.core.IARESResource; import com.hundsun.ares.studio.core.registry.ARESResRegistry; import com.hundsun.ares.studio.core.registry.IResDescriptor; /** * �ṩ�˶�д�����֧�� * @author gongyf * */ public abstract class BaseModelConverter extends AbstractModelConverter { private Logger log = Logger.getLogger(getClass()); private Map<String, ModelConverterHandle> chainHeaderMap = new HashMap<String, ModelConverterHandle>(); protected ModelConverterHandle getModelConverterChain(String type) { ModelConverterHandle chainHeader = chainHeaderMap.get(type); if (chainHeader == null) { chainHeader = createModelConverterChain(type); chainHeaderMap.put(type, chainHeader); } return chainHeader; } /** * ����ģ��ת��ְ���� * @param type * @return */ protected ModelConverterHandle createModelConverterChain(String type) { List<ModelConverterHandle> handles = ModelConverterUtils.CONVERTER_HANDLE_MAP.get(type); ModelConverterHandle result = getDefaultModelConverterHandle(type); // �����һ���ڵ㷴�򴴽�ְ���� for (ModelConverterHandle handle : handles) { handle.setNextHandle(result); result = handle; } return result; } /** * ��ȡĬ�ϵĴ��������ᱻ����ְ��������� * @param type * @return */ protected abstract ModelConverterHandle getDefaultModelConverterHandle(String type); /** * ��ģ�ʹ��������ж�ȡ�����һЩ���� * @param info * @param resource */ protected abstract void processInfoOnRead(Object info, IARESResource resource); /** * ��ģ��Ҫд���ļ�ǰ����һЩ���� * @param info * @param resource */ protected abstract void processInfoOnWrite(Object info, IARESResource resource); /* (non-Javadoc) * @see com.hundsun.ares.studio.core.model.converter.IModelConverter2#read(com.hundsun.ares.studio.core.IARESResource) */ @Override final public Object read(IARESResource resource) throws Exception { InputStream is = null; Object info = null; IResDescriptor resDesc = ARESResRegistry.getInstance().getResDescriptor(resource.getType()); Class<?> infoClass = resDesc.createInfo().getClass(); try { is = resource.openStream(); byte[] contents = IOUtils.toByteArray(is); ModelConverterHandle handle = getModelConverterChain(resource.getType()); Assert.isNotNull(handle); info = handle.handleRead(resource, contents, infoClass); processInfoOnRead(info, resource); } catch (Exception e) { log.error("��ȡinfo�������" + resource.getFullyQualifiedName(),e); throw e; }finally { IOUtils.closeQuietly(is); if (info == null) { log.error("��ȡinfo����Ϊnull��" + resource.getFullyQualifiedName()); } } return info; } /* (non-Javadoc) * @see com.hundsun.ares.studio.core.model.converter.IModelConverter2#write(com.hundsun.ares.studio.core.IARESResource, java.lang.Object) */ @Override final public byte[] write(IARESResource resource, Object info) throws Exception { processInfoOnWrite(info, resource); byte[] contents = null; ModelConverterHandle handle = getModelConverterChain(resource.getType()); Assert.isNotNull(handle); contents = handle.handleWrite(resource, info); Assert.isNotNull(contents); return contents; } }