⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 storageimplementation.java

📁 lucene2.2.0版本
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.lucene.gdata.storage.lucenestorage;import java.io.IOException;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.apache.lucene.gdata.data.GDataAccount;import org.apache.lucene.gdata.data.ServerBaseEntry;import org.apache.lucene.gdata.data.ServerBaseFeed;import org.apache.lucene.gdata.server.registry.ComponentType;import org.apache.lucene.gdata.server.registry.GDataServerRegistry;import org.apache.lucene.gdata.storage.ModificationConflictException;import org.apache.lucene.gdata.storage.ResourceNotFoundException;import org.apache.lucene.gdata.storage.Storage;import org.apache.lucene.gdata.storage.StorageController;import org.apache.lucene.gdata.storage.StorageException;import org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper.StorageOperation;import org.apache.lucene.gdata.utils.ReferenceCounter;import com.google.gdata.data.BaseEntry;import com.google.gdata.data.BaseFeed;/** * This is an implementation of the * {@link org.apache.lucene.gdata.storage.Storage} interface. The * StorageImplementation provides access to the * {@link org.apache.lucene.gdata.storage.lucenestorage.StorageQuery} and the * {@link org.apache.lucene.gdata.storage.lucenestorage.StorageModifier}. This * class will be instantiated per client request. *  *  *  * @author Simon Willnauer *  */public class StorageImplementation implements Storage {    private final StorageCoreController controller;    private static final Log LOG = LogFactory            .getLog(StorageImplementation.class);    /**     * Creates a new StorageImplementation     *      * @throws StorageException -     *             if the storage controller can not be obtained     *      *      *      */    public StorageImplementation() throws StorageException {        this.controller = (StorageCoreController) GDataServerRegistry                .getRegistry().lookup(StorageController.class,                        ComponentType.STORAGECONTROLLER);        if (this.controller == null)            throw new StorageException("Can't get registered StorageController");    }    /**     * @see org.apache.lucene.gdata.storage.Storage#storeEntry(org.apache.lucene.gdata.data.ServerBaseEntry)     */    public BaseEntry storeEntry(final ServerBaseEntry entry)            throws StorageException {        if (entry == null)            throw new StorageException("entry is null");        if(entry.getFeedId() == null)            throw new StorageException("feed-id is null");        if(entry.getVersion() != 1)            throw new StorageException("entry version must be 1");        if(entry.getServiceConfig() == null)            throw new StorageException("ProvidedService must not be null");        StorageModifier modifier = this.controller.getStorageModifier();        String id = this.controller.releaseId();        entry.setId(entry.getFeedId() + id);        if (LOG.isInfoEnabled())            LOG.info("Store entry " + id + " -- feed: " + entry.getFeedId());        try {            StorageEntryWrapper wrapper = new StorageEntryWrapper(entry,                    StorageOperation.INSERT);            modifier.insertEntry(wrapper);        } catch (IOException e) {            StorageException ex = new StorageException("Can't create Entry -- "                    + e.getMessage(), e);            ex.setStackTrace(e.getStackTrace());            throw ex;        }        return entry.getEntry();    }    /**     * @see org.apache.lucene.gdata.storage.Storage#deleteEntry(org.apache.lucene.gdata.data.ServerBaseEntry)     */    public void deleteEntry(final ServerBaseEntry entry)            throws StorageException {        if (entry == null)            throw new StorageException("Entry is null");        if(entry.getId() == null)            throw new StorageException("Entry id is null");        if(entry.getFeedId() == null)            throw new StorageException("feed id is null");        if (LOG.isInfoEnabled())            LOG.info("delete entry " + entry.getId() + " -- feed: "                    + entry.getFeedId());        StorageModifier modifier = this.controller.getStorageModifier();        ReferenceCounter<StorageQuery> query = this.controller.getStorageQuery();        // try to set concurrency Lock        String key = entry.getId();        setLock(key);        try{        if(query.get().isEntryStored(entry.getId(),entry.getFeedId())){            if(query.get().checkEntryVersion(entry.getId(),entry.getFeedId(),entry.getVersion())){                modifier.deleteEntry(new StorageEntryWrapper(entry,StorageOperation.DELETE));            }else                throw new ModificationConflictException("The entry version does not match -- entry "+entry.getId()+" feed:"+entry.getFeedId()+" version: "+entry.getVersion());        }        else            throw new ResourceNotFoundException("Entry for entry id: "+entry.getId()+" is not stored");        }catch (IOException e) {            throw new StorageException("Can not access storage");        }finally{            if(query != null)                query.decrementRef();            // release lock for concurrency            releaseLock(key);        }    }    /**     * @see org.apache.lucene.gdata.storage.Storage#updateEntry(org.apache.lucene.gdata.data.ServerBaseEntry)     */    public BaseEntry updateEntry(ServerBaseEntry entry) throws StorageException {        if (entry == null)            throw new StorageException("entry is null");        if(entry.getId() == null)            throw new StorageException("entry id is null");        if(entry.getServiceConfig() == null)            throw new StorageException("service config is not set -- null");        if(entry.getFeedId() == null)            throw new StorageException("feed id is null");        if (LOG.isInfoEnabled())            LOG.info("update entry " + entry.getId() + " -- feed: "                    + entry.getFeedId());        StorageModifier modifier = this.controller.getStorageModifier();        ReferenceCounter<StorageQuery> query = this.controller.getStorageQuery();        // try to set concurrency Lock        String key = entry.getId();        setLock(key);        try {                                    if(query.get().isEntryStored(entry.getId(),entry.getFeedId())){                                if(query.get().checkEntryVersion(entry.getId(),entry.getFeedId(),entry.getVersion())){                    entry.setVersion(entry.getVersion()+1);                    StorageEntryWrapper wrapper = new StorageEntryWrapper(entry,                            StorageOperation.UPDATE);                      modifier.updateEntry(wrapper);                }else                    throw new ModificationConflictException("The entry version does not match -- entry "+entry.getId()+" feed:"+entry.getFeedId()+" version: "+entry.getVersion());                          }else                throw new ResourceNotFoundException("Entry for entry id: "+entry.getId()+" is not stored");                    } catch (IOException e) {            LOG.error("Can't update entry for feedID: " + entry.getFeedId()                    + "; entryId: " + entry.getId() + " -- " + e.getMessage(),                    e);            StorageException ex = new StorageException("Can't update Entry -- "                    + e.getMessage(), e);            ex.setStackTrace(e.getStackTrace());            throw ex;        }        finally{            if(query != null)                query.decrementRef();            // release lock for concurrency            releaseLock(key);        }        return entry.getEntry();    }    private void setLock(String key) throws ModificationConflictException{        if(!this.controller.getLock().setLock(key))            throw new ModificationConflictException("Can not set lock for entry -- "+key);                }        private void releaseLock(String key) throws StorageException{        if(!this.controller.getLock().releaseLock(key))            throw new StorageException("Can not release lock for key: "+key);    }    /**     * @see org.apache.lucene.gdata.storage.Storage#getFeed(org.apache.lucene.gdata.data.ServerBaseFeed)     */    @SuppressWarnings("unchecked")    public BaseFeed getFeed(final ServerBaseFeed feed) throws StorageException {        if (feed == null)            throw new StorageException("feed is null");        if (LOG.isInfoEnabled())            LOG.info("get feed: " + feed.getId() + " start-index: "                    + feed.getStartIndex() + " resultCount: "                    + feed.getItemsPerPage());        ReferenceCounter<StorageQuery> query = null;        try {            query = this.controller.getStorageQuery();            BaseFeed retVal = query.get().getLatestFeedQuery(feed.getId(),                    feed.getItemsPerPage(), feed.getStartIndex(),                    feed.getServiceConfig());            return retVal;        } catch (Exception e) {            LOG.error("Can't get latest feed for feedID: " + feed.getId()                    + " -- " + e.getMessage(), e);            StorageException ex = new StorageException("Can't create Entry -- "                    + e.getMessage(), e);            ex.setStackTrace(e.getStackTrace());            throw ex;        } finally {            if (query != null)                query.decrementRef();        }    }    /**     * @see org.apache.lucene.gdata.storage.Storage#getEntry(org.apache.lucene.gdata.data.ServerBaseEntry)     */    public BaseEntry getEntry(final ServerBaseEntry entry)            throws StorageException {        if (entry == null)            throw new StorageException("No entry  specified -- is null");        if (LOG.isInfoEnabled())            LOG.info("get entry " + entry.getId() + " -- feed: "                    + entry.getFeedId());        ReferenceCounter<StorageQuery> query = null;        try {            query = this.controller.getStorageQuery();            BaseEntry retVal = query.get().singleEntryQuery(entry.getId(),                    entry.getFeedId(), entry.getServiceConfig());            if(retVal == null)                throw new ResourceNotFoundException("can not get entry for entry ID "+entry.getId());            return retVal;        } catch (Exception e) {            LOG.error("Can't get entry for feedID: " + entry.getFeedId()                    + "; entryId: " + entry.getId() + " -- " + e.getMessage(),                    e);            StorageException ex = new StorageException("Can't create Entry -- "                    + e.getMessage(), e);            ex.setStackTrace(e.getStackTrace());            throw ex;        } finally {            if (query != null)                query.decrementRef();        }    }    /**     * @see org.apache.lucene.gdata.storage.Storage#close()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -