All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.directwebremoting.export.Data Maven / Gradle / Ivy

Go to download

DWR is easy Ajax for Java. It makes it simple to call Java code directly from Javascript. It gets rid of almost all the boiler plate code between the web browser and your Java code.

The newest version!
/*
 * Copyright 2005 Joe Walker
 *
 * 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.directwebremoting.export;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.directwebremoting.Browser;
import org.directwebremoting.datasync.Directory;
import org.directwebremoting.datasync.StoreProvider;
import org.directwebremoting.io.DwrConvertedException;
import org.directwebremoting.io.Item;
import org.directwebremoting.io.ItemUpdate;
import org.directwebremoting.io.MatchedItems;
import org.directwebremoting.io.StoreChangeListener;
import org.directwebremoting.io.StoreRegion;

/**
 * External interface to the set of {@link StoreProvider}s that have been
 * registered.
 * @author Joe Walker [joe at getahead dot ltd dot uk]
 */
public class Data
{
    /**
     * Provide access to a single item of data given its ID.
     * @param storeId The ID of the store into which we look for the item
     * @param itemId The ID of the item to retrieve from the store
     * @param listener The client side interface to pass async updates to.
     * Will be null if no async updates are required
     * @return The found item, or null if one was not found.
     */
    public Item viewItem(String storeId, String itemId, StoreChangeListener listener)
    {
        StoreProvider provider = Directory.getRegistration(storeId, Object.class);
        if (provider == null)
        {
            throw new DwrConvertedException("clientId not found");
        }

        if (listener != null)
        {
            return provider.viewItem(itemId, listener);
        }
        else
        {
            return provider.viewItem(itemId);
        }
    }

    /**
     * Notes that there is a region of a page that wishes to subscribe to server
     * side data, and registers a callback function to receive the data.
     * @param storeId The ID of a store as registered on the server using
     * {@link Directory#register}. If no store has been registered
     * on the server using this passed storeId, then this call will
     * act as if there was a store registered, but that it was empty. This may
     * make it harder to scan the server for exposed stores. Internally however
     * the call will be ignored. This behavior may change in the future and
     * should not be relied upon.
     * @param region For field documentation see {@link StoreRegion}.
     * @param listener The client side interface to pass async updates to.
     * Will be null if no async updates are required
     */
    public MatchedItems viewRegion(String storeId, StoreRegion region, StoreChangeListener listener)
    {
        StoreProvider provider = Directory.getRegistration(storeId, Object.class);
        if (provider == null)
        {
            throw new DwrConvertedException("clientId not found");
        }

        if (region == null)
        {
            region = new StoreRegion();
        }

        if (listener != null)
        {
            provider.unsubscribe(listener);
            return provider.viewRegion(region, listener);
        }
        else
        {
            return provider.viewRegion(region);
        }
    }

    /**
     * Remove a subscription from the list of people that we are remembering
     * to keep updated
     * @param receiver The client side interface to pass async updates to.
     * Will be null if no async updates are required
     */
    public void unsubscribe(String storeId, StoreChangeListener receiver)
    {
        StoreProvider provider = Directory.getRegistration(storeId, Object.class);
        provider.unsubscribe(receiver);
        Browser.close(receiver);
    }

    /**
     * Update server side data.
     * @param storeId The store into which data is to be altered/inserted. If
     * a store by the given name has not been registered then this method is
     * a no-op, however a message will be written to the log detailing the error
     * @param changes A list of changes to make to the objects in the store
     */
    public  void update(String storeId, List changes)
    {
        StoreProvider store = Directory.getRegistration(storeId, Object.class);
        if (store == null)
        {
            log.error("update() can't find any stores with storeId=" + storeId);
            throw new NullPointerException("Invalid store");
        }

        store.update(changes);
    }

    /**
     * The log stream
     */
    private static final Log log = LogFactory.getLog(Data.class);
}