Package org.infoglue.cms.util.workflow

Source Code of org.infoglue.cms.util.workflow.InfoGlueWorkflowFactory$WorkflowConfig

/* ===============================================================================
*
* Part of the InfoGlue Content Management Platform (www.infoglue.org)
*
* ===============================================================================
*
*  Copyright (C)
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2, as published by the
* Free Software Foundation. See the file LICENSE.html for more information.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY, including 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, write to the Free Software Foundation, Inc. / 59 Temple
* Place, Suite 330 / Boston, MA 02111-1307 / USA.
*
* ===============================================================================
*/

package org.infoglue.cms.util.workflow;

import java.io.ByteArrayInputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.infoglue.cms.controllers.kernel.impl.simple.WorkflowDefinitionController;
import org.infoglue.cms.entities.workflow.WorkflowDefinitionVO;
import org.infoglue.cms.util.CmsPropertyHandler;
import org.infoglue.deliver.util.CacheController;

import com.opensymphony.workflow.FactoryException;
import com.opensymphony.workflow.InvalidWorkflowDescriptorException;
import com.opensymphony.workflow.loader.AbstractWorkflowFactory;
import com.opensymphony.workflow.loader.WorkflowDescriptor;
import com.opensymphony.workflow.loader.WorkflowLoader;


/**
* @author Mattias Bogeblad
*/

public class InfoGlueWorkflowFactory extends AbstractWorkflowFactory
{
    private final static Logger logger = Logger.getLogger(InfoGlueWorkflowFactory.class.getName());

    protected boolean reload;

    public void setLayout(String workflowName, Object layout)
    {
    }

    public Object getLayout(String workflowName)
    {
        return null;
    }

    public boolean removeWorkflow(String name) throws FactoryException
    {
        throw new FactoryException("remove workflow not supported");
    }

    public void renameWorkflow(String oldName, String newName)
    {
    }

    public void save()
    {
    }

    public boolean isModifiable(String name)
    {
        return true;
    }

    public String getName()
    {
        return "";
    }

    public WorkflowDescriptor getWorkflow(String name, boolean validate) throws FactoryException
    {
        Map workflows = (Map)CacheController.getCachedObject("workflowCache", "workflowMap");
   
        if(workflows == null)
            initDone();

        workflows = (Map)CacheController.getCachedObject("workflowCache", "workflowMap");

        WorkflowConfig c = (WorkflowConfig) workflows.get(name);

        if (c == null) {
            throw new FactoryException("Unknown workflow name \"" + name + "\"");
        }

        if (c.descriptor != null)
        {
            loadWorkflow(c, validate);
        }
        else
        {
            loadWorkflow(c, validate);
        }

        c.descriptor.setName(name);

        return c.descriptor;
    }

    public void reload() throws FactoryException
    {
        initDone();  
    }

    public String[] getWorkflowNames()
    {
        Map workflows = (Map)CacheController.getCachedObject("workflowCache", "workflowMap");
   
        if(workflows == null)
        {
            try
            {
                initDone();
            }
          catch (FactoryException e)
            {
                e.printStackTrace();
            }
        }

        workflows = (Map)CacheController.getCachedObject("workflowCache", "workflowMap");

        int i = 0;
        String[] res = new String[workflows.keySet().size()];
        Iterator it = workflows.keySet().iterator();

        while (it.hasNext())
        {
            res[i++] = (String) it.next();
        }

        return res;
    }

    public void createWorkflow(String name)
    {
        try
        {
            initDone();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    public void initDone() throws FactoryException
    {
        try
        {
            Map workflows = new HashMap();
           
            List list = WorkflowDefinitionController.getController().getWorkflowDefinitionVOList();

            Iterator listIterator = list.iterator();
            while(listIterator.hasNext())
            {
                WorkflowDefinitionVO workflowDefinitionVO = (WorkflowDefinitionVO)listIterator.next();
                WorkflowConfig config = new WorkflowConfig(workflowDefinitionVO);
                workflows.put(workflowDefinitionVO.getName(), config);
            }

            CacheController.cacheObject("workflowCache", "workflowMap", workflows);
        }
        catch (Exception e)
        {
            throw new InvalidWorkflowDescriptorException("Error in workflow config", e);
        }
       
    }


    public boolean saveWorkflow(String name, WorkflowDescriptor descriptor, boolean replace) throws FactoryException
    {
        throw new FactoryException("Not supported...");
    }


    private void loadWorkflow(WorkflowConfig c, boolean validate) throws FactoryException
    {
        try
        {
            String encoding = CmsPropertyHandler.getWorkflowEncoding();
            if(encoding == null || encoding.length() == 0 || encoding.equalsIgnoreCase("@workflowEncoding@"))
                encoding = "UTF-8";
           
            WorkflowDescriptor workflowDescriptor = (WorkflowDescriptor)CacheController.getCachedObject("workflowCache", "workflowDescriptor_" + c.workflowDefinitionVO.getName());
            if(workflowDescriptor == null)
            {
              if(logger.isInfoEnabled())
                logger.info("No cached workflow descriptor - reading it...");
              workflowDescriptor = WorkflowLoader.load(new ByteArrayInputStream(c.workflowDefinitionVO.getValue().getBytes(encoding)) , validate);
              CacheController.cacheObject("workflowCache", "workflowDescriptor_" + c.workflowDefinitionVO.getName(), workflowDescriptor);
            }
            else
            {
              if(logger.isInfoEnabled())
                logger.info("Found cached workflow descriptor - using it...");
            }
            c.descriptor = workflowDescriptor; //WorkflowLoader.load(new ByteArrayInputStream(c.workflowDefinitionVO.getValue().getBytes(encoding)) , validate);
        }
        catch (Exception e)
        {
            throw new FactoryException("Error in workflow descriptor: " + c.workflowDefinitionVO.getName(), e);
        }
    }

    //~ Inner Classes //////////////////////////////////////////////////////////

    static class WorkflowConfig
    {
        WorkflowDescriptor descriptor;
        WorkflowDefinitionVO workflowDefinitionVO;

        public WorkflowConfig(WorkflowDefinitionVO workflowDefinitionVO)
        {
            this.workflowDefinitionVO = workflowDefinitionVO;
        }
    }


}
TOP

Related Classes of org.infoglue.cms.util.workflow.InfoGlueWorkflowFactory$WorkflowConfig

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.