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 }