package com.tibco.as.spacebar.ui.model; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import com.tibco.as.space.ASException; import com.tibco.as.space.FieldDef; import com.tibco.as.space.FieldDef.FieldType; import com.tibco.as.space.IndexDef; import com.tibco.as.space.IndexDef.IndexType; import com.tibco.as.space.KeyDef; import com.tibco.as.space.Member; import com.tibco.as.space.Member.DistributionRole; import com.tibco.as.space.Metaspace; import com.tibco.as.space.SpaceDef; import com.tibco.as.space.SpaceDef.CachePolicy; import com.tibco.as.space.SpaceDef.DistributionPolicy; import com.tibco.as.space.SpaceDef.EvictionPolicy; import com.tibco.as.space.SpaceDef.LockScope; import com.tibco.as.space.SpaceDef.PersistencePolicy; import com.tibco.as.space.SpaceDef.PersistenceType; import com.tibco.as.space.SpaceDef.ReplicationPolicy; import com.tibco.as.space.SpaceDef.SpaceState; import com.tibco.as.space.SpaceDef.UpdateTransport; import com.tibco.as.spacebar.ui.SpaceBarPlugin; import com.tibco.as.util.Utils; public class Space extends AbstractElement implements Cloneable { private Spaces spaces; private SpaceMembers members; private SpaceFields fields; private Keys keys; private Distribution distribution; private Indexes indexes; private CachePolicy cachePolicy; private long capacity; private DistributionPolicy distributionPolicy; private EvictionPolicy evictionPolicy; private long fileSyncInterval; private boolean forgetOldValue; private boolean hostAwareReplication; private IndexType keyIndexType; private LockScope lockScope; private long lockTtl; private long lockWait; private int minSeederCount; private String name; private DistributionPolicy persistenceDistributionPolicy; private PersistencePolicy persistencePolicy; private PersistenceType persistenceType; private int phaseCount; private int phaseRatio; private long queryLimit; private long queryTimeout; private long readTimeout; private int replicationCount; private ReplicationPolicy replicationPolicy; private boolean routed; private long spaceWait; private long ttl; private UpdateTransport updateTransport; private int virtualNodeCount; private long writeTimeout; private com.tibco.as.space.Space space; public Space() { members = new SpaceMembers(); members.setSpace(this); fields = new SpaceFields(); fields.setSpace(this); keys = new Keys(); keys.setSpace(this); distribution = new Distribution(); distribution.setSpace(this); indexes = new Indexes(); indexes.setSpace(this); } @Override public String getName() { return name; } public void setName(String name) { fireNameChange(this.name, this.name = name); } public void setSpaceDef(SpaceDef spaceDef) { setCachePolicy(spaceDef.getCachePolicy()); setCapacity(spaceDef.getCapacity()); setDistributionPolicy(spaceDef.getDistributionPolicy()); setEvictionPolicy(spaceDef.getEvictionPolicy()); if (Utils.hasSpaceDefMethod("getFileSyncInterval")) { setFileSyncInterval(spaceDef.getFileSyncInterval()); } setForgetOldValue(spaceDef.isForgetOldValue()); setHostAwareReplication(spaceDef.isHostAwareReplication()); setKeyIndexType(spaceDef.getKeyDef().getIndexType()); setLockScope(spaceDef.getLockScope()); setLockTTL(spaceDef.getLockTTL()); setLockWait(spaceDef.getLockWait()); setMinSeederCount(spaceDef.getMinSeederCount()); setName(spaceDef.getName()); setPersistenceDistributionPolicy(spaceDef .getPersistenceDistributionPolicy()); setPersistencePolicy(spaceDef.getPersistencePolicy()); setPersistenceType(spaceDef.getPersistenceType()); setPhaseCount(spaceDef.getPhaseCount()); if (Utils.hasSpaceDefMethod("getPhaseRatio")) { setPhaseRatio(spaceDef.getPhaseRatio()); } if (Utils.hasSpaceDefMethod("getQueryLimit")) { setQueryLimit(spaceDef.getQueryLimit()); } if (Utils.hasSpaceDefMethod("getQueryTimeout")) { setQueryTimeout(spaceDef.getQueryTimeout()); } setReadTimeout(spaceDef.getReadTimeout()); setReplicationCount(spaceDef.getReplicationCount()); setReplicationPolicy(spaceDef.getReplicationPolicy()); if (Utils.hasSpaceDefMethod("isRouted")) { setRouted(spaceDef.isRouted()); } setSpaceWait(spaceDef.getSpaceWait()); setTTL(spaceDef.getTTL()); setUpdateTransport(spaceDef.getUpdateTransport()); setVirtualNodeCount(spaceDef.getVirtualNodeCount()); setWriteTimeout(spaceDef.getWriteTimeout()); Collection<String> keyFields = spaceDef.getKeyDef().getFieldNames(); Collection<String> distributionFields = new ArrayList<String>(); if (Utils.hasSpaceDefMethod("getDistributionFields")) { if (spaceDef.getDistributionFields() != null) { distributionFields = spaceDef.getDistributionFields(); } } for (FieldDef fieldDef : spaceDef.getFieldDefs()) { String fieldName = fieldDef.getName(); Field field = new Field(); field.setFields(fields); field.setName(fieldName); field.setType(fieldDef.getType()); field.setNullable(fieldDef.isNullable()); if (Utils.hasFieldDefMethod("isEncrypted")) { field.setEncrypted(fieldDef.isEncrypted()); } field.setKey(keyFields.contains(fieldName)); field.setDistribution(distributionFields.contains(fieldName)); fields.addChild(field); } for (String keyField : keyFields) { Field field = fields.getField(keyField); keys.addChild(field); } for (String fieldName : distributionFields) { distribution.addChild(fields.getField(fieldName)); } for (Index index : indexes.getIndexes()) { if (spaceDef.getIndexDef(index.getName()) == null) { indexes.removeChild(index); } } for (IndexDef indexDef : spaceDef.getIndexDefList()) { String indexName = indexDef.getName(); Index index = indexes.getIndex(indexName); boolean newIndex = false; if (index == null) { index = new Index(); index.setIndexes(indexes); index.setName(indexName); newIndex = true; } index.setType(indexDef.getIndexType()); Collection<String> fieldNames = indexDef.getFieldNames(); for (IElement field : index.getChildren()) { if (!fieldNames.contains(field.getName())) { index.removeChild(field); } } for (String fieldName : fieldNames) { if (index.getChild(fieldName) == null) { index.addChild(fields.getChild(fieldName)); } } if (newIndex) { indexes.addChild(index); } } } public SpaceDef getSpaceDef() { SpaceDef spaceDef = SpaceDef.create(); spaceDef.setCachePolicy(cachePolicy); spaceDef.setCapacity(capacity); spaceDef.setDistributionPolicy(distributionPolicy); spaceDef.setEvictionPolicy(evictionPolicy); if (Utils.hasSpaceDefMethod("setFileSyncInterval")) { spaceDef.setFileSyncInterval(fileSyncInterval); } spaceDef.setForgetOldValue(forgetOldValue); spaceDef.setHostAwareReplication(hostAwareReplication); spaceDef.setLockScope(lockScope); spaceDef.setLockTTL(lockTtl); spaceDef.setLockWait(lockWait); spaceDef.setMinSeederCount(minSeederCount); spaceDef.setName(name); spaceDef.setPersistenceDistributionPolicy(persistenceDistributionPolicy); spaceDef.setPersistencePolicy(persistencePolicy); spaceDef.setPersistenceType(persistenceType); spaceDef.setPhaseCount(phaseCount); if (Utils.hasSpaceDefMethod("setPhaseRatio")) { spaceDef.setPhaseRatio(phaseRatio); } if (Utils.hasSpaceDefMethod("setQueryLimit")) { spaceDef.setQueryLimit(queryLimit); } if (Utils.hasSpaceDefMethod("setQueryTimeout")) { spaceDef.setQueryTimeout(queryTimeout); } spaceDef.setReadTimeout(readTimeout); spaceDef.setReplicationCount(replicationCount); spaceDef.setReplicationPolicy(replicationPolicy); if (Utils.hasSpaceDefMethod("setRouted")) { spaceDef.setRouted(routed); } spaceDef.setSpaceWait(spaceWait); spaceDef.setTTL(ttl); spaceDef.setUpdateTransport(updateTransport); spaceDef.setVirtualNodeCount(virtualNodeCount); spaceDef.setWriteTimeout(writeTimeout); for (IElement element : fields.getChildren()) { Field field = (Field) element; FieldDef fieldDef = FieldDef.create(field.getName(), FieldType.valueOf(field.getType().name())); if (Utils.hasFieldDefMethod("setEncrypted")) { fieldDef.setEncrypted(field.isEncrypted()); } fieldDef.setNullable(field.isNullable()); spaceDef.putFieldDef(fieldDef); } for (Index index : indexes.getIndexes()) { IndexDef indexDef = IndexDef.create(index.getName()); indexDef.setIndexType(index.getType()); List<String> fields = new ArrayList<String>(); for (Field indexField : index.getChildren()) { fields.add(indexField.getName()); } indexDef.setFieldNames(fields.toArray(new String[fields.size()])); spaceDef.addIndexDef(indexDef); } List<Field> distributionFields = distribution.getChildren(); String[] distribution = new String[distributionFields.size()]; for (int index = 0; index < distribution.length; index++) { distribution[index] = distributionFields.get(index).getName(); } if (Utils.hasSpaceDefMethod("setDistributionFields")) { spaceDef.setDistributionFields(distribution); } KeyDef keyDef = spaceDef.getKeyDef(); keyDef.setIndexType(keyIndexType); if (!keys.getChildren().isEmpty()) { List<String> keyFields = new ArrayList<String>(); for (Field keyField : keys.getChildren()) { keyFields.add(keyField.getName()); } keyDef.setFieldNames(keyFields.toArray(new String[keyFields.size()])); } spaceDef.setKeyDef(keyDef); return spaceDef; } @Override public Space clone() { Space space = new Space(); copyTo(space); return space; } @Override public Spaces getParent() { return spaces; } @Override public void copyTo(IElement element) { Space space = (Space) element; space.setSpaces(spaces); space.setName(name); space.setFields(fields.clone()); space.setKeys(keys.clone()); space.setDistribution(distribution.clone()); space.setIndexes(indexes.clone()); space.setCachePolicy(cachePolicy); space.setCapacity(capacity); space.setDistributionPolicy(distributionPolicy); space.setEvictionPolicy(evictionPolicy); space.setForgetOldValue(forgetOldValue); space.setHostAwareReplication(hostAwareReplication); space.setRouted(routed); space.setLockScope(lockScope); space.setLockTTL(lockTtl); space.setLockWait(lockWait); space.setMinSeederCount(minSeederCount); space.setPersistenceDistributionPolicy(persistenceDistributionPolicy); space.setPersistencePolicy(persistencePolicy); space.setPersistenceType(persistenceType); space.setPhaseCount(phaseCount); space.setPhaseRatio(phaseRatio); space.setQueryLimit(queryLimit); space.setQueryTimeout(queryTimeout); space.setReadTimeout(readTimeout); space.setReplicationCount(replicationCount); space.setReplicationPolicy(replicationPolicy); space.setSpaceWait(spaceWait); space.setTTL(ttl); space.setUpdateTransport(updateTransport); space.setVirtualNodeCount(virtualNodeCount); space.setWriteTimeout(writeTimeout); } public void setIndexes(Indexes indexes) { this.indexes = indexes; } public void setDistribution(Distribution distribution) { this.distribution = distribution; } public void setKeys(Keys keys) { this.keys = keys; } public void setFields(SpaceFields fields) { this.fields = fields; } public void setSpaces(Spaces spaces) { this.spaces = spaces; } public SpaceMembers getMembers() { return members; } public SpaceFields getFields() { return fields; } public Indexes getIndexes() { return indexes; } public Keys getKeys() { return keys; } public Distribution getDistribution() { return distribution; } public com.tibco.as.space.Space getSpace() throws ASException { return spaces.getParent().getConnection().getMetaspace().getSpace(name); } public int getReplicationCount() { return replicationCount; } public void setReplicationCount(int replicationCount) { this.replicationCount = replicationCount; } public ReplicationPolicy getReplicationPolicy() { return replicationPolicy; } public void setReplicationPolicy(ReplicationPolicy replicationPolicy) { this.replicationPolicy = replicationPolicy; } public EvictionPolicy getEvictionPolicy() { return evictionPolicy; } public void setEvictionPolicy(EvictionPolicy evictionPolicy) { this.evictionPolicy = evictionPolicy; } public CachePolicy getCachePolicy() { return cachePolicy; } public void setCachePolicy(CachePolicy cachePolicy) { this.cachePolicy = cachePolicy; } public PersistencePolicy getPersistencePolicy() { return persistencePolicy; } public void setPersistencePolicy(PersistencePolicy persistencePolicy) { this.persistencePolicy = persistencePolicy; } public PersistenceType getPersistenceType() { return persistenceType; } public void setPersistenceType(PersistenceType persistenceType) { this.persistenceType = persistenceType; } public DistributionPolicy getPersistenceDistributionPolicy() { return persistenceDistributionPolicy; } public void setPersistenceDistributionPolicy( DistributionPolicy persistenceDistributionPolicy) { this.persistenceDistributionPolicy = persistenceDistributionPolicy; } public int getMinSeederCount() { return minSeederCount; } public void setMinSeederCount(int minSeederCount) { this.minSeederCount = minSeederCount; } public DistributionPolicy getDistributionPolicy() { return distributionPolicy; } public void setDistributionPolicy(DistributionPolicy distributionPolicy) { this.distributionPolicy = distributionPolicy; } public LockScope getLockScope() { return lockScope; } public void setLockScope(LockScope lockScope) { this.lockScope = lockScope; } public long getCapacity() { return capacity; } public void setCapacity(long capacity) { this.capacity = capacity; } public long getTTL() { return ttl; } public void setTTL(long ttl) { this.ttl = ttl; } public long getLockTTL() { return lockTtl; } public void setLockTTL(long lockTtl) { this.lockTtl = lockTtl; } public long getLockWait() { return lockWait; } public void setLockWait(long lockWait) { this.lockWait = lockWait; } public int getPhaseCount() { return phaseCount; } public void setPhaseCount(int phaseCount) { this.phaseCount = phaseCount; } public long getSpaceWait() { return spaceWait; } public void setSpaceWait(long spaceWait) { this.spaceWait = spaceWait; } public long getWriteTimeout() { return writeTimeout; } public void setWriteTimeout(long writeTimeout) { this.writeTimeout = writeTimeout; } public long getReadTimeout() { return readTimeout; } public void setReadTimeout(long readTimeout) { this.readTimeout = readTimeout; } public long getQueryTimeout() { return queryTimeout; } public void setQueryTimeout(long queryTimeout) { this.queryTimeout = queryTimeout; } public UpdateTransport getUpdateTransport() { return updateTransport; } public void setUpdateTransport(UpdateTransport updateTransport) { this.updateTransport = updateTransport; } public int getVirtualNodeCount() { return virtualNodeCount; } public void setVirtualNodeCount(int virtualNodeCount) { this.virtualNodeCount = virtualNodeCount; } public boolean isForgetOldValue() { return forgetOldValue; } public void setForgetOldValue(boolean forgetOldValue) { this.forgetOldValue = forgetOldValue; } public boolean isHostAwareReplication() { return hostAwareReplication; } public void setHostAwareReplication(boolean hostAwareReplication) { this.hostAwareReplication = hostAwareReplication; } public IndexType getKeyIndexType() { return keyIndexType; } public void setKeyIndexType(IndexType keyIndexType) { this.keyIndexType = keyIndexType; } public boolean isRouted() { return routed; } public void setRouted(boolean routed) { this.routed = routed; } public int getPhaseRatio() { return phaseRatio; } public void setPhaseRatio(int phaseRatio) { this.phaseRatio = phaseRatio; } public long getQueryLimit() { return queryLimit; } public void setQueryLimit(long queryLimit) { this.queryLimit = queryLimit; } public long getFileSyncInterval() { return fileSyncInterval; } public void setFileSyncInterval(long fileSyncInterval) { this.fileSyncInterval = fileSyncInterval; } @Override public List<? extends IElement> getChildren() { return Arrays.asList(members, fields, indexes); } public void joinLeech() throws ASException { join(DistributionRole.LEECH); } private void join(DistributionRole role) throws ASException { com.tibco.as.space.Space oldSpace = space; space = spaces.getParent().getConnection().getMetaspace() .getSpace(name, role); if (oldSpace == null) { return; } oldSpace.close(); } public void joinSeeder() throws ASException { join(DistributionRole.SEEDER); } public synchronized void leave() throws ASException { if (space == null) { return; } space.close(); space = null; } public boolean isReady() { try { return getSpaceState() == SpaceState.READY; } catch (ASException e) { SpaceBarPlugin.logException(e); } return false; } public boolean isSuspended() { try { return getSpaceState() == SpaceState.SUSPENDED; } catch (ASException e) { SpaceBarPlugin.logException(e); } return false; } private SpaceState getSpaceState() throws ASException { Metaspace metaspace = spaces.getParent().getConnection().getMetaspace(); return metaspace.getSpaceState(name); } public boolean isJoined() { Metaspace metaspace = spaces.getParent().getConnection().getMetaspace(); Member self = metaspace.getSelfMember(); try { for (Member member : metaspace.getSpaceMembers(name)) { if (member.getId().equals(self.getId())) { return true; } } } catch (ASException e) { SpaceBarPlugin.logException("Could not get space members", e); } return false; } }