001/*
002 * Copyright 2011 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may      obtain a copy of the License at
007 *
008 *      http://www.osedu.org/licenses/ECL-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.krms.impl.repository.mock;
017
018import java.util.ArrayList;
019import java.util.Collection;
020import java.util.LinkedHashMap;
021import java.util.LinkedHashSet;
022import java.util.List;
023import java.util.Map;
024import java.util.Set;
025import java.util.UUID;
026import org.kuali.rice.core.api.criteria.QueryByCriteria;
027import org.kuali.rice.core.api.exception.RiceIllegalArgumentException;
028import org.kuali.rice.core.api.exception.RiceIllegalStateException;
029import org.kuali.rice.krms.api.repository.NaturalLanguageTree;
030import org.kuali.rice.krms.api.repository.RuleManagementService;
031import org.kuali.rice.krms.api.repository.action.ActionDefinition;
032import org.kuali.rice.krms.api.repository.agenda.AgendaDefinition;
033import org.kuali.rice.krms.api.repository.agenda.AgendaItemDefinition;
034import org.kuali.rice.krms.api.repository.agenda.AgendaTreeDefinition;
035import org.kuali.rice.krms.api.repository.context.ContextDefinition;
036import org.kuali.rice.krms.api.repository.context.ContextSelectionCriteria;
037import org.kuali.rice.krms.api.repository.language.NaturalLanguageTemplate;
038import org.kuali.rice.krms.api.repository.language.NaturalLanguageTemplaterContract;
039import org.kuali.rice.krms.api.repository.language.NaturalLanguageUsage;
040import org.kuali.rice.krms.api.repository.proposition.PropositionDefinition;
041import org.kuali.rice.krms.api.repository.proposition.PropositionParameter;
042import org.kuali.rice.krms.api.repository.reference.ReferenceObjectBinding;
043import org.kuali.rice.krms.api.repository.rule.RuleDefinition;
044import org.kuali.rice.krms.api.repository.term.TermDefinition;
045import org.kuali.rice.krms.api.repository.term.TermRepositoryService;
046import org.kuali.rice.krms.impl.repository.TranslationUtility;
047import org.kuali.rice.krms.impl.repository.language.SimpleNaturalLanguageTemplater;
048
049public class RuleManagementServiceMockImpl implements RuleManagementService {
050    
051    
052    // cache variable 
053    // The LinkedHashMap is just so the values come back in a predictable order
054
055    private Map<String, ReferenceObjectBinding> referenceObjectBindingMap = new LinkedHashMap<String, ReferenceObjectBinding>();
056    private Map<String, ContextDefinition> contextMap = new LinkedHashMap<String, ContextDefinition>();
057    private Map<String, AgendaDefinition> agendaMap = new LinkedHashMap<String, AgendaDefinition>();
058    private Map<String, AgendaItemDefinition> agendaItemMap = new LinkedHashMap<String, AgendaItemDefinition>();
059    private Map<String, RuleDefinition> ruleMap = new LinkedHashMap<String, RuleDefinition>();
060    private Map<String, ActionDefinition> actionMap = new LinkedHashMap<String, ActionDefinition>();
061    private Map<String, PropositionDefinition> propositionMap = new LinkedHashMap<String, PropositionDefinition>();
062    private Map<String, NaturalLanguageUsage> naturalLanguageUsageMap = new LinkedHashMap<String, NaturalLanguageUsage>();
063    private Map<String, NaturalLanguageTemplate> naturalLanguageTemplateMap = new LinkedHashMap<String, NaturalLanguageTemplate>();
064    
065    // supporting services used in this service impl
066    private NaturalLanguageTemplaterContract templater = new SimpleNaturalLanguageTemplater();
067    private TermRepositoryService termRepositoryService;
068    
069    public NaturalLanguageTemplaterContract getTemplater() {
070        return templater;
071    }
072
073    public void setTemplater(NaturalLanguageTemplaterContract templater) {
074        this.templater = templater;
075    }
076
077    public TermRepositoryService getTermRepositoryService() {
078        return termRepositoryService;
079    }
080
081    public void setTermRepositoryService(TermRepositoryService termRepositoryService) {
082        this.termRepositoryService = termRepositoryService;
083    }
084
085    
086    
087    public void clear() {
088        this.referenceObjectBindingMap.clear();
089        this.contextMap.clear();
090        this.agendaMap.clear();
091        this.agendaItemMap.clear();
092        this.ruleMap.clear();
093        this.actionMap.clear();
094        this.propositionMap.clear();
095        this.naturalLanguageUsageMap.clear();
096        this.naturalLanguageTemplateMap.clear();
097    }
098
099    @Override
100    public ReferenceObjectBinding createReferenceObjectBinding(ReferenceObjectBinding referenceObjectDefinition)
101            throws RiceIllegalArgumentException {
102        // CREATE
103        ReferenceObjectBinding orig = this.getReferenceObjectBinding(referenceObjectDefinition.getId());
104        if (orig != null) {
105            throw new RiceIllegalArgumentException(referenceObjectDefinition.getId());
106        }
107        ReferenceObjectBinding.Builder copy = ReferenceObjectBinding.Builder.create(referenceObjectDefinition);
108        if (copy.getId() == null) {
109            copy.setId(UUID.randomUUID().toString());
110        }
111        referenceObjectDefinition = copy.build();
112        referenceObjectBindingMap.put(referenceObjectDefinition.getId(), referenceObjectDefinition);
113        return referenceObjectDefinition;
114    }
115
116    @Override
117    public ReferenceObjectBinding getReferenceObjectBinding(String id)
118            throws RiceIllegalArgumentException {
119        // GET_BY_ID
120        if (!this.referenceObjectBindingMap.containsKey(id)) {
121            throw new RiceIllegalArgumentException(id);
122        }
123        return this.referenceObjectBindingMap.get(id);
124    }
125
126    @Override
127    public List<ReferenceObjectBinding> getReferenceObjectBindings(List<String> ids)
128            throws RiceIllegalArgumentException {
129        // GET_BY_IDS
130        List<ReferenceObjectBinding> list = new ArrayList<ReferenceObjectBinding>();
131        for (String id : ids) {
132            list.add(this.getReferenceObjectBinding(id));
133        }
134        return list;
135    }
136
137    @Override
138    public List<ReferenceObjectBinding> findReferenceObjectBindingsByReferenceDiscriminatorType(String referenceObjectReferenceDiscriminatorType)
139            throws RiceIllegalArgumentException {
140        List<ReferenceObjectBinding> list = new ArrayList<ReferenceObjectBinding>();
141        for (ReferenceObjectBinding info : this.referenceObjectBindingMap.values()) {
142            if (info.getReferenceDiscriminatorType().equals(referenceObjectReferenceDiscriminatorType)) {
143                list.add(info);
144            }
145        }
146        return list;
147    }
148
149    @Override
150    public List<ReferenceObjectBinding> findReferenceObjectBindingsByReferenceObject(String referenceObjectReferenceDiscriminatorType, String referenceObjectId) throws RiceIllegalArgumentException {
151
152        List<ReferenceObjectBinding> list = new ArrayList<ReferenceObjectBinding>();
153        for (ReferenceObjectBinding info : this.referenceObjectBindingMap.values()) {
154            if (info.getReferenceDiscriminatorType().equals(referenceObjectReferenceDiscriminatorType)) {
155                list.add(info);
156            }
157        }
158        return list;
159    }
160
161    @Override
162    public List<ReferenceObjectBinding> findReferenceObjectBindingsByKrmsDiscriminatorType(String referenceObjectKrmsDiscriminatorType)
163            throws RiceIllegalArgumentException {
164        List<ReferenceObjectBinding> list = new ArrayList<ReferenceObjectBinding>();
165        for (ReferenceObjectBinding info : this.referenceObjectBindingMap.values()) {
166            if (info.getKrmsDiscriminatorType().equals(referenceObjectKrmsDiscriminatorType)) {
167                list.add(info);
168            }
169        }
170        return list;
171    }
172
173    @Override
174    public List<ReferenceObjectBinding> findReferenceObjectBindingsByKrmsObject(String krmsObjectId)
175            throws RiceIllegalArgumentException {
176        List<ReferenceObjectBinding> list = new ArrayList<ReferenceObjectBinding>();
177        for (ReferenceObjectBinding info : this.referenceObjectBindingMap.values()) {
178            if (info.getKrmsObjectId().equals(krmsObjectId)) {
179                list.add(info);
180            }
181        }
182        return list;
183    }
184
185    @Override
186    public void updateReferenceObjectBinding(ReferenceObjectBinding referenceObjectBindingDefinition)
187            throws RiceIllegalArgumentException {
188        // UPDATE
189        ReferenceObjectBinding.Builder copy = ReferenceObjectBinding.Builder.create(referenceObjectBindingDefinition);
190        ReferenceObjectBinding old = this.getReferenceObjectBinding(referenceObjectBindingDefinition.getId());
191        if (!old.getVersionNumber().equals(copy.getVersionNumber())) {
192            throw new RiceIllegalStateException("" + old.getVersionNumber());
193        }
194        copy.setVersionNumber(copy.getVersionNumber() + 1);
195        referenceObjectBindingDefinition = copy.build();
196        this.referenceObjectBindingMap.put(referenceObjectBindingDefinition.getId(), referenceObjectBindingDefinition);
197        return;
198    }
199
200    @Override
201    public void deleteReferenceObjectBinding(String id)
202            throws RiceIllegalArgumentException {
203        // DELETE
204        if (this.referenceObjectBindingMap.remove(id) == null) {
205            throw new RiceIllegalArgumentException(id);
206        }
207        return;
208    }
209
210    @Override
211    public List<String> findReferenceObjectBindingIds(QueryByCriteria queryByCriteria)
212            throws RiceIllegalArgumentException {
213        CriteriaMatcherInMemory<ReferenceObjectBinding> instance = new CriteriaMatcherInMemory<ReferenceObjectBinding>();
214        instance.setCriteria(queryByCriteria);
215        Collection<ReferenceObjectBinding> selected = instance.findMatching(this.referenceObjectBindingMap.values());
216        List<String> list = new ArrayList<String>();
217        for (ReferenceObjectBinding sel : selected) {
218            list.add(sel.getId());
219        }
220        return list;
221    }
222
223    @Override
224    public AgendaDefinition createAgenda(AgendaDefinition agendaDefinition)
225            throws RiceIllegalArgumentException {
226        // CREATE
227        if (agendaDefinition.getId() != null) {
228            AgendaDefinition orig = this.getAgenda(agendaDefinition.getId());
229            if (orig != null) {
230                throw new RiceIllegalArgumentException(agendaDefinition.getId() + "." + agendaDefinition.getName());
231            }
232        }
233        AgendaDefinition.Builder copy = AgendaDefinition.Builder.create(agendaDefinition);
234        if (copy.getId() == null) {
235            copy.setId(UUID.randomUUID().toString());
236        }
237        copy.setVersionNumber(0l);
238        agendaDefinition = copy.build();
239        agendaMap.put(agendaDefinition.getId(), agendaDefinition);
240        return agendaDefinition;
241    }
242
243    @Override
244    public AgendaDefinition getAgenda(String id)
245            throws RiceIllegalArgumentException {
246        // GET_BY_ID
247        if (!this.agendaMap.containsKey(id)) {
248            throw new RiceIllegalArgumentException(id);
249        }
250        return this.agendaMap.get(id);
251    }
252
253    @Override
254    public List<AgendaDefinition> getAgendasByType(String typeId)
255            throws RiceIllegalArgumentException {
256        // GET_IDS_BY_TYPE
257        List<AgendaDefinition> list = new ArrayList<AgendaDefinition>();
258        for (AgendaDefinition info : agendaMap.values()) {
259            if (typeId.equals(info.getTypeId())) {
260                list.add(info);
261            }
262        }
263        return list;
264    }
265
266    @Override
267    public List<AgendaDefinition> getAgendasByContext(String contextId)
268            throws RiceIllegalArgumentException {
269        List<AgendaDefinition> list = new ArrayList<AgendaDefinition>();
270        for (AgendaDefinition info : this.agendaMap.values()) {
271            if (info.getContextId().equals(contextId)) {
272                list.add(info);
273            }
274        }
275        return list;
276    }
277
278    @Override
279    public List<AgendaDefinition> getAgendasByTypeAndContext(String typeId, String contextId)
280            throws RiceIllegalArgumentException {
281        List<AgendaDefinition> list = new ArrayList<AgendaDefinition>();
282        for (AgendaDefinition info : this.agendaMap.values()) {
283            if (info.getContextId().equals(contextId)) {
284                if (info.getTypeId().equals(typeId)) {
285                    list.add(info);
286                }
287            }
288        }
289        return list;
290    }
291
292    @Override
293    public void updateAgenda(AgendaDefinition agendaDefinition)
294            throws RiceIllegalArgumentException {
295        // UPDATE
296        AgendaDefinition.Builder copy = AgendaDefinition.Builder.create(agendaDefinition);
297        AgendaDefinition old = this.getAgenda(agendaDefinition.getId());
298        if (!old.getVersionNumber().equals(copy.getVersionNumber())) {
299            throw new RiceIllegalStateException("" + old.getVersionNumber());
300        }
301        copy.setVersionNumber(copy.getVersionNumber() + 1);
302        agendaDefinition = copy.build();
303        this.agendaMap.put(agendaDefinition.getId(), agendaDefinition);
304        return;
305    }
306
307    @Override
308    public void deleteAgenda(String id)
309            throws RiceIllegalArgumentException {
310        // DELETE
311        if (this.agendaMap.remove(id) == null) {
312            throw new RiceIllegalArgumentException(id);
313        }
314        return;
315    }
316
317    @Override
318    public AgendaItemDefinition createAgendaItem(AgendaItemDefinition agendaItemDefinition)
319            throws RiceIllegalArgumentException {
320        // CREATE
321        AgendaItemDefinition.Builder copy = AgendaItemDefinition.Builder.create(agendaItemDefinition);
322        if (copy.getId() == null) {
323            copy.setId(UUID.randomUUID().toString());
324        }
325        agendaItemDefinition = copy.build();
326        agendaItemMap.put(agendaItemDefinition.getId(), agendaItemDefinition);
327        return agendaItemDefinition;
328    }
329
330    @Override
331    public AgendaItemDefinition getAgendaItem(String id)
332            throws RiceIllegalArgumentException {
333        // GET_BY_ID
334        if (!this.agendaItemMap.containsKey(id)) {
335            throw new RiceIllegalArgumentException(id);
336        }
337        return this.agendaItemMap.get(id);
338    }
339
340    @Override
341    public List<AgendaItemDefinition> getAgendaItemsByType(String typeId)
342            throws RiceIllegalArgumentException {
343        // GET_IDS_BY_TYPE
344        List<AgendaDefinition> agendas = this.getAgendasByType(typeId);
345        List<AgendaItemDefinition> list = new ArrayList<AgendaItemDefinition>();
346        for (AgendaDefinition agenda : agendas) {
347            for (AgendaItemDefinition info : agendaItemMap.values()) {
348                if (agenda.getId().equals(info.getAgendaId())) {
349                    list.add(info);
350                }
351            }
352        }
353        return list;
354    }
355
356    @Override
357    public List<AgendaItemDefinition> getAgendaItemsByContext(String contextId)
358            throws RiceIllegalArgumentException {
359        List<AgendaDefinition> agendas = this.getAgendasByContext(contextId);
360        List<AgendaItemDefinition> list = new ArrayList<AgendaItemDefinition>();
361        for (AgendaDefinition agenda : agendas) {
362            for (AgendaItemDefinition info : agendaItemMap.values()) {
363                if (agenda.getId().equals(info.getAgendaId())) {
364                    list.add(info);
365                }
366            }
367        }
368        return list;
369    }
370
371    @Override
372    public List<AgendaItemDefinition> getAgendaItemsByTypeAndContext(String typeId, String contextId)
373            throws RiceIllegalArgumentException {
374        List<AgendaDefinition> agendas = this.getAgendasByContext(contextId);
375        List<AgendaItemDefinition> list = new ArrayList<AgendaItemDefinition>();
376        for (AgendaDefinition agenda : agendas) {
377            if (agenda.getTypeId().equals(typeId)) {
378                for (AgendaItemDefinition info : agendaItemMap.values()) {
379                    if (agenda.getId().equals(info.getAgendaId())) {
380                        list.add(info);
381                    }
382                }
383            }
384        }
385        return list;
386    }
387
388    @Override
389    public void updateAgendaItem(AgendaItemDefinition agendaItemDefinition)
390            throws RiceIllegalArgumentException {
391        // UPDATE
392        AgendaItemDefinition.Builder copy = AgendaItemDefinition.Builder.create(agendaItemDefinition);
393        AgendaItemDefinition old = this.getAgendaItem(agendaItemDefinition.getId());
394        if (!old.getVersionNumber().equals(copy.getVersionNumber())) {
395            throw new RiceIllegalStateException("" + old.getVersionNumber());
396        }
397        copy.setVersionNumber(copy.getVersionNumber() + 1);
398        agendaItemDefinition = copy.build();
399        this.agendaItemMap.put(agendaItemDefinition.getId(), agendaItemDefinition);
400        return;
401    }
402
403    @Override
404    public void deleteAgendaItem(String id)
405            throws RiceIllegalArgumentException {
406        // DELETE
407        if (this.agendaItemMap.remove(id) == null) {
408            throw new RiceIllegalArgumentException(id);
409        }
410        return;
411    }
412
413    @Override
414    public RuleDefinition createRule(RuleDefinition ruleDefinition)
415            throws RiceIllegalArgumentException {
416        // CREATE
417        if (ruleDefinition.getId() != null) {
418            RuleDefinition orig = this.getRule(ruleDefinition.getId());
419            if (orig != null) {
420                throw new RiceIllegalArgumentException(ruleDefinition.getId());
421            }
422        }
423        RuleDefinition.Builder copy = RuleDefinition.Builder.create(ruleDefinition);
424        if (copy.getId() == null) {
425            copy.setId(UUID.randomUUID().toString());
426        }
427        ruleDefinition = copy.build();
428        ruleMap.put(ruleDefinition.getId(), ruleDefinition);
429        return ruleDefinition;
430    }
431
432    @Override
433    public RuleDefinition getRule(String ruleId) {
434        // GET_BY_ID
435        if (!this.ruleMap.containsKey(ruleId)) {
436            throw new RiceIllegalArgumentException(ruleId);
437        }
438        return this.ruleMap.get(ruleId);
439    }
440
441    @Override
442    public List<RuleDefinition> getRules(List<String> ruleIds) {
443        List<RuleDefinition> list = new ArrayList<RuleDefinition>();
444        for (String id : ruleIds) {
445            list.add(this.getRule(id));
446        }
447        return list;
448    }
449
450    @Override
451    public void updateRule(RuleDefinition ruleDefinition)
452            throws RiceIllegalArgumentException {
453        // UPDATE
454        RuleDefinition.Builder copy = RuleDefinition.Builder.create(ruleDefinition);
455        RuleDefinition old = this.getRule(ruleDefinition.getId());
456        if (!old.getVersionNumber().equals(copy.getVersionNumber())) {
457            throw new RiceIllegalStateException("" + old.getVersionNumber());
458        }
459        copy.setVersionNumber(copy.getVersionNumber() + 1);
460        ruleDefinition = copy.build();
461        this.ruleMap.put(ruleDefinition.getId(), ruleDefinition);
462        return;
463    }
464
465    @Override
466    public void deleteRule(String id)
467            throws RiceIllegalArgumentException {
468        // DELETE
469        if (this.ruleMap.remove(id) == null) {
470            throw new RiceIllegalArgumentException(id);
471        }
472        return;
473    }
474
475    @Override
476    public ActionDefinition createAction(ActionDefinition actionDefinition)
477            throws RiceIllegalArgumentException {
478        // CREATE
479        ActionDefinition orig = this.getAction(actionDefinition.getId());
480        if (orig != null) {
481            throw new RiceIllegalArgumentException(actionDefinition.getId());
482        }
483        ActionDefinition.Builder copy = ActionDefinition.Builder.create(actionDefinition);
484        if (copy.getId() == null) {
485            copy.setId(UUID.randomUUID().toString());
486        }
487        actionDefinition = copy.build();
488        actionMap.put(actionDefinition.getId(), actionDefinition);
489        return actionDefinition;
490    }
491
492    @Override
493    public ActionDefinition getAction(String actionId) {
494        // GET_BY_ID
495        if (!this.actionMap.containsKey(actionId)) {
496            throw new RiceIllegalArgumentException(actionId);
497        }
498        return this.actionMap.get(actionId);
499    }
500
501    @Override
502    public List<ActionDefinition> getActions(List<String> actionIds) {
503        List<ActionDefinition> list = new ArrayList<ActionDefinition>();
504        for (String id : actionIds) {
505            list.add(this.getAction(id));
506        }
507        return list;
508    }
509
510    @Override
511    public void updateAction(ActionDefinition actionDefinition)
512            throws RiceIllegalArgumentException {
513        // UPDATE
514        ActionDefinition.Builder copy = ActionDefinition.Builder.create(actionDefinition);
515        ActionDefinition old = this.getAction(actionDefinition.getId());
516        if (!old.getVersionNumber().equals(copy.getVersionNumber())) {
517            throw new RiceIllegalStateException("" + old.getVersionNumber());
518        }
519        copy.setVersionNumber(copy.getVersionNumber() + 1);
520        actionDefinition = copy.build();
521        this.actionMap.put(actionDefinition.getId(), actionDefinition);
522        return;
523    }
524
525    @Override
526    public void deleteAction(String id)
527            throws RiceIllegalArgumentException {
528        // DELETE
529        if (this.actionMap.remove(id) == null) {
530            throw new RiceIllegalArgumentException(id);
531        }
532        return;
533    }
534
535    @Override
536    public PropositionDefinition createProposition(PropositionDefinition propositionDefinition)
537            throws RiceIllegalArgumentException {
538        // CREATE
539        if (propositionDefinition.getId() != null) {
540            PropositionDefinition orig = this.getProposition(propositionDefinition.getId());
541            if (orig != null) {
542                throw new RiceIllegalArgumentException(propositionDefinition.getId());
543            }
544        }
545        PropositionDefinition.Builder copy = PropositionDefinition.Builder.create(propositionDefinition);
546        if (copy.getId() == null) {
547            copy.setId(UUID.randomUUID().toString());
548        }
549        for (PropositionParameter.Builder paramBldr : copy.getParameters()) {
550            if (paramBldr.getId() == null) {
551                paramBldr.setId(UUID.randomUUID().toString());
552            }
553            if (paramBldr.getPropId() == null) {
554                paramBldr.setPropId(copy.getId());
555            }
556            if (paramBldr.getTermValue() != null) {
557                TermDefinition termValue = paramBldr.getTermValue();
558                // no id means it does not exist yet
559                if (termValue.getId() == null) {
560                    termValue = this.termRepositoryService.createTerm(termValue);
561                    paramBldr.setTermValue(termValue);
562                }
563                if (paramBldr.getValue() == null) {
564                    paramBldr.setValue(termValue.getId());
565                }
566            }
567        }
568        propositionDefinition = copy.build();
569        propositionMap.put(propositionDefinition.getId(), propositionDefinition);
570        return propositionDefinition;
571    }
572
573    @Override
574    public PropositionDefinition getProposition(String id)
575            throws RiceIllegalArgumentException {
576        // GET_BY_ID
577        if (!this.propositionMap.containsKey(id)) {
578            throw new RiceIllegalArgumentException(id);
579        }
580        return this.propositionMap.get(id);
581    }
582
583    @Override
584    public Set<PropositionDefinition> getPropositionsByType(String typeId)
585            throws RiceIllegalArgumentException {
586        // GET_IDS_BY_TYPE
587        Set<PropositionDefinition> set = new LinkedHashSet<PropositionDefinition>();
588        for (PropositionDefinition info : propositionMap.values()) {
589            if (typeId.equals(info.getTypeId())) {
590                set.add(info);
591            }
592        }
593        return set;
594    }
595
596    @Override
597    public Set<PropositionDefinition> getPropositionsByRule(String ruleId)
598            throws RiceIllegalArgumentException {
599        Set<PropositionDefinition> set = new LinkedHashSet<PropositionDefinition>();
600        for (PropositionDefinition info : this.propositionMap.values()) {
601            if (info.getRuleId().equals(ruleId)) {
602                set.add(info);
603            }
604        }
605        return set;
606    }
607
608    @Override
609    public void updateProposition(PropositionDefinition propositionDefinition)
610            throws RiceIllegalArgumentException {
611        if (this.propositionMap.containsKey(propositionDefinition.getId())) {
612            throw new RiceIllegalArgumentException (propositionDefinition.getId() + "not found");
613        }
614        // UPDATE
615        PropositionDefinition.Builder copy = PropositionDefinition.Builder.create(propositionDefinition);
616        PropositionDefinition old = this.getProposition(propositionDefinition.getId());
617        if (!old.getVersionNumber().equals(copy.getVersionNumber())) {
618            throw new RiceIllegalStateException("" + old.getVersionNumber());
619        }
620        copy.setVersionNumber(copy.getVersionNumber() + 1);
621        for (PropositionParameter.Builder paramBldr : copy.getParameters()) {
622            if (paramBldr.getId() == null) {
623                paramBldr.setId(UUID.randomUUID().toString());
624            }
625            if (paramBldr.getPropId() == null) {
626                paramBldr.setPropId(copy.getId());
627            }
628            if (paramBldr.getTermValue() != null) {
629                TermDefinition termValue = paramBldr.getTermValue();
630                // no id means it does not exist yet
631                if (termValue.getId() == null) {
632                    termValue = this.termRepositoryService.createTerm(termValue);
633                    paramBldr.setTermValue(termValue);
634                }
635                if (paramBldr.getValue() == null) {
636                    paramBldr.setValue(termValue.getId());
637                }
638            }
639        }
640        propositionDefinition = copy.build();
641        this.propositionMap.put(propositionDefinition.getId(), propositionDefinition);
642        return;
643    }
644
645    @Override
646    public void deleteProposition(String id)
647            throws RiceIllegalArgumentException {
648        // DELETE
649        if (this.propositionMap.remove(id) == null) {
650            throw new RiceIllegalArgumentException(id);
651        }
652        return;
653    }
654
655    @Override
656    public NaturalLanguageUsage createNaturalLanguageUsage(NaturalLanguageUsage naturalLanguageUsage)
657            throws RiceIllegalArgumentException {
658        // CREATE
659        try {
660            NaturalLanguageUsage orig = this.getNaturalLanguageUsage(naturalLanguageUsage.getId());
661            if (orig != null) {
662                throw new RiceIllegalArgumentException(naturalLanguageUsage.getId());
663            }
664        } catch (RiceIllegalArgumentException ex) {
665//            same as returning null
666        }
667        NaturalLanguageUsage.Builder copy = NaturalLanguageUsage.Builder.create(naturalLanguageUsage);
668        if (copy.getId() == null) {
669            copy.setId(UUID.randomUUID().toString());
670        }
671        naturalLanguageUsage = copy.build();
672        naturalLanguageUsageMap.put(naturalLanguageUsage.getId(), naturalLanguageUsage);
673        return naturalLanguageUsage;
674    }
675
676    @Override
677    public NaturalLanguageUsage getNaturalLanguageUsage(String id)
678            throws RiceIllegalArgumentException {
679        // GET_BY_ID
680        if (!this.naturalLanguageUsageMap.containsKey(id)) {
681            throw new RiceIllegalArgumentException(id);
682        }
683        return this.naturalLanguageUsageMap.get(id);
684    }
685
686    @Override
687    public void updateNaturalLanguageUsage(NaturalLanguageUsage naturalLanguageUsage)
688            throws RiceIllegalArgumentException {
689        // UPDATE
690        NaturalLanguageUsage.Builder copy = NaturalLanguageUsage.Builder.create(naturalLanguageUsage);
691        NaturalLanguageUsage old = this.getNaturalLanguageUsage(naturalLanguageUsage.getId());
692        if (!old.getVersionNumber().equals(copy.getVersionNumber())) {
693            throw new RiceIllegalStateException("" + old.getVersionNumber());
694        }
695        copy.setVersionNumber(copy.getVersionNumber() + 1);
696        naturalLanguageUsage = copy.build();
697        this.naturalLanguageUsageMap.put(naturalLanguageUsage.getId(), naturalLanguageUsage);
698        return;
699    }
700
701    @Override
702    public void deleteNaturalLanguageUsage(String naturalLanguageUsageId)
703            throws RiceIllegalArgumentException {
704        // DELETE
705        if (this.naturalLanguageUsageMap.remove(naturalLanguageUsageId) == null) {
706            throw new RiceIllegalArgumentException(naturalLanguageUsageId);
707        }
708        return;
709    }
710
711    ////
712    //// natural language translations
713    ////
714    @Override
715    public String translateNaturalLanguageForObject(String naturalLanguageUsageId,
716            String typeId,
717            String krmsObjectId,
718            String languageCode)
719            throws RiceIllegalArgumentException {
720        TranslationUtility util = new TranslationUtility(this, this.templater);
721        return util.translateNaturalLanguageForObject(naturalLanguageUsageId, typeId, krmsObjectId, languageCode);
722    }
723
724    @Override
725    public String translateNaturalLanguageForProposition(String naturalLanguageUsageId,
726            PropositionDefinition proposition, String languageCode)
727            throws RiceIllegalArgumentException {
728        TranslationUtility util = new TranslationUtility(this, this.templater);
729        return util.translateNaturalLanguageForProposition(naturalLanguageUsageId, proposition, languageCode);
730    }
731
732    @Override
733    public NaturalLanguageTree translateNaturalLanguageTreeForProposition(String naturalLanguageUsageId,
734            PropositionDefinition propositionDefinintion,
735            String languageCode) throws RiceIllegalArgumentException {
736        TranslationUtility util = new TranslationUtility(this, this.templater);
737        return util.translateNaturalLanguageTreeForProposition(naturalLanguageUsageId, propositionDefinintion, languageCode);
738    }
739
740    @Override
741    public List<NaturalLanguageUsage> getNaturalLanguageUsagesByNamespace(String namespace) throws RiceIllegalArgumentException {
742        List<NaturalLanguageUsage> list = new ArrayList<NaturalLanguageUsage>();
743        for (NaturalLanguageUsage info : naturalLanguageUsageMap.values()) {
744            if (namespace.equals(info.getNamespace())) {
745                list.add(info);
746            }
747        }
748        return list;
749    }
750
751    @Override
752    public NaturalLanguageUsage getNaturalLanguageUsageByNameAndNamespace(String name, String namespace) throws RiceIllegalArgumentException {
753        for (NaturalLanguageUsage info : naturalLanguageUsageMap.values()) {
754            if (namespace.equals(info.getNamespace())) {
755                if (name.equals(info.getName())) {
756                    return info;
757                }
758            }
759        }
760        return null;
761    }
762
763    @Override
764    public ContextDefinition selectContext(ContextSelectionCriteria contextSelectionCriteria) throws RiceIllegalArgumentException {
765        throw new UnsupportedOperationException("Not supported yet.");
766    }
767
768    @Override
769    public AgendaTreeDefinition getAgendaTree(String agendaId) throws RiceIllegalArgumentException {
770        throw new UnsupportedOperationException("Not supported yet.");
771    }
772
773    @Override
774    public List<AgendaTreeDefinition> getAgendaTrees(List<String> agendaIds) throws RiceIllegalArgumentException {
775        throw new UnsupportedOperationException("Not supported yet.");
776    }
777
778    @Override
779    public ContextDefinition createContext(ContextDefinition contextDefinition)
780            throws RiceIllegalArgumentException {
781        // CREATE
782        ContextDefinition orig = this.getContextByNameAndNamespace(contextDefinition.getName(), contextDefinition.getNamespace());
783        if (orig != null) {
784            throw new RiceIllegalArgumentException(contextDefinition.getNamespace() + "." + contextDefinition.getName());
785        }
786        ContextDefinition.Builder copy = ContextDefinition.Builder.create(contextDefinition);
787        if (copy.getId() == null) {
788            copy.setId(UUID.randomUUID().toString());
789        }
790        contextDefinition = copy.build();
791        contextMap.put(contextDefinition.getId(), contextDefinition);
792        return contextDefinition;
793    }
794
795    @Override
796    public ContextDefinition findCreateContext(ContextDefinition contextDefinition) throws RiceIllegalArgumentException {
797        ContextDefinition orig = this.getContextByNameAndNamespace(contextDefinition.getName(), contextDefinition.getNamespace());
798        if (orig != null) {
799            return orig;
800        }
801        return this.createContext(contextDefinition);
802    }
803
804    @Override
805    public void updateContext(ContextDefinition contextDefinition)
806            throws RiceIllegalArgumentException {
807        // UPDATE
808        ContextDefinition.Builder copy = ContextDefinition.Builder.create(contextDefinition);
809        ContextDefinition old = this.getContext(contextDefinition.getId());
810        if (!old.getVersionNumber().equals(copy.getVersionNumber())) {
811            throw new RiceIllegalStateException("" + old.getVersionNumber());
812        }
813        copy.setVersionNumber(copy.getVersionNumber() + 1);
814        contextDefinition = copy.build();
815        this.contextMap.put(contextDefinition.getId(), contextDefinition);
816        return;
817    }
818
819    @Override
820    public void deleteContext(String id)
821            throws RiceIllegalArgumentException {
822        // DELETE
823        if (this.contextMap.remove(id) == null) {
824            throw new RiceIllegalArgumentException(id);
825        }
826        return;
827    }
828
829    @Override
830    public ContextDefinition getContext(String id)
831            throws RiceIllegalArgumentException {
832        // GET_BY_ID
833        if (!this.contextMap.containsKey(id)) {
834            throw new RiceIllegalArgumentException(id);
835        }
836        return this.contextMap.get(id);
837    }
838
839    @Override
840    public ContextDefinition getContextByNameAndNamespace(String name, String namespace)
841            throws RiceIllegalArgumentException {
842        if (name == null || name.trim().isEmpty()) {
843            throw new RiceIllegalArgumentException("name is null or empty");
844        }
845        if (namespace == null || namespace.trim().isEmpty()) {
846            throw new RiceIllegalArgumentException("name is null or empty");
847        }
848        // RICE_GET_BY_NAMESPACE_AND_NAME
849        for (ContextDefinition info : contextMap.values()) {
850            if (name.equals(info.getName())) {
851                if (namespace.equals(info.getNamespace())) {
852                    return ContextDefinition.Builder.create(info).build();
853                }
854            }
855        }
856        return null;
857    }
858
859    @Override
860    public NaturalLanguageTemplate createNaturalLanguageTemplate(NaturalLanguageTemplate naturalLanguageTemplate)
861            throws RiceIllegalArgumentException {
862        // CREATE
863        try {
864            NaturalLanguageTemplate orig = this.getNaturalLanguageTemplate(naturalLanguageTemplate.getId());
865            if (orig != null) {
866                throw new RiceIllegalArgumentException(naturalLanguageTemplate.getId());
867            }
868        } catch (RiceIllegalArgumentException ex) {
869            // same as getting a null
870        }
871        NaturalLanguageTemplate.Builder copy = NaturalLanguageTemplate.Builder.create(naturalLanguageTemplate);
872        if (copy.getId() == null) {
873            copy.setId(UUID.randomUUID().toString());
874        }
875        naturalLanguageTemplate = copy.build();
876        naturalLanguageTemplateMap.put(naturalLanguageTemplate.getId(), naturalLanguageTemplate);
877        return naturalLanguageTemplate;
878    }
879
880    @Override
881    public NaturalLanguageTemplate getNaturalLanguageTemplate(String naturalLanguageTemplateId)
882            throws RiceIllegalArgumentException {
883        // GET_BY_ID
884        if (!this.naturalLanguageTemplateMap.containsKey(naturalLanguageTemplateId)) {
885            throw new RiceIllegalArgumentException(naturalLanguageTemplateId);
886        }
887        return this.naturalLanguageTemplateMap.get(naturalLanguageTemplateId);
888    }
889
890    @Override
891    public void updateNaturalLanguageTemplate(NaturalLanguageTemplate naturalLanguageTemplate)
892            throws RiceIllegalArgumentException {
893        // UPDATE
894        NaturalLanguageTemplate.Builder copy = NaturalLanguageTemplate.Builder.create(naturalLanguageTemplate);
895        NaturalLanguageTemplate old = this.getNaturalLanguageTemplate(naturalLanguageTemplate.getId());
896        if (!old.getVersionNumber().equals(copy.getVersionNumber())) {
897            throw new RiceIllegalStateException("" + old.getVersionNumber());
898        }
899        copy.setVersionNumber(copy.getVersionNumber() + 1);
900        naturalLanguageTemplate = copy.build();
901        this.naturalLanguageTemplateMap.put(naturalLanguageTemplate.getId(), naturalLanguageTemplate);
902        return;
903    }
904
905    @Override
906    public void deleteNaturalLanguageTemplate(String naturalLanguageTemplateId)
907            throws RiceIllegalArgumentException {
908        // DELETE
909        if (this.naturalLanguageTemplateMap.remove(naturalLanguageTemplateId) == null) {
910            throw new RiceIllegalArgumentException(naturalLanguageTemplateId);
911        }
912        return;
913    }
914
915    @Override
916    public List<NaturalLanguageTemplate> findNaturalLanguageTemplatesByLanguageCode(String languageCode)
917            throws RiceIllegalArgumentException {
918        List<NaturalLanguageTemplate> list = new ArrayList<NaturalLanguageTemplate>();
919        for (NaturalLanguageTemplate nlt : this.naturalLanguageTemplateMap.values()) {
920            if (nlt.getLanguageCode().equals(languageCode)) {
921                list.add(nlt);
922            }
923        }
924        return list;
925    }
926
927    @Override
928    public NaturalLanguageTemplate findNaturalLanguageTemplateByLanguageCodeTypeIdAndNluId(String languageCode, String typeId, String naturalLanguageUsageId)
929            throws RiceIllegalArgumentException {
930        for (NaturalLanguageTemplate nlt : this.naturalLanguageTemplateMap.values()) {
931            if (nlt.getLanguageCode().equals(languageCode)) {
932                if (nlt.getTypeId().equals(typeId)) {
933                    if (nlt.getNaturalLanguageUsageId().equals(naturalLanguageUsageId)) {
934                        return nlt;
935                    }
936                }
937            }
938        }
939        return null;
940    }
941
942    @Override
943    public List<NaturalLanguageTemplate> findNaturalLanguageTemplatesByNaturalLanguageUsage(String naturalLanguageUsageId)
944            throws RiceIllegalArgumentException {
945        List<NaturalLanguageTemplate> list = new ArrayList<NaturalLanguageTemplate>();
946        for (NaturalLanguageTemplate nlt : this.naturalLanguageTemplateMap.values()) {
947            if (nlt.getNaturalLanguageUsageId().equals(naturalLanguageUsageId)) {
948                list.add(nlt);
949            }
950        }
951        return list;
952    }
953
954    @Override
955    public List<NaturalLanguageTemplate> findNaturalLanguageTemplatesByType(String typeId)
956            throws RiceIllegalArgumentException {
957        List<NaturalLanguageTemplate> list = new ArrayList<NaturalLanguageTemplate>();
958        for (NaturalLanguageTemplate nlt : this.naturalLanguageTemplateMap.values()) {
959            if (nlt.getTypeId().equals(typeId)) {
960                list.add(nlt);
961            }
962        }
963        return list;
964    }
965
966    @Override
967    public List<NaturalLanguageTemplate> findNaturalLanguageTemplatesByTemplate(String template)
968            throws RiceIllegalArgumentException {
969        List<NaturalLanguageTemplate> list = new ArrayList<NaturalLanguageTemplate>();
970        for (NaturalLanguageTemplate nlt : this.naturalLanguageTemplateMap.values()) {
971            if (nlt.getTemplate().equals(template)) {
972                list.add(nlt);
973            }
974        }
975        return list;
976    }
977
978    @Override
979    public List<String> findContextIds(QueryByCriteria queryByCriteria) throws RiceIllegalArgumentException {
980        CriteriaMatcherInMemory<ContextDefinition> instance = new CriteriaMatcherInMemory<ContextDefinition>();
981        instance.setCriteria(queryByCriteria);
982        Collection<ContextDefinition> selected = instance.findMatching(this.contextMap.values());
983        List<String> list = new ArrayList<String>();
984        for (ContextDefinition sel : selected) {
985            list.add(sel.getId());
986        }
987        return list;
988    }
989
990    @Override
991    public List<String> findAgendaIds(QueryByCriteria queryByCriteria) throws RiceIllegalArgumentException {
992        CriteriaMatcherInMemory<AgendaDefinition> instance = new CriteriaMatcherInMemory<AgendaDefinition>();
993        instance.setCriteria(queryByCriteria);
994        Collection<AgendaDefinition> selected = instance.findMatching(this.agendaMap.values());
995        List<String> list = new ArrayList<String>();
996        for (AgendaDefinition sel : selected) {
997            list.add(sel.getId());
998        }
999        return list;
1000    }
1001
1002    @Override
1003    public List<String> findRuleIds(QueryByCriteria queryByCriteria) throws RiceIllegalArgumentException {
1004        CriteriaMatcherInMemory<RuleDefinition> instance = new CriteriaMatcherInMemory<RuleDefinition>();
1005        instance.setCriteria(queryByCriteria);
1006        Collection<RuleDefinition> selected = instance.findMatching(this.ruleMap.values());
1007        List<String> list = new ArrayList<String>();
1008        for (RuleDefinition sel : selected) {
1009            list.add(sel.getId());
1010        }
1011        return list;
1012    }
1013
1014    @Override
1015    public List<String> findActionIds(QueryByCriteria queryByCriteria) throws RiceIllegalArgumentException {
1016        CriteriaMatcherInMemory<ActionDefinition> instance = new CriteriaMatcherInMemory<ActionDefinition>();
1017        instance.setCriteria(queryByCriteria);
1018        Collection<ActionDefinition> selected = instance.findMatching(this.actionMap.values());
1019        List<String> list = new ArrayList<String>();
1020        for (ActionDefinition sel : selected) {
1021            list.add(sel.getId());
1022        }
1023        return list;
1024    }
1025
1026    @Override
1027    public List<String> findPropositionIds(QueryByCriteria queryByCriteria) throws RiceIllegalArgumentException {
1028        CriteriaMatcherInMemory<PropositionDefinition> instance = new CriteriaMatcherInMemory<PropositionDefinition>();
1029        instance.setCriteria(queryByCriteria);
1030        Collection<PropositionDefinition> selected = instance.findMatching(this.propositionMap.values());
1031        List<String> list = new ArrayList<String>();
1032        for (PropositionDefinition sel : selected) {
1033            list.add(sel.getId());
1034        }
1035        return list;
1036    }
1037}