/* * Copyright 2006 GigaSpaces, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springmodules.javaspaces.gigaspaces; import java.rmi.MarshalledObject; import java.rmi.RemoteException; import net.jini.core.entry.Entry; import net.jini.core.entry.UnusableEntryException; import net.jini.core.event.EventRegistration; import net.jini.core.event.RemoteEventListener; import net.jini.core.lease.Lease; import net.jini.core.transaction.Transaction; import net.jini.core.transaction.TransactionException; import net.jini.space.JavaSpace; import org.springmodules.javaspaces.JavaSpaceCallback; import org.springmodules.javaspaces.JavaSpaceListener; import org.springmodules.javaspaces.JavaSpaceTemplate; import org.springmodules.javaspaces.gigaspaces.exception.GigaSpacesException; import com.j_spaces.core.IJSpace; import com.j_spaces.core.IJSpaceContainer; import com.j_spaces.core.client.NotifyDelegator; import com.j_spaces.core.client.SpaceURL; /** * <p> * Helper object offered to the use of application developers who need to * perform operations in space. The template exposes all the operations offered * by the IJSpace, wrapping them with additional exception conversion logic, and * one general purpose execute() method, accepting a JavaSpaceCallback * implementation, where application logic can be implemented by the application * developer. * </p> * * @author Lior Ben Yizhak * @version 5.0 * @Copyright: Copyright 2006 GigaSpaces Technologies. All rights reserved. * @Company: Gigaspaces Technologies */ public class GigaSpacesTemplate extends JavaSpaceTemplate { /** * Empty constructor * */ public GigaSpacesTemplate() { super(); } /** * Constructor Gets a GigaSpaces space proxy and sets it into the template. * @param space */ public GigaSpacesTemplate(IJSpace space) { super(); setSpace(space); } /** * Override the JavaSpaceTemplate method in order not to * throw exception if space instance is null. *@Override */ public void afterPropertiesSet() { } /** * Checks if the space instance is null before executing * @param jsc the javaspaces callback which wraps the javaspace executed method. * @return the wrapped executed javaspace method result */ public Object execute(JavaSpaceCallback jsc) { if(getSpace() == null){ throw new GigaSpacesException("The space property is required and can not be null."); } return super.execute(jsc); } // Standard JavaSpace API calls /** * The process of serializing an object for transmission to a JavaSpaces * service will be identical if the same object is used twice. This is most * likely to be an issue with templates that are used repeatedly to search * for entries with read or take. The client-side implementations of read * and take cannot reasonably avoid this duplicated effort, since they have * no efficient way of checking whether the same template is being used * without intervening modification. The snapshot method gives the * JavaSpaces service implementor a way to reduce the impact of repeated use * of the same object. Invoking snapshot with an Object will return another * object that contains a snapshot of the original . Using the * returned snapshot object is equivalent to using the unmodified original * object in all operations on the same JavaSpaces service. Modifications to * the original object will not affect the snapshot. You can snapshot a null * template; snapshot may or may not return null given a null template. The * object returned from snapshot will be guaranteed equivalent to the * original unmodified object only when used with the space. Using the * snapshot with any other JavaSpaces service will generate an * IllegalArgumentException unless the other space can use it because of * knowledge about the JavaSpaces service that generated the snapshot. The * snapshot will be a different object from the original, may or may not * have the same hash code, and equals may or may not return true when * invoked with the original object, even if the original object is * unmodified. A snapshot is guaranteed to work only within the virtual * machine in which it was generated. If a snapshot is passed to another * virtual machine (for example, in a parameter of an RMI call), using * it--even with the same JavaSpaces service--may generate an * IllegalArgumentException. * @see {@link http://java.sun.com/products/jini/2.0/doc/api/net/jini/space/JavaSpace.html#snapshot(net.jini.core.entry.Entry)} * * @param object the object to take a snapshot of. * @return a snapshot of the object. */ public Object snapshot(final Object object) { return (Object) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, TransactionException, UnusableEntryException, InterruptedException { return ((IJSpace)js).snapshot(object); } }); } /** * Take any matching entry from the space, blocking until one exists. Return * null if the timeout expires. * * @param object The template used for matching. Matching is done against * tmpl with null fields being wildcards ("match anything") other * fields being values ("match exactly on the serialized form"). * @param timeout How long the client is willing to wait for a * transactionally proper matching entry. A timeout of NO_WAIT * means to wait no time at all; this is equivalent to a wait of * zero. * @return a from the space * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#take(net.jini.core.entry.Entry,net.jini.core.transaction.Transaction,long)} */ public Object take(final Object template,final long millis) { return (Object) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, TransactionException, UnusableEntryException, InterruptedException { return ((IJSpace)js).take(template,tx, millis); } }); } /** * Take if exists any matching entry from the space, blocking until one * exists. Return null if the timeout expires. * * @param object The template used for matching. Matching is done against * tmpl with null fields being wildcards ("match anything") other * fields being values ("match exactly on the serialized form"). * @param timeout How long the client is willing to wait for a * transactionally proper matching entry. A timeout of NO_WAIT * means to wait no time at all; this is equivalent to a wait of * zero. * @return object from the space. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#takeIfExists(net.jini.core.entry.Entry,net.jini.core.transaction.Transaction,long)} */ public Object takeIfExists(final Object template,final long millis) { return (Object) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, TransactionException, UnusableEntryException, InterruptedException { return ((IJSpace)js).takeIfExists(template,tx, millis); } }); } /** * Write a new object to the space. * If the object has a primary key and isn't auto-generated, * it will call to the update(Object updatedObject, Transaction transaction, * long lease, long timeout, int updateModifiers) method with * UpdateModifiers.UPDATE_OR_WRITE. * @param object * the object to write * @param lease * the requested lease time, in milliseconds * @return an object for the entry that was written to the space * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#write(net.jini.core.entry.Entry,net.jini.core.transaction.Transaction,long)} */ public Lease write(final Object pojo, final long lease) { return (Lease) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, TransactionException, UnusableEntryException, InterruptedException { return ((IJSpace)js).write(pojo,tx, lease); } }); } /** * Write a new object to the space. * If the object has a primary key and isn't auto-generated, * it will call to the update(Object updatedObject, Transaction transaction, * long lease, long timeout, int updateModifiers) method with * UpdateModifiers.UPDATE_OR_WRITE. * @param object * the object to write * @param lease * the requested lease time, in milliseconds * @param modifiers the modifiers * @return an object for the entry that was written to the space * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#write(net.jini.core.entry.Entry,net.jini.core.transaction.Transaction,long,int)} */ public Lease write(final Object pojo, final long lease, final int modifiers) { return (Lease) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, TransactionException, UnusableEntryException, InterruptedException { return ((IJSpace)js).write(pojo,tx, lease, Long.MAX_VALUE, modifiers); } }); } /** * Write a new object to the space. * If the object has a primary key and isn't auto-generated, * it will call to the update(Object updatedObject, Transaction transaction, * long lease, long timeout, int updateModifiers) method with * UpdateModifiers.UPDATE_OR_WRITE and lease Long.MAX_VALUE. * @param object * the object to write * @return an object for the entry that was written to the space * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#write(net.jini.core.entry.Entry,net.jini.core.transaction.Transaction,long)} */ public Lease write(final Object pojo) { return write( pojo, Long.MAX_VALUE); } /** * Counts the number of objects that match the specified template and * the specified transaction. * @param template the template to use for matching. * @return the number of entries that match the specified template and * the specified transaction. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#count(net.jini.core.entry.Entry,net.jini.core.transaction.Transaction)} */ public int count( Entry entry){ return count((Object)entry); } /** * Counts the number of objects that match the specified template and * the specified transaction. * @param template the template to use for matching. * @return the number of entries that match the specified template and * the specified transaction. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#count(net.jini.core.entry.Entry,net.jini.core.transaction.Transaction)} */ public int count(final Object object) { return ((Integer) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, TransactionException, UnusableEntryException, InterruptedException { return new Integer(((IJSpace)js).count(object, tx)); } })).intValue(); } /** * Removes the entries that match the specified template and * the specified transaction from this space. * If the clear operation conducted without transaction (null as value) * it will clear all entries that are not under transaction. * Therefor entries under transaction would not be removed from the space. * * The clear operation supports inheritance, therefor template class matching objects * and its sub classes matching objects are part of the candidates population * to be removed from the space. * You can in fact clean all space objects (that are not under transaction) by calling: * * Notice: The clear operation does not remove notify templates i.e. registration for notifications. * @param template the template to use for matching. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#clear(net.jini.core.entry.Entry,net.jini.core.transaction.Transaction)} */ public void clear(final Entry entry) { clear((Object)entry); } /** * Removes the entries that match the specified template and * the specified transaction from this space. * If the clear operation conducted without transaction (null as value) * it will clear all entries that are not under transaction. * Therefor entries under transaction would not be removed from the space. * * The clear operation supports inheritance, therefor template class matching objects * and its sub classes matching objects are part of the candidates population * to be removed from the space. * You can in fact clean all space objects (that are not under transaction) by calling: * * Notice: The clear operation does not remove notify templates i.e. registration for notifications. * @param template the template to use for matching. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#clear(net.jini.core.entry.Entry,net.jini.core.transaction.Transaction)} */ public void clear(final Object pojo) { execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, TransactionException, UnusableEntryException, InterruptedException { ((IJSpace)js).clear(pojo, tx); return null; } }); } /** * Cleans this space. The side-effects of cleaning the space are: * <ul> * <li>all entries and templates are deleted.</li> * <li>all storage adapter contexts are closed.</li> * <li>all engine threads are terminated.</li> * <li>the engine re-initializes itself.</li> * </ul> * * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#clean()} */ public void clean() { execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, TransactionException, UnusableEntryException, InterruptedException { ((IJSpace)js).clean(); return null; } }); } /** * Returns the name of this space. * @return the name of this space. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#getName()} */ public String getName() { return (String) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException { return ((IJSpace) js).getName(); } }); } /** * Returns the {@link SpaceURL} instance which was used to initialize the space. * <p> * Notice: The {@link SpaceURL} object contains information on the space and container * configuration/setup such as space url used, space/container/cluster schema used * and other attributes.<p> * The {@link IJSpaceContainer} keeps also its reference of the SpaceURL which launched the container. * @return {@link SpaceURL} which initialized that specific space instance. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#getUrl()} **/ public SpaceURL getUrl() { return (SpaceURL) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException { return ((IJSpace) js).getURL(); } }); } /** * Returns the admin object to the remote part of this space. * * @return the admin object to the remote part of this space. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#getAdmin()} */ public Object getAdmin() { return execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException { return ((IJSpace) js).getAdmin(); } }); } /** * Writes the specified entries to this space. * * @param entries the entries to write. * @param lease the requested lease time, in milliseconds * @return the leases for the written entries. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#writeMultiple(net.jini.core.entry.Entry[],net.jini.core.transaction.Transaction,long)} */ public Lease[] writeMultiple(Entry[] entries, long lease) { return writeMultiple((Object[]) entries, lease); } /** * Writes the specified entries to this space. * * @param entries the entries to write. * @param lease the requested lease time, in milliseconds * @return the leases for the written entries. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#writeMultiple(net.jini.core.entry.Entry[],net.jini.core.transaction.Transaction,long)} */ public Lease[] writeMultiple( final Object[] pojos, final long lease) { return (Lease[]) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, TransactionException{ return ((IJSpace)js).writeMultiple(pojos, tx, lease); } }); } /** * Reads all the entries matching the specified template from this space. * * @param entries the templates * @param maxEntries a limit on the number of entries to be read. Use * Integer.MAX_VALUE for the maximum value * @return array of entry object * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#readMultiple(net.jini.core.entry.Entry[],net.jini.core.transaction.Transaction,int)} */ public Entry[] readMultiple(Entry entry, int maxEntries) { return (Entry[])readMultiple((Object)entry, maxEntries); } /** * Reads all the entries matching the specified template from this space. * * @param POJOs the templates * @param maxEntries a limit on the number of entries to be read. Use * Integer.MAX_VALUE for the maximum value * @return array of entry object * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#readMultiple(net.jini.core.entry.Entry[],net.jini.core.transaction.Transaction,int)} */ public Object[] readMultiple(final Object pojo, final int maxEntries) { return (Object[]) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, TransactionException, UnusableEntryException{ return ((IJSpace)js).readMultiple(pojo, tx, maxEntries); } }); } /** * Takes all the entries matching the specified template from this space. * * @param entry the template to use for matching. * @param a limit on the number of entries to be taken. Use * Integer.MAX_VALUE for the maximum value. * @return an array of entries that match the template, or empty array in * case if no suitable entry was found. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#takeMultiple(net.jini.core.entry.Entry[],net.jini.core.transaction.Transaction,int)} */ public Entry[] takeMultiple(Entry entry, int maxEntries) { return (Entry[])takeMultiple((Object)entry, maxEntries); } /** * Takes all the entries matching the specified template from this space. * * @param POJO the template to use for matching. * @param a limit on the number of entries to be taken. Use * Integer.MAX_VALUE for the maximum value. * @return an array of POJOs that match the template, or empty array in case * if no suitable entry was found. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#takeMultiple(net.jini.core.entry.Entry[],net.jini.core.transaction.Transaction,int)} */ public Object[] takeMultiple(final Object pojo, final int maxEntries) { return (Object[]) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, TransactionException, UnusableEntryException{ return ((IJSpace)js).takeMultiple(pojo, tx, maxEntries); } }); } /** * Checks whether the space is alive and accessible. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#ping()} */ public void ping() { execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException{ ((IJSpace)js).ping(); return null; } }); } /** * Updates the first entry matching the specified template, if found and * there is no transaction conflict. * * @param newEntry the new value of the entry, must contain the UID. * @param lease The lease time of the updated entry, 0 means retain the * original lease * @param timeout "IfExists" timeout * @return the entry * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#update(net.jini.core.entry.Entry,net.jini.core.transaction.Transaction,long,long)} */ public Entry update(Entry newEntry, long lease, long timeout) { return (Entry) update((Object)newEntry, lease, timeout); } /** * Updates the first entry matching the specified template, if found and * there is no transaction conflict. * * @param newPojo the new value of the POJO, must contain the primary key. * @param lease The lease time of the updated entry, 0 means retain the * original lease * @param timeout "IfExists" timeout * @return the POJO * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#update(net.jini.core.entry.Entry,net.jini.core.transaction.Transaction,long,long)} */ public Object update(final Object newPojo, final long lease, final long timeout) { return (Object) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, InterruptedException, TransactionException, UnusableEntryException{ return ((IJSpace)js).update(newPojo, tx, lease, timeout); } }); } /** * Updates the first entry matching the specified template, if found and * there is no transaction conflict. * * @param newEntry the new value of the entry, must contain the UID. * @param lease The lease time of the updated entry, 0 means retain the * original lease * @param timeout "IfExists" timeout * @param updateModifiers - operation modifiers, values from UpdateModifiers * @return the entry * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#update(net.jini.core.entry.Entry,net.jini.core.transaction.Transaction,long,long,int)} */ public Entry update(Entry newEntry, long lease, long timeout, int updateModifiers) { return (Entry)update((Object) newEntry, lease, timeout, updateModifiers); } /** * Updates the first entry matching the specified template, if found and * there is no transaction conflict. * * @param newPojo the new value of the pojo, must contain the primary key. * @param lease The lease time of the updated entry, 0 means retain the * original lease * @param timeout "IfExists" timeout * @param updateModifiers - operation modifiers, values from UpdateModifiers * @return the POJO * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#update(net.jini.core.entry.Entry,net.jini.core.transaction.Transaction,long,long,int)} */ public Object update(final Object newEntry, final long lease, final long timeout, final int updateModifiers) { return (Object) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, InterruptedException, TransactionException, UnusableEntryException{ return ((IJSpace)js).update( newEntry, tx, lease, timeout, updateModifiers); } }); } /** * Updates a group of entries. The entries with the new values must contain * the UIDs and (optionally) versionIDs * * @param entries the array of entries containing the new values , each * entry must contain its UID. * @param leases The lease time of the updated entries, 0 means retain the * original lease * @return array of objects which correspond to the input entries array. An * object can be - an Entry, if the update was successful - null if * no update performed for the corresponding input - an Exception * object, in case of an exception * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#writeMultiple(net.jini.core.entry.Entry[],net.jini.core.transaction.Transaction,long)} */ public Object[] updateMultiple(Entry[] entries, long[] leases) { return updateMultiple((Object[])entries, leases); } /** * Updates a group of POJO's. The POJO's with the new values must contain * the pks and (optionally) versionIDs * * @param POJOs the array of POJO's containing the new values , each POJO * must contain its primark key value. * @param leases The lease time of the updated entries, 0 means retain the * original lease * @return array of objects which correspond to the input entries array. An * object can be - an Entry, if the update was successful - null if * no update performed for the corresponding input - an Exception * object, in case of an exception * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#writeMultiple(net.jini.core.entry.Entry[],net.jini.core.transaction.Transaction,long)} */ public Object[] updateMultiple(final Object[] pojos, final long[] leases) { return (Object[]) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, InterruptedException, TransactionException, UnusableEntryException{ return ((IJSpace)js).updateMultiple(pojos, tx, leases); } }); } /** * Updates a group of entries. The entries with the new values must contain * the UIDs and (optionally) versionIDs * * @param entries the array of entries containing the new values , each * entry must contain its UID. * @param leases The lease time of the updated entries, 0 means retain the * original lease * @param updateModifiers - operation modifiers, values from UpdateModifiers * @return array of objects which correspond to the input entries array. An * object can be - an Entry, if the update was successful - null if * no update performed for the corresponding input - an Exception * object, in case of an exception * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#writeMultiple(net.jini.core.entry.Entry[],net.jini.core.transaction.Transaction,long,int)} */ public Object[] updateMultiple(Entry[] entries, long[] leases, int updateModifiers) { return updateMultiple((Object[])entries, leases, updateModifiers); } /** * Updates a group of POJO's. The POJO's with the new values must contain * the pks and (optionally) versionIDs * * @param POJOs the array of POJO's containing the new values , each POJO * must contain its primark key. * @param leases The lease time of the updated entries, 0 means retain the * original lease * @param updateModifiers - operation modifiers, values from UpdateModifiers * @return array of objects which correspond to the input entries array. An * object can be - an Entry, if the update was successful - null if * no update performed for the corresponding input - an Exception * object, in case of an exception * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#writeMultiple(net.jini.core.entry.Entry[],net.jini.core.transaction.Transaction,long,int)} */ public Object[] updateMultiple(final Object[] pojos, final long[] leases, final int updateModifiers) { return (Object[]) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, InterruptedException, TransactionException, UnusableEntryException{ return ((IJSpace)js).updateMultiple( pojos, tx, leases, updateModifiers); } }); } /** * Returns an indication : is this space secured. If for this space defined * Security Filter, the space will be secured. * * @return boolean true if this space secured, otherwise false. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#isSecured()} */ public boolean isSecured() { return ((Boolean) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException{ return new Boolean(((IJSpace)js).isSecured()); } })).booleanValue(); } /** * Drops all Class's entries and all its templates from the space. Calling * this method will remove all internal meta data related to this class * stored in the space. When using persistent spaced the relevant RDBMS * table will be dropped. It is the caller responsibility to ensure that no * entries from this class are written to the space while this method is * called. This method is protected through the space Default Security * Filter. Admin permissions required to execute this request successfully. * * @pram className - name of class to delete. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#dropClass(java.lang.String)} */ public void dropClass(final String className) { execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException{ try { ((IJSpace)js).dropClass(className); } catch (Exception e) { throw new GigaSpacesException("Failed to drop class",e); } return null; } }); } /** * Checks whether proxy is connected to embedded or remote space. * @return Returns true if the proxy embedded, otherwise false. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#isEmbedded()} */ public boolean isEmbedded() { return ((Boolean) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException{ return new Boolean(((IJSpace)js).isEmbedded()); } })).booleanValue(); } /** * Enable/Disable Optimistic Lock protocol. * @param enable true enable Optimistic Lock protocol, false disable. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#isOptimisticLocking(boolean)} */ public void setOptimisticLocking(final boolean enable) { execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException{ ((IJSpace)js).setOptimisticLocking(enable); return null; } }); } /** * Returns status of Optimistic Lock protocol. * @return true Optimistic Lock enabled, otherwise false. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#isOptimisticLockingEnabled()} */ public boolean isOptimisticLockingEnabled() { return ((Boolean) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException{ return new Boolean(((IJSpace)js).isOptimisticLockingEnabled()); } })).booleanValue(); } /** * Sets FIFO mode for proxy. Every operation that come through the proxy will be FIFO enabled. The other way to set FIFO enabled using SpaceFinder: SpaceFinder.find("jini://localhost/myContainerName/JavaSpaces?fifo=true") If this mode enabled, you don't need to use com.j_spaces.core.client.MetaDataEntry.setFifo(boolean) for every entry/template. All entries and templates will be FIFO enabled. * @param enable if true this proxy FIFO enabled, otherwise false. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#setFifo(boolean)} */ public void setFifo(final boolean enable) { execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException{ ((IJSpace)js).setFifo(enable); return null; } }); } /** * Returns true if this proxy FIFO enabled, otherwise false. * @return Returns true if this proxy FIFO enabled, otherwise false. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#isFifo()} */ public boolean isFifo() { return ((Boolean) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException{ return new Boolean(((IJSpace)js).isFifo()); } })).booleanValue(); } /** * Set noWriteLease mode enabled * @param enable noWriteLeaseMode - write mode. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#setNOWriteLeaseMode(boolean)} */ public void setNOWriteLeaseMode(final boolean enable) { execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException{ ((IJSpace)js).setNOWriteLeaseMode(enable); return null; } }); } /** * Checks the write mode. * @return true if do not return Lease object after write, otherwise false. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#isNOWriteLeaseMode()} */ public boolean isNOWriteLeaseMode() { return ((Boolean) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException{ return new Boolean(((IJSpace)js).isNOWriteLeaseMode()); } })).booleanValue(); } /** * Sets the update mode modifiers for proxy level. * @param newModifiers new values for modifiers Values are defined in UpdateModifiers * @return old value of modifiers. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#setUpdateModifiers(int)} */ public int setUpdateModifiers(final int newModifiers) { return ((Integer) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException{ return new Integer(((IJSpace)js).setUpdateModifiers(newModifiers)); } })).intValue(); } /** * Gets the proxyUpdateModifiers. Values are defined in UpdateModifiers * class. Default value: UPDATE_ONLY. * * @return value of modifiers. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#getUpdateModifiers()} */ public int getUpdateModifiers() { return ((Integer) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException { return new Integer(((IJSpace) js).getUpdateModifiers()); } })).intValue(); } /** * Sets the read-take mode modifiers for proxy level. * @param newModifiers new values for modifiers Values are defined in ReadTakeModifiers * @return old value of modifiers. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#setReadTakeModifiers(int)} */ public int setReadTakeModifiers(final int newModifiers) { return ((Integer) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException{ return new Integer(((IJSpace)js).setReadTakeModifiers(newModifiers)); } })).intValue(); } /** * Gets the proxyReadTakeModifiers. values are from ReadTakeModifiers. * * @return value of modifiers. * @see {@link http://gigaspaces.com/docs/JavaDoc/com/j_spaces/core/IJSpace.html#getReadTakeModifiers()} */ public int getReadTakeModifiers() { return ((Integer) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException { return new Integer((((IJSpace) js).getReadTakeModifiers())); } })).intValue(); } /** * Read any matching object from the space, blocking until one exists. * Return null if the timeout expires. * * @param The template used for matching. Matching is done against * template with null fields being wildcards ("match anything") * other fields being values ("match exactly on the serialized * form"). * @param lease the requested lease time, in milliseconds * @return a object for the entry that was written to the space * @see {@link http://java.sun.com/products/jini/2.0/doc/api/net/jini/space/JavaSpace.html#read(net.jini.core.entry.Entry,net.jini.core.transaction.Transaction,long)} */ public Object read(final Object pojo, final long lease) { return (Object) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, TransactionException, UnusableEntryException, InterruptedException { return ((IJSpace) js).read(pojo, tx, lease); } }); } /** * Read if exists any matching object from the space, blocking until one * exists. Return null if the timeout expires. * * @param object The template used for matching. Matching is done against * template with null fields being wildcards ("match anything") * other fields being values ("match exactly on the serialized * form"). * @param timeout How long the client is willing to wait for a * transactionally proper matching entry. A timeout of NO_WAIT * means to wait no time at all; this is equivalent to a wait of * zero. * @return a copy of the entry read from the space * @see {@link http://java.sun.com/products/jini/2.0/doc/api/net/jini/space/JavaSpace.html#readIfExists(net.jini.core.entry.Entry,net.jini.core.transaction.Transaction,long)} */ public Object readIfExists(final Object pojo, final long lease) { return (Object) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, TransactionException, UnusableEntryException, InterruptedException { return ((IJSpace) js).readIfExists(pojo, tx, lease); } }); } /** * When Pojo's are written that match this template notify the given listener with a RemoteEvent that includes the handback object. Matching is done as for read. * using NotifyDelegator for notify * @param listener -The remote event listener to notify. * @param template - The template used for matching. Matching is done against tmpl with null fields being * @param txn - The transaction (if any) under which to work. * @param handback - An object to send to the listener as part of the event notification. * @param fifoEnabled - enables/disables ordered notifications. * @param lease - the requested lease time, in milliseconds * @param notifyMask -Available Notify Types: NotifyModifiers.NOTIFY_WRITE NotifyModifiers.NOTIFY_UPDATE NotifyModifiers.NOTIFY_TAKE NotifyModifiers.NOTIFY_LEASE_EXPIRATION NotifyModifiers.NOTIFY_ALL NotifyDelegator nd = new NotifyDelegator(space, template, transaction, listener, Lease.FOREVER, handback, true, NotifyModifiers.NOTIFY_WRITE | NotifyModifiers.NOTIFY_TAKE * @return NotifyDelegator the NotifyDelegator * @see {@link http://java.sun.com/products/jini/2.0/doc/api/net/jini/space/JavaSpace.html#addNotifyDelegatorListener(} */ public NotifyDelegator addNotifyDelegatorListener(RemoteEventListener listener,Entry template, MarshalledObject handback,boolean fifoEnabled,long lease, int notifyMask) { JavaSpaceListener javaSpaceListener = new JavaSpaceListener(); javaSpaceListener.setHandback(handback); javaSpaceListener.setLease(lease); javaSpaceListener.setListener(listener); javaSpaceListener.setTemplate(template); return addNotifyDelegatorListener(javaSpaceListener, fifoEnabled, notifyMask); } /** * When Pojo's are written that match this template notify the given listener with a RemoteEvent that includes the handback object. Matching is done as for read. * using NotifyDelegator for notify * @param listener -The remote event listener to notify. * @param template - The template used for matching. Matching is done against tmpl with null fields being * @param txn - The transaction (if any) under which to work. * @param handback - An object to send to the listener as part of the event notification. * @param fifoEnabled - enables/disables ordered notifications. * @param lease - the requested lease time, in milliseconds * @param notifyMask -Available Notify Types: NotifyModifiers.NOTIFY_WRITE NotifyModifiers.NOTIFY_UPDATE NotifyModifiers.NOTIFY_TAKE NotifyModifiers.NOTIFY_LEASE_EXPIRATION NotifyModifiers.NOTIFY_ALL NotifyDelegator nd = new NotifyDelegator(space, template, transaction, listener, Lease.FOREVER, handback, true, NotifyModifiers.NOTIFY_WRITE | NotifyModifiers.NOTIFY_TAKE * @return NotifyDelegator the NotifyDelegator * @see {@link http://java.sun.com/products/jini/2.0/doc/api/net/jini/space/JavaSpace.html#addNotifyDelegatorListener(} */ public NotifyDelegator addNotifyDelegatorListener(final RemoteEventListener listener,final Object template, final MarshalledObject nandback,final boolean fifoEnabled,final long lease, final int notifyMask) { return (NotifyDelegator) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, TransactionException{ return new NotifyDelegator((IJSpace)js, template , tx, listener, lease, nandback , fifoEnabled, notifyMask); } }); } /** * When entries are written that match this template notify the given listener with a RemoteEvent that includes the handback object. Matching is done as for read. * using NotifyDelegator for notify * @param javaSpaceListener - the javaSpaceListener. * @param fifoEnabled - enables/disables ordered notifications. * @param lease - the requested lease time, in milliseconds * @param notifyMask -Available Notify Types: NotifyModifiers.NOTIFY_WRITE NotifyModifiers.NOTIFY_UPDATE NotifyModifiers.NOTIFY_TAKE NotifyModifiers.NOTIFY_LEASE_EXPIRATION NotifyModifiers.NOTIFY_ALL NotifyDelegator nd = new NotifyDelegator(space, template, transaction, listener, Lease.FOREVER, handback, true, NotifyModifiers.NOTIFY_WRITE | NotifyModifiers.NOTIFY_TAKE * @return NotifyDelegator the NotifyDelegator * @see {@link http://java.sun.com/products/jini/2.0/doc/api/net/jini/space/JavaSpace.html#addNotifyDelegatorListener(} */ public NotifyDelegator addNotifyDelegatorListener(final JavaSpaceListener javaSpaceListener, final boolean fifoEnabled,final int notifyMask){ return (NotifyDelegator) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, TransactionException{ return new NotifyDelegator((IJSpace)js, javaSpaceListener.getTemplate() , tx, javaSpaceListener.getListener(), javaSpaceListener.getLease(), javaSpaceListener.getHandback(), fifoEnabled, notifyMask); } }); } /** * When Pojo's are written that match this template notify the given listener with a RemoteEvent that includes the handback object. Matching is done as for read. * @param templatePojo - The template used for matching. Matching is done against tmpl with null fields being * @param listener -The remote event listener to notify. * @param millis - the requested lease time, in milliseconds * @param handback - An object to send to the listener as part of the event notification. * @param txn - The transaction (if any) under which to work. * @return EventRegistration - the event registration to the the registrant * @see {@link http://java.sun.com/products/jini/2.0/doc/api/net/jini/space/JavaSpace.html#notify(net.jini.core.entry.Entry,net.jini.core.transaction.Transaction,net.jini.core.event.RemoteEventListener,long,java.rmi.MarshalledObject()} */ public EventRegistration notify(final Object templatePojo, final RemoteEventListener listener, final long millis, final MarshalledObject handback, final Transaction tx) { return (EventRegistration) execute(new JavaSpaceCallback() { public Object doInSpace(JavaSpace js, Transaction tx) throws RemoteException, TransactionException{ return ((IJSpace)js).notify(templatePojo, tx, listener, millis, handback); } }); } /** * When entries are written that match this template notify the given listener with a RemoteEvent that includes the handback object. Matching is done as for read. * @param entry - The template used for matching. Matching is done against tmpl with null fields being * @param listener -The remote event listener to notify. * @param millis - the requested lease time, in milliseconds * @param handback - An object to send to the listener as part of the event notification. * @param txn - The transaction (if any) under which to work. * @return EventRegistration - the event registration to the the registrant * @see {@link http://java.sun.com/products/jini/2.0/doc/api/net/jini/space/JavaSpace.html#notify(net.jini.core.entry.Entry,net.jini.core.transaction.Transaction,net.jini.core.event.RemoteEventListener,long,java.rmi.MarshalledObject()} */ public EventRegistration notify( Entry template, RemoteEventListener listener, long millis, MarshalledObject handback, Transaction tx) { { return notify( (Object)template, listener,millis, handback, tx); } } }