/** * 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.ServiceDescriptor; import org.fireflow.engine.entity.repository.ServiceDescriptorProperty; import org.fireflow.engine.entity.repository.ServiceRepository; import org.fireflow.engine.entity.repository.impl.ServiceDescriptorImpl; import org.fireflow.engine.entity.repository.impl.ServiceRepositoryImpl; import org.fireflow.engine.exception.EngineException; import org.fireflow.engine.modules.persistence.ServicePersister; import org.fireflow.model.InvalidModelException; import org.fireflow.model.io.DeserializerException; import org.fireflow.model.io.service.ServiceParser; import org.fireflow.model.servicedef.ServiceDef; 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 ServicePersisterHibernateImpl extends AbsPersisterHibernateImpl implements ServicePersister { private static Log log = LogFactory.getLog(ServicePersisterHibernateImpl.class); /* (non-Javadoc) * @see org.fireflow.engine.modules.persistence.ServicePersister#findServiceRepositoryByFileName(java.lang.String) */ public ServiceRepository findServiceRepositoryByFileName( final String serviceFileName) { ServiceRepository result = (ServiceRepository)this.getHibernateTemplate().execute(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Criteria c = session.createCriteria(ServiceRepositoryImpl.class); c.add(Restrictions.eq("fileName", serviceFileName)); return c.uniqueResult(); } }); if (result!=null && result.getServiceContent()!=null){ try { String content = result.getServiceContent(); String charset = Utils.findXmlCharset(content); ByteArrayInputStream byteIn = new ByteArrayInputStream(content.getBytes(charset)); List<ServiceDef> services = ServiceParser.deserialize(byteIn); ((ServiceRepositoryImpl)result).setServices(services); } catch (UnsupportedEncodingException e) { log.error(e); }catch(DeserializerException e){ log.error(e); } catch(IOException e){ log.error(e); } catch (InvalidModelException e) { log.error(e); } } return result; } /* (non-Javadoc) * @see org.fireflow.engine.modules.persistence.ServicePersister#persistServiceFileToRepository(java.io.InputStream, java.util.Map) */ public List<ServiceDescriptor> persistServiceFileToRepository( InputStream serviceFileInput, Map<ServiceDescriptorProperty, Object> properties)throws InvalidModelException,DeserializerException { if (properties==null) throw new EngineException("The service descriptor properties can NOT be emtpy!"); final String fileName = (String)properties.get(ServiceDescriptorProperty.FILE_NAME); String lastEditor = (String)properties.get(ServiceDescriptorProperty.LAST_EDITOR); Date lastEditTime = (Date)properties.get(ServiceDescriptorProperty.LAST_EDIT_TIME); if (fileName==null || fileName.trim().equals("")){ throw new EngineException("The FILE_NAME property can NOT be emtpy!"); } ServiceRepository repository = repositoryFromInputStream(fileName,serviceFileInput); this.saveOrUpdate(repository); //将Service Descriptor先删后插…… this.getHibernateTemplate().execute(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { String delete = "Delete From ServiceDescriptorImpl m Where m.fileName=:fileName"; Query q4Delete = session.createQuery(delete); q4Delete.setString("fileName", fileName); q4Delete.executeUpdate(); return null; } }); List<ServiceDef> services = repository.getServices(); List<ServiceDescriptor> descriptors = new ArrayList<ServiceDescriptor>(); if (services!=null){ for (ServiceDef svc : services){ ServiceDescriptorImpl desc = new ServiceDescriptorImpl(); desc.setServiceId(svc.getId()); desc.setBizType(svc.getBizCategory()); desc.setName(svc.getName()); desc.setDisplayName(svc.getDisplayName()); desc.setDescription(svc.getDescription()); desc.setFileName(fileName); desc.setLastEditor(lastEditor); Object obj = properties.get(ServiceDescriptorProperty.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 ServiceRepository repositoryFromInputStream(String serviceFileName,InputStream inStream) throws InvalidModelException,DeserializerException{ ServiceRepositoryImpl repository = (ServiceRepositoryImpl)this.findServiceRepositoryByFileName(serviceFileName); if (repository==null){ repository = new ServiceRepositoryImpl(); } try { byte[] bytes = Utils.inputStream2ByteArray(inStream); ByteArrayInputStream bytesIn = new ByteArrayInputStream(bytes); String charset = Utils.findXmlCharset(bytesIn); List<ServiceDef> services = ServiceParser.deserialize(bytesIn); repository.setServiceContent(new String(bytes,charset)); repository.setFileName(serviceFileName); repository.setServices(services); //TODO repository.setServiceDescriptors(...); return repository; } catch (IOException e) { throw new DeserializerException(e); } } /* (non-Javadoc) * @see org.fireflow.engine.modules.persistence.hibernate.AbsPersisterHibernateImpl#getEntityClass4Runtime(java.lang.Class) */ @Override public Class getEntityClass4Runtime(Class interfaceClz) { return ServiceDescriptorImpl.class; } }