001    package railo.runtime.type.scope;
002    
003    import java.io.Serializable;
004    
005    import railo.runtime.PageContext;
006    import railo.runtime.config.ConfigServer;
007    import railo.runtime.dump.DumpData;
008    import railo.runtime.dump.DumpProperties;
009    import railo.runtime.exp.ExpressionException;
010    import railo.runtime.exp.PageException;
011    import railo.runtime.op.Caster;
012    import railo.runtime.type.Collection;
013    import railo.runtime.type.Sizeable;
014    import railo.runtime.type.Struct;
015    
016    public final class ClusterWrap extends ScopeSupport implements Cluster,Sizeable {
017    
018            private static final long serialVersionUID = -4952656252539755770L;
019            
020            private ClusterRemote core;
021            private int offset;
022            private ConfigServer configServer;
023    
024            public ClusterWrap(ConfigServer cs,ClusterRemote core) {
025                    this(cs,core,false);
026            }
027            
028            private ClusterWrap(ConfigServer configServer,ClusterRemote core,boolean duplicate) {
029                    super(true, "cluster", Struct.TYPE_SYNC);
030                    this.configServer=configServer;
031                    if(duplicate) this.core=core.duplicate();
032                    else this.core=core;
033                    this.core.init(configServer,this);
034            }
035            
036            @Override
037            public void init(ConfigServer configServer) {
038                    // for the custer wrap this method is not invoked, but it is part of the interface
039            }
040    
041            @Override
042            public Object get(Key key) throws PageException {
043                    return ((ClusterEntry)super.get(key)).getValue();
044            }
045    
046            @Override
047            public Object get(Key key, Object defaultValue) {
048                    Object res = super.get(key,defaultValue);
049                    if(res instanceof ClusterEntry) return  ((ClusterEntry)res).getValue();
050                    return res;
051            }
052            
053            @Override
054            public Object remove(Key key) throws PageException {
055                    core.addEntry(new ClusterEntryImpl(key,null,offset));
056                    return ((ClusterEntry)super.remove (key)).getValue();
057                    
058            }
059    
060            public Object removeEL(Key key) {
061                    core.addEntry(new ClusterEntryImpl(key,null,offset));
062                    ClusterEntry entry = (ClusterEntry) super.removeEL (key);
063                    if(entry!=null) return entry.getValue();
064                    return null;
065            }
066    
067            @Override
068            public Object setEL(Key key, Object value) {
069                    if(core.checkValue(value)) {
070                            ClusterEntry entry;
071                            core.addEntry(entry=new ClusterEntryImpl(key,(Serializable)value,offset));
072                            super.setEL (key, entry);
073                    }
074                    return value;
075            }
076    
077            public void setEntry(ClusterEntry newEntry) {
078                    ClusterEntry existingEntry=(ClusterEntry)super.get(newEntry.getKey(),null);
079                    // add
080                    if(existingEntry==null || existingEntry.getTime()<newEntry.getTime()) {
081                            if(newEntry.getValue()==null)removeEL (newEntry.getKey());
082                            else {
083                                    core.addEntry(newEntry);
084                                    super.setEL (newEntry.getKey(), newEntry);
085                            }
086                    }
087            }
088            
089            @Override
090            public Object set(Key key, Object value) throws PageException {
091                    if(!core.checkValue(value))
092                            throw new ExpressionException("object from type ["+Caster.toTypeName(value)+"] are not allowed in cluster scope" );
093                    ClusterEntry entry;
094                    core.addEntry(entry=new ClusterEntryImpl(key,(Serializable)value,offset));
095                    super.setEL (key, entry);
096                    return value;
097            }
098            
099            @Override
100            public DumpData toDumpData(PageContext pageContext, int maxlevel, DumpProperties dp) {
101                    return super.toDumpData(pageContext, maxlevel,dp);
102            }
103    
104            @Override
105            public int getType() {
106                    return SCOPE_CLUSTER;
107            } 
108    
109            @Override
110            public String getTypeAsString() {
111                    return "cluster";
112            }
113            
114            @Override
115            public Collection duplicate(boolean deepCopy) {
116                    return new ClusterWrap(configServer,core,true);
117            }
118    
119            @Override
120            public void broadcast() {
121                    core.broadcastEntries();
122            }
123    
124            @Override
125            public long sizeOf() {
126                    return 0;
127            }
128    }