/*
* Part of the CCNx Java Library.
*
* Copyright (C) 2008, 2009, 2010, 2011 Palo Alto Research Center, Inc.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
* This library 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
* Lesser General Public License for more details. You should have received
* a copy of the GNU Lesser General Public License along with this library;
* if not, write to the Free Software Foundation, Inc., 51 Franklin Street,
* Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.ccnx.ccn.impl.repo;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import org.ccnx.ccn.CCNHandle;
import org.ccnx.ccn.config.ConfigurationException;
import org.ccnx.ccn.profiles.nameenum.NameEnumerationResponse;
import org.ccnx.ccn.protocol.ContentName;
import org.ccnx.ccn.protocol.ContentObject;
import org.ccnx.ccn.protocol.Interest;
import org.ccnx.ccn.protocol.MalformedContentNameStringException;
/**
* MemoryRepoStore is a transient, in-memory store for applications that
* wish to provide a repo for their own content as long as they are running.
* Given that it is transient, this implementation breaks the usual convention
* that a repository provides persistent storage. *
*/
public class MemoryRepoStore extends RepositoryStoreBase implements RepositoryStore, ContentTree.ContentGetter {
public final static String CURRENT_VERSION = "1.0";
protected ContentTree _index;
protected ContentName _namespace = null; // Prinmary/initial namespace
// For in-memory repo, we just hold onto each ContentObject directly in the ref
static class MemRef extends ContentRef {
ContentObject co;
public MemRef(ContentObject content) {
co = content;
}
}
public MemoryRepoStore(ContentName namespace) {
_namespace = namespace;
}
public String getVersion() {
return CURRENT_VERSION;
}
public void initialize(String repositoryRoot, File policyFile, String localName, String globalPrefix,
String nameSpace, CCNHandle handle) throws RepositoryException {
if (null == handle) {
// use the default user credentials
try {
handle = CCNHandle.open();
} catch (IOException e) {
throw new RepositoryException("IOException opening a CCNHandle!", e);
} catch (ConfigurationException e) {
throw new RepositoryException("ConfigurationException opening a CCNHandle!", e);
}
}
_handle = handle;
if (null != _index) {
throw new RepositoryException("Attempt to re-initialize " + this.getClass().getName());
}
_index = new ContentTree();
if (null != _namespace) {
ArrayList<ContentName> ns = new ArrayList<ContentName>();
ns.add(_namespace);
_policy = new BasicPolicy(null, ns);
_policy.setVersion(CURRENT_VERSION);
} else {
startInitPolicy(policyFile, nameSpace);
}
// We never have any persistent content so don't try to read policy from there with readPolicy()
try {
finishInitPolicy(localName, globalPrefix);
} catch (MalformedContentNameStringException e) {
throw new RepositoryException(e.getMessage());
}
}
public ContentObject get(ContentRef ref) {
if (null == ref) {
return null;
} else {
// This is a call back based on what we put in ContentTree, so it must be
// using our subtype of ContentRef
MemRef mref = (MemRef)ref;
return mref.co;
}
}
public NameEnumerationResponse saveContent(ContentObject content) throws RepositoryException {
// Note: we're trusting the app to store what it wants and not implementing any
// namespace restrictions here
MemRef ref = new MemRef(content);
NameEnumerationResponse ner = new NameEnumerationResponse();
_index.insert(content, ref, System.currentTimeMillis(), this, ner);
return ner;
}
public ContentObject getContent(Interest interest)
throws RepositoryException {
return _index.get(interest, this);
}
public boolean hasContent(ContentName name) throws RepositoryException {
return _index.matchContent(name);
}
public NameEnumerationResponse getNamesWithPrefix(Interest i, ContentName responseName) {
return _index.getNamesWithPrefix(i, responseName);
}
public void shutDown() {
// no-op
}
public Object getStatus(String type) {
return null;
}
public boolean bulkImport(String name) throws RepositoryException {
return false; // not supported
}
public void policyUpdate() throws RepositoryException {}
}