001/*
002  GRANITE DATA SERVICES
003  Copyright (C) 2011 GRANITE DATA SERVICES S.A.S.
004
005  This file is part of Granite Data Services.
006
007  Granite Data Services is free software; you can redistribute it and/or modify
008  it under the terms of the GNU Library General Public License as published by
009  the Free Software Foundation; either version 2 of the License, or (at your
010  option) any later version.
011
012  Granite Data Services is distributed in the hope that it will be useful, but
013  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015  for more details.
016
017  You should have received a copy of the GNU Library General Public License
018  along with this library; if not, see <http://www.gnu.org/licenses/>.
019*/
020
021package org.granite.tide.seam;
022
023import java.util.ArrayList;
024import java.util.List;
025
026import org.granite.tide.invocation.ContextEvent;
027import org.granite.tide.invocation.ContextUpdate;
028
029
030/**
031 * @author William DRAI
032 */
033public class TideInvocation {
034    
035    private static ThreadLocal<TideInvocation> invocation = new ThreadLocal<TideInvocation>();
036    
037    public static TideInvocation get() {
038        return invocation.get();
039    }
040    
041    public static TideInvocation init() {
042        TideInvocation ti = new TideInvocation();
043        invocation.set(ti);
044        return ti;
045    }
046    
047    public static void remove() {
048        invocation.remove();
049    }
050    
051    private boolean locked = false;
052    private boolean enabled = false;
053    private boolean updated = false;
054    private boolean evaluated = false;
055    private final List<ContextUpdate> updates = new ArrayList<ContextUpdate>();
056    private final List<ContextUpdate> results = new ArrayList<ContextUpdate>();
057    private final List<ContextEvent> events = new ArrayList<ContextEvent>();
058
059    
060    public List<ContextUpdate> getUpdates() {
061        return updates;
062    }
063    
064    public List<ContextUpdate> getResults() {
065        return results;
066    }
067    
068    public List<ContextEvent> getEvents() {
069        return events;
070    }
071    
072    public void update(List<ContextUpdate> updates) {
073        this.enabled = true;
074        this.updated = false;
075        this.updates.clear();
076        if (updates != null)
077            this.updates.addAll(updates);
078    }
079    public void updated() {
080        this.updated = true;
081        this.updates.clear();
082    }
083    public boolean isUpdated() {
084        return this.updated;
085    }
086    
087    public void evaluate() {
088        this.evaluated = false;
089        this.results.clear();
090    }
091    public void evaluated(List<ContextUpdate> results) {
092        this.evaluated = true;
093//        this.results.clear();
094        this.results.addAll(results);
095        this.updated = false;
096        this.updates.clear();
097    }
098    public boolean isEvaluated() {
099        return this.evaluated;
100    }
101    
102    public void addEvent(ContextEvent event) {
103        events.add(event);
104    }
105    
106    public void lock() {
107        this.locked = true;
108    }
109    public void unlock() {
110        this.locked = false;
111    }
112    public boolean isLocked() {
113        return this.locked;
114    }
115    
116    public boolean isEnabled() {
117        return enabled;
118    }
119}