001    package org.kuali.ole.license.executor;
002    
003    import org.kuali.ole.OLEConstants;
004    import org.kuali.ole.ingest.pojo.MatchBo;
005    import org.kuali.rice.core.api.exception.RiceRuntimeException;
006    import org.kuali.rice.core.api.util.xml.XmlHelper;
007    import org.kuali.rice.kew.engine.RouteContext;
008    import org.kuali.rice.kew.framework.support.krms.RulesEngineExecutor;
009    import org.kuali.rice.kew.impl.peopleflow.PeopleFlowBo;
010    import org.kuali.rice.kew.impl.peopleflow.PeopleFlowMemberBo;
011    import org.kuali.rice.kew.rule.xmlrouting.XPathHelper;
012    import org.kuali.rice.krad.service.KRADServiceLocator;
013    import org.kuali.rice.krms.api.engine.*;
014    import org.kuali.rice.krms.impl.repository.AgendaBo;
015    import org.w3c.dom.Document;
016    
017    import javax.xml.xpath.XPath;
018    import javax.xml.xpath.XPathConstants;
019    import java.io.ByteArrayInputStream;
020    import java.util.HashMap;
021    import java.util.Iterator;
022    import java.util.List;
023    import java.util.Map;
024    
025    /**
026     * OwnerRulesEngineExecutor validates rules from krms and executes people flow action.
027     */
028    public class OwnerRulesEngineExecutor implements RulesEngineExecutor {
029    
030        /**
031         *   This method validates rules from krms and execute people flow action
032         * @param routeContext
033         * @param engine
034         * @return EngineResults
035         */
036        @Override
037        public EngineResults execute(RouteContext routeContext, Engine engine) {
038    
039            HashMap<String, Object> agendaValue = new HashMap<String, Object>();
040            agendaValue.put("nm", "OWNER_POLICY");
041            List<AgendaBo> agendaBos = (List<AgendaBo>) KRADServiceLocator.getBusinessObjectService().findMatching(AgendaBo.class, agendaValue);
042            AgendaBo agendaBo = agendaBos.get(0);
043            HashMap<String, String> map = new HashMap<String, String>();
044            map.put("AGENDA_NAME", agendaBo.getName());
045            List<MatchBo> matchBos = (List<MatchBo>) KRADServiceLocator.getBusinessObjectService().findMatching(MatchBo.class, map);
046    
047            SelectionCriteria selectionCriteria =
048                    SelectionCriteria.createCriteria(null, getSelectionContext(agendaBo.getContext().getName()), getAgendaContext("OWNER_POLICY"));
049    
050            ExecutionOptions executionOptions = new ExecutionOptions();
051            executionOptions.setFlag(ExecutionFlag.LOG_EXECUTION, true);
052    
053            Facts.Builder factBuilder = Facts.Builder.create();
054    
055            String docContent = routeContext.getDocument().getDocContent();
056    
057            String licenseRequestWorkflowTypeCode =
058                    getElementValue(docContent, "//newMaintainableObject/dataObject/licenseRequestWorkflowTypeCode");
059            String owner =
060                    getElementValue(docContent, "//newMaintainableObject/dataObject/assignee");
061    
062            String oleLicenseRequestStatusCode =
063                    getElementValue(docContent, "//newMaintainableObject/dataObject/oleLicenseRequestStatus/code");
064    
065            HashMap<String,Object> termValues = new HashMap<String, Object>() ;
066            if((licenseRequestWorkflowTypeCode.equalsIgnoreCase("SIGO"))||
067                    (licenseRequestWorkflowTypeCode.equalsIgnoreCase("RVWO"))
068                    || licenseRequestWorkflowTypeCode.equalsIgnoreCase("APPO") && !oleLicenseRequestStatusCode.equalsIgnoreCase("LC")){
069                termValues.put("owner","route");
070            }else{
071                termValues.put("owner","NIL");
072            }
073    
074            for (Iterator<MatchBo> matchBoIterator = matchBos.iterator(); matchBoIterator.hasNext(); ) {
075                MatchBo matchBo = matchBoIterator.next();
076                factBuilder.addFact(matchBo.getTermName(), termValues.get((matchBo.getTermName())));
077            }
078            EngineResults engineResult = engine.execute(selectionCriteria, factBuilder.build(), executionOptions);
079            String peopleFlowsSelected = (String)engineResult.getAttribute("peopleFlowsSelected");
080            String peopleFlwid =peopleFlowsSelected!=null?peopleFlowsSelected.split(":")[1]:null;
081            if(peopleFlwid!=null)createPeopleFlowMemberToOwner(owner,peopleFlwid);
082            return engineResult;  //
083        }
084    
085        /**
086         * This method returns ElementValue using docContent and xpathExpression..
087         * @param docContent
088         * @param xpathExpression
089         * @return value
090         */
091        private String getElementValue(String docContent, String xpathExpression) {
092            try {
093                Document document = XmlHelper.trimXml(new ByteArrayInputStream(docContent.getBytes()));
094    
095                XPath xpath = XPathHelper.newXPath();
096                String value = (String)xpath.evaluate(xpathExpression, document, XPathConstants.STRING);
097    
098                return value;
099    
100            } catch (Exception e) {
101                throw new RiceRuntimeException();
102            }
103        }
104    
105        /**
106         *  This method returns SelectionContext using contextName.
107         * @param contextName
108         * @return Map
109         */
110        protected Map<String, String> getSelectionContext(String contextName) {
111            Map<String, String> selector = new HashMap<String, String>();
112            selector.put(OLEConstants.NAMESPACE_CODE_SELECTOR, "OLE");
113            selector.put(OLEConstants.NAME_SELECTOR, contextName);
114            return selector;
115        }
116    
117        /**
118         *  This method returns AgendaContext using agendaName..
119         * @param agendaName
120         * @return Map
121         */
122        protected Map<String, String> getAgendaContext(String agendaName) {
123            Map<String, String> selector = new HashMap<String, String>();
124            selector.put(OLEConstants.NAME_SELECTOR, agendaName);
125            return selector;
126        }
127    
128        /**
129         *  This method create people to owner using owner and  peopleFlwId.
130         * @param owner
131         * @param peopleFlwId
132         */
133        private void createPeopleFlowMemberToOwner(String owner,String peopleFlwId){
134            PeopleFlowBo peopleFlow = KRADServiceLocator.getBusinessObjectService().findBySinglePrimaryKey(PeopleFlowBo.class,peopleFlwId);
135            peopleFlow.getMembers();
136            PeopleFlowMemberBo peopleFlowMemberBo = peopleFlow.getMembers().get(0);
137            peopleFlowMemberBo.setMemberId(owner);
138            KRADServiceLocator.getBusinessObjectService().save(peopleFlowMemberBo);
139    
140        }
141    
142    }