Package org.geowebcache.conveyor

Source Code of org.geowebcache.conveyor.ConveyorTile

/**
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
*  This program is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  You should have received a copy of the GNU Lesser General Public License
*  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*
* @author Arne Kepp, The Open Planning Project, Copyright 2009
*/
package org.geowebcache.conveyor;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.channels.Channels;
import java.util.Collections;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.geowebcache.GeoWebCacheException;
import org.geowebcache.grid.GridSubset;
import org.geowebcache.io.ByteArrayResource;
import org.geowebcache.io.Resource;
import org.geowebcache.layer.TileLayer;
import org.geowebcache.layer.TileResponseReceiver;
import org.geowebcache.mime.MimeType;
import org.geowebcache.storage.StorageBroker;
import org.geowebcache.storage.StorageException;
import org.geowebcache.storage.TileObject;

public class ConveyorTile extends Conveyor implements TileResponseReceiver {
    private static Log log = LogFactory.getLog(org.geowebcache.conveyor.ConveyorTile.class);

    // Shared request information, this is stored by the cache key
    // protected long[] tileIndex = null;

    // protected SRS srs = null;
    protected String gridSetId = null;

    protected GridSubset gridSubset = null;

    protected TileLayer tileLayer = null;

    TileObject stObj = null;

    private Map<String, String> fullParameters;

    public ConveyorTile(StorageBroker sb, String layerId, HttpServletRequest servletReq,
            HttpServletResponse servletResp) {
        super(layerId, sb, servletReq, servletResp);
    }

    /**
     * @deprecated as of 1.2.5, use
     *             {@link #ConveyorTile(StorageBroker, String, String, long[], MimeType, Map, HttpServletRequest, HttpServletResponse)}
     *             instead. This method just calls it with the provided {@code fullParameters} and
     *             will be removed soon
     */
    @Deprecated
    public ConveyorTile(StorageBroker sb, String layerId, String gridSetId, long[] tileIndex,
            MimeType mimeType, Map<String, String> fullParameters,
            Map<String, String> modifiedParameters, HttpServletRequest servletReq,
            HttpServletResponse servletResp) {
        this(sb, layerId, gridSetId, tileIndex, mimeType, fullParameters, servletReq, servletResp);
    }

    /**
     * This constructor is used for an incoming request, the data is then added by the cache
     */
    public ConveyorTile(StorageBroker sb, String layerId, String gridSetId, long[] tileIndex,
            MimeType mimeType, Map<String, String> filteringParameters,
            HttpServletRequest servletReq, HttpServletResponse servletResp) {

        super(layerId, sb, servletReq, servletResp);
        this.gridSetId = gridSetId;

        long[] idx = new long[3];

        if (tileIndex != null) {
            idx[0] = tileIndex[0];
            idx[1] = tileIndex[1];
            idx[2] = tileIndex[2];
        }

        super.mimeType = mimeType;

        this.fullParameters = filteringParameters;

        stObj = TileObject.createQueryTileObject(layerId, idx, gridSetId, mimeType.getFormat(),
                filteringParameters);
    }

    public Map<String, String> getFullParameters() {
        if (fullParameters == null) {
            return Collections.emptyMap();
        }
        return fullParameters;
    }

    public TileLayer getLayer() {
        return this.tileLayer;
    }

    public void setTileLayer(TileLayer layer) {
        this.tileLayer = layer;
    }

    public TileLayer getTileLayer() {
        return tileLayer;
    }

    public long getTSCreated() {
        return stObj.getCreated();
    }

    public int getStatus() {
        return (int) status;
    }

    public void setStatus(int status) {
        this.status = (long) status;
    }

    public String getErrorMessage() {
        return this.errorMsg;
    }

    public void setErrorMessage(String errorMessage) {
        this.errorMsg = errorMessage;
    }

    public Map<String, String> getParameters() {
        return ((TileObject) stObj).getParameters();
    }

    public long[] getTileIndex() {
        return stObj.getXYZ();
    }

    public synchronized GridSubset getGridSubset() {
        if (gridSubset == null) {
            gridSubset = tileLayer.getGridSubset(gridSetId);
        }

        return gridSubset;
    }

    public String getGridSetId() {
        return gridSetId;
    }

    public void setGridSetId(String gridSetId) {
        this.gridSetId = gridSetId;
    }

    /**
     * @deprecated as of 1.2.4a, use {@link #getBlob()}, keeping it for backwards compatibility as
     *             there are geoserver builds pegged at a given geoserver revision but building gwc
     *             from trunk. Ok to remove at 1.2.5
     */
    @Deprecated
    public byte[] getContent() {
        Resource blob = getBlob();
        if (blob instanceof ByteArrayResource) {
            return ((ByteArrayResource) blob).getContents();
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream((int) blob.getSize());
        try {
            blob.transferTo(Channels.newChannel(out));
            return out.toByteArray();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public Resource getBlob() {
        return stObj.getBlob();
    }

    /**
     * @deprecated as of 1.2.4a, use {@link #setBlob(Resource)}, keeping it for backwards
     *             compatibility as there are geoserver builds pegged at a given geoserver revision
     *             but building gwc from trunk. Ok to remove at 1.2.5
     */
    @Deprecated
    public void setContent(byte[] payload) {
        setBlob(new ByteArrayResource(payload));
    }

    public void setBlob(Resource payload) {
        stObj.setBlob(payload);
    }

    public TileObject getStorageObject() {
        return stObj;
    }

    public boolean persist() throws GeoWebCacheException {
        try {
            return storageBroker.put((TileObject) stObj);
        } catch (StorageException e) {
            throw new GeoWebCacheException(e);
        }
    }

    public boolean retrieve(long maxAge) throws GeoWebCacheException {
        try {
            boolean ret = storageBroker.get((TileObject) stObj);

            // Has the tile been explicitly marked as old?
            if (ret && stObj.getCreated() == -1) {
                ret = false;
            } else
            // Do we use expiration, and if so, is the tile recent enough ?
            if (ret && maxAge > 0 && stObj.getCreated() + maxAge < System.currentTimeMillis()) {
                ret = false;
            }

            if (ret) {
                this.setCacheResult(CacheResult.HIT);
            } else {
                this.setCacheResult(CacheResult.MISS);
            }

            return ret;

        } catch (StorageException se) {
            log.warn(se.getMessage());
            return false;
        }
    }

    public String toString() {
        StringBuilder str = new StringBuilder();
        str.append("ConveyorTile[");
        long[] idx = stObj.getXYZ();

        if (idx != null && idx.length == 3) {
            str.append("{" + idx[0] + "," + idx[1] + "," + idx[2] + "} ");
        }

        if (getLayer() != null) {
            str.append(getLayerId()).append(" ");
        }

        if (this.gridSetId != null) {
            str.append(gridSetId).append(" ");
        }

        if (this.mimeType != null) {
            str.append(this.mimeType.getFormat());
        }
        str.append(']');
        return str.toString();
    }

    public long getParametersId() {
        return stObj.getParametersId();
    }

}
TOP

Related Classes of org.geowebcache.conveyor.ConveyorTile

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.