/**
* <p>Copyright: Copyright (c) 2012</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.jres.basicdata.modelanddata;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentFactory;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.eclipse.core.resources.IResource;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.BasicDataBaseModel;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.BasicdataFactory;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.StandardFieldModelAndData;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.StandardFieldPackageDefine;
import com.hundsun.ares.studio.jres.basicdata.logic.epackage.BasicDataEpackageFactory;
import com.hundsun.ares.studio.jres.modelconvert.ModelConverterHandle;
import com.hundsun.ares.studio.jres.modelconvert.ModelConverterUtils;
/**
* @author lvgao
*
*/
public class StandardFieldModelAndDataConventeHandle extends ModelConverterHandle{
public static final String ROOT = "modelanddata";
public static final String MODEL = "model";
public static final String DATA = "data";
protected Resource createEMFResource(URI uri) {
return new XMIResourceImpl(uri);
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.modelconvert.ModelConverterHandle#handleRead(com.hundsun.ares.studio.core.IARESResource, byte[], java.lang.Class)
*/
@Override
public Object handleRead(IARESResource resource, byte[] contents,
Class<?> clazz) throws Exception {
String encoding = (String)ModelConverterUtils.EMF_SAVE_OPTIONS.get(XMLResource.OPTION_ENCODING);
SAXReader reader = new SAXReader();
reader.setEncoding(encoding);
//���ﱣ֤root���һ����Ӧ��EMF��resource
Resource emfResRoot = null;
IResource rawRes = resource.getCorrespondingResource();
if (rawRes == null) {
emfResRoot = createEMFResource(null);
} else {
emfResRoot = createEMFResource(URI.createPlatformResourceURI(rawRes.getFullPath().toString(), true));
}
ResourceSet rootRsSet = new ResourceSetImpl();
rootRsSet.getResources().add(emfResRoot);
StandardFieldModelAndData info = BasicdataFactory.eINSTANCE.createStandardFieldModelAndData();
//���ģ��
emfResRoot.getContents().add(info);
try {
Document doc = reader.read(new ByteArrayInputStream(contents));
//////////////////////////////////////ģ�Ͷ�ȡ////////////////////////////////////////////
Element modelElement = doc.getRootElement().element("model");
String modelText = modelElement.getText();
Resource emfModelRes = new XMLResourceImpl();
handleEMFRead(emfModelRes, modelText.getBytes(encoding));
Object obj = emfModelRes.getContents().get(0);
if(null == obj){
throw new Exception(String.format("��ȡ��Դ[%s]ģ�Ͷ���ʧ��.", resource.getResource().getFullPath().toOSString()));
}
StandardFieldPackageDefine define = (StandardFieldPackageDefine)obj;
info.setModel(define);
emfModelRes.getContents().clear();
emfResRoot.getContents().add(define);
//////////////////////////////////////��̬��ģ////////////////////////////////////////////
EPackage epackage = StandardFieldModelAndDataEpackageFactory.instance.createEPackage(resource.getARESProject(), define);
ResourceSet rsset = new ResourceSetImpl();
Resource emfDataRes = new XMLResourceImpl();
rsset.getResources().add(emfDataRes);
emfDataRes.getResourceSet().getPackageRegistry().put(epackage.getNsURI(), epackage);
//////////////////////////////////////���ݶ�ȡ////////////////////////////////////////////
EObject dataObj = null;
//ɾ��ģ��Ϊ��ʱ����Ĭ�ϵ����ݶ���Ϊ�˱������ݶ������������Ȼ�����Ϣ
// if(define.getFields().isEmpty()){
// dataObj = BasicDataEpackageFactory.eINSTANCE.createInstance(epackage);
// }else{
Element dataElement = doc.getRootElement().element("data");
String dataText = dataElement.getText();
handleEMFRead(emfDataRes, dataText.getBytes(encoding));
dataObj = emfDataRes.getContents().get(0);
if(null == dataObj){
dataObj = BasicDataEpackageFactory.eINSTANCE.createInstance(epackage);
}
// }
//����ģ����������Դ��
((BasicDataBaseModel)dataObj).setName(resource.getName());
//�趨���ݶ���
info.setData((BasicDataBaseModel)dataObj);
emfDataRes.getContents().clear();
emfResRoot.getContents().add(dataObj);
return info;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.modelconvert.ModelConverterHandle#handleWrite(com.hundsun.ares.studio.core.IARESResource, java.lang.Object)
*/
@Override
public byte[] handleWrite(IARESResource resource, Object info)
throws Exception {
if(! (info instanceof StandardFieldModelAndData)){
return null;
}
String encoding = (String)ModelConverterUtils.EMF_SAVE_OPTIONS.get(XMLResource.OPTION_ENCODING);
StandardFieldModelAndData modelanddata = (StandardFieldModelAndData)info;
//��XML�ļ�
Element root = DocumentFactory.getInstance().createElement(ROOT);
Document doc = DocumentFactory.getInstance().createDocument(root);
doc.setXMLEncoding(encoding);
Element model =DocumentFactory.getInstance().createElement(MODEL);
root.add(model);
Element data = DocumentFactory.getInstance().createElement(DATA);
root.add(data);
if(null == modelanddata.getModel()){
modelanddata.setModel(BasicdataFactory.eINSTANCE.createStandardFieldPackageDefine());
}
if(null == modelanddata.getData()){
EPackage epackage = StandardFieldModelAndDataEpackageFactory.instance.
createEPackage(resource.getARESProject(), modelanddata.getModel());
EObject dataObj = BasicDataEpackageFactory.eINSTANCE.createInstance(epackage);
modelanddata.setData((BasicDataBaseModel)dataObj);
}
//��ȡģ�ͺ�����
byte[] modelbuf = handleEMFWrite(modelanddata.getModel());
byte[] databuf = handleEMFWrite(modelanddata.getData());
//�趨ֵ
model.add(DocumentFactory.getInstance().createCDATA(new String(modelbuf,encoding)));
data.add(DocumentFactory.getInstance().createCDATA(new String(databuf,encoding)));
//�����
org.apache.commons.io.output.ByteArrayOutputStream out = new org.apache.commons.io.output.ByteArrayOutputStream();
//��ʽ��
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding(encoding);
//�����
XMLWriter writer = new XMLWriter(out, format);
writer.write(doc);
writer.flush();
return out.toByteArray();
}
public Object handleEMFRead(Resource emfRes, byte[] contents) throws Exception {
// Resource emfRes = null;
// IResource rawRes = resource.getCorrespondingResource();
// if (rawRes == null) {
// emfRes = createEMFResource(null);
// } else {
// emfRes = createEMFResource(URI.createPlatformResourceURI(rawRes.getFullPath().toString(), true));
// }
Map<Object, Object> options = new HashMap<Object, Object>();
options.putAll(ModelConverterUtils.EMF_LOAD_OPTIONS);
emfRes.load(new ByteArrayInputStream(contents), options);
EObject info = emfRes.getContents().get(0);
return info;
}
public byte[] handleEMFWrite( EObject info)
throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
Resource emfRes = new XMLResourceImpl();
EObject eobj = EcoreUtil.copy(info);
emfRes.getContents().add(eobj);
Map<Object, Object> options = new HashMap<Object, Object>();
options.putAll(ModelConverterUtils.EMF_SAVE_OPTIONS);
eobj.eResource().save(out, options);
return out.toByteArray();
}
}