/**
* Copyright 2007-2010 非也
* All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation。
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses. *
*/
package org.fireflow.engine.modules.persistence.hibernate;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.fireflow.engine.entity.repository.ResourceDescriptor;
import org.fireflow.engine.entity.repository.ResourceDescriptorProperty;
import org.fireflow.engine.entity.repository.ResourceRepository;
import org.fireflow.engine.entity.repository.impl.ResourceDescriptorImpl;
import org.fireflow.engine.entity.repository.impl.ResourceRepositoryImpl;
import org.fireflow.engine.exception.EngineException;
import org.fireflow.engine.modules.persistence.ResourcePersister;
import org.fireflow.model.InvalidModelException;
import org.fireflow.model.io.DeserializerException;
import org.fireflow.model.io.resource.ResourceDeserializer;
import org.fireflow.model.resourcedef.ResourceDef;
import org.firesoa.common.util.Utils;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;
/**
*
*
* @author 非也
* @version 2.0
*/
public class ResourcePersisterHibernateImpl extends AbsPersisterHibernateImpl implements ResourcePersister {
private static Log log = LogFactory.getLog(ResourcePersisterHibernateImpl.class);
/* (non-Javadoc)
* @see org.fireflow.engine.modules.persistence.ResourcePersister#findResourceRepositoryByFileName(java.lang.String)
*/
public ResourceRepository findResourceRepositoryByFileName(
final String resourceFileName){
ResourceRepository result = (ResourceRepository)this.getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Criteria c = session.createCriteria(ResourceRepositoryImpl.class);
c.add(Restrictions.eq("fileName", resourceFileName));
return c.uniqueResult();
}
});
if (result!=null &&
result.getResourceContent()!=null){
try {
String content = result.getResourceContent();
String charset = Utils.findXmlCharset(content);
ByteArrayInputStream byteIn = new ByteArrayInputStream(content.getBytes(charset));
ResourceDeserializer parser = new ResourceDeserializer();
List<ResourceDef> resources = parser.deserialize(byteIn);
((ResourceRepositoryImpl)result).setResources(resources);
} catch (UnsupportedEncodingException e) {
log.error(e);
}catch(DeserializerException e){
log.error(e);
}
catch(IOException e){
log.error(e);
}
}
return result;
}
/* (non-Javadoc)
* @see org.fireflow.engine.modules.persistence.ResourcePersister#persistResourceFileToRepository(java.io.InputStream, java.util.Map)
*/
public List<ResourceDescriptor> persistResourceFileToRepository(
InputStream resourceFileInput,
Map<ResourceDescriptorProperty, Object> properties)throws DeserializerException,InvalidModelException {
if (properties==null) throw new EngineException("The resource descriptor properties can NOT be emtpy!");
final String fileName = (String)properties.get(ResourceDescriptorProperty.FILE_NAME);
String lastEditor = (String)properties.get(ResourceDescriptorProperty.LAST_EDITOR);
Date lastEditTime = (Date)properties.get(ResourceDescriptorProperty.LAST_EDIT_TIME);
if (fileName==null || fileName.trim().equals("")){
throw new EngineException("The FILE_NAME property can NOT be emtpy!");
}
ResourceRepository repository = repositoryFromInputStream(fileName,resourceFileInput);
this.saveOrUpdate(repository);
//将Service Descriptor先删后插……
this.getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
String delete = "Delete From ResourceDescriptorImpl m Where m.fileName=:fileName";
Query q4Delete = session.createQuery(delete);
q4Delete.setString("fileName", fileName);
q4Delete.executeUpdate();
return null;
}
});
List<ResourceDef> services = repository.getResources();
List<ResourceDescriptor> descriptors = new ArrayList<ResourceDescriptor>();
if (services!=null){
for (ResourceDef rsc : services){
ResourceDescriptorImpl desc = new ResourceDescriptorImpl();
desc.setResourceId(rsc.getId());
desc.setName(rsc.getName());
desc.setDisplayName(rsc.getDisplayName());
desc.setDescription(rsc.getDescription());
desc.setResourceType(rsc.getResourceType().getValue());
desc.setFileName(fileName);
desc.setLastEditor(lastEditor);
Object obj = properties.get(ResourceDescriptorProperty.PUBLISH_STATE);
Boolean publishState = Boolean.TRUE;
if (obj!=null && obj instanceof Boolean){
publishState = (Boolean) obj;
}
desc.setPublishState(publishState);
this.saveOrUpdate(desc);
descriptors.add(desc);
}
}
return descriptors;
}
private ResourceRepository repositoryFromInputStream(String resourceFileName,InputStream inStream)throws DeserializerException,InvalidModelException{
ResourceRepositoryImpl repository = (ResourceRepositoryImpl)this.findResourceRepositoryByFileName(resourceFileName);
if (repository==null){
repository = new ResourceRepositoryImpl();
}
ResourceDeserializer parser = new ResourceDeserializer();
try {
byte[] bytes = Utils.inputStream2ByteArray(inStream);
ByteArrayInputStream bytesIn = new ByteArrayInputStream(bytes);
String charset = Utils.findXmlCharset(bytesIn);
List<ResourceDef> resources = parser.deserialize(bytesIn);
repository.setResourceContent(new String(bytes,charset));
repository.setFileName(resourceFileName);
repository.setResources(resources);
//TODO repository.setResourceDescriptors(descriptors)
return repository;
} catch (IOException e) {
throw new InvalidModelException(e);
}
}
/* (non-Javadoc)
* @see org.fireflow.engine.modules.persistence.hibernate.AbsPersisterHibernateImpl#getEntityClass4Runtime(java.lang.Class)
*/
@Override
public Class getEntityClass4Runtime(Class interfaceClz) {
return ResourceDescriptorImpl.class;
}
}