You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by st...@apache.org on 2004/09/06 19:11:15 UTC
cvs commit: jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/state NodeReferences.java ReferenceManager.java
stefan 2004/09/06 10:11:15
Added: proposals/jcrri/src/org/apache/slide/jcr/core/state
NodeReferences.java ReferenceManager.java
Log:
jcrri: implementing REFRERENCES type & minor fixes
Revision Changes Path
1.1 jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/state/NodeReferences.java
Index: NodeReferences.java
===================================================================
/*
* Copyright 2002-2004 The Apache Software Foundation.
*
* 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.apache.slide.jcr.core.state;
import org.apache.slide.jcr.core.NodeId;
import org.apache.slide.jcr.core.PropertyId;
import java.util.*;
import java.io.Serializable;
/**
* <code>NodeReferences</code> represents the references (i.e. properties of
* type <code>REFERENCE</code>) to a particular node (denoted by its uuid).
*
* @author Stefan Guggisberg
* @version $Revision: 1.1 $, $Date: 2004/09/06 17:11:15 $
*/
public class NodeReferences implements Serializable {
static final long serialVersionUID = 7007727035982680717L;
/**
* id of the target node
*/
protected NodeId targetId;
/**
* list of PropertyId's (i.e. the id's of the properties that refer to
* the target node denoted by <code>targetId</code>).
* <p/>
* note that the list can contain duplicate entries because a specific
* REFERENCE property can contain multiple references (if it's multi-valued)
* to potentially the same target node.
*/
protected List references;
/**
* Package private constructor
*
* @param targetId
*/
public NodeReferences(NodeId targetId) {
this.targetId = targetId;
references = new ArrayList();
}
/**
*
* @return
*/
public NodeId getTargetId() {
return targetId;
}
/**
*
* @return
*/
public boolean hasReferences() {
return !references.isEmpty();
}
/**
*
* @return
*/
public Collection getReferences() {
return Collections.unmodifiableCollection(references);
}
/**
*
* @param refId
*/
public void addReference(PropertyId refId) {
references.add(refId);
}
/**
*
* @param references
*/
public void addAllReferences(Set references) {
references.addAll(references);
}
/**
*
* @param refId
* @return
*/
public boolean removeReference(PropertyId refId) {
return references.remove(refId);
}
/**
*
*/
public void clearAllReferences() {
references.clear();
}
}
1.1 jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/state/ReferenceManager.java
Index: ReferenceManager.java
===================================================================
/*
* Copyright 2002-2004 The Apache Software Foundation.
*
* 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.apache.slide.jcr.core.state;
import org.apache.commons.collections.ReferenceMap;
import org.apache.slide.jcr.core.NodeId;
import org.apache.log4j.Logger;
import javax.jcr.RepositoryException;
import java.util.Map;
/**
* <code>ReferenceManager</code> ...
*
* @author Stefan Guggisberg
* @version $Revision: 1.1 $, $Date: 2004/09/06 17:11:15 $
*/
public class ReferenceManager {
private static Logger log = Logger.getLogger(ReferenceManager.class);
private final PersistenceManager persistMgr;
/**
* A cache for <code>NodeReferences</code> objects created by this
* <code>ReferenceManager</code>
*/
private Map refsCache;
/**
* Package private constructor
*/
public ReferenceManager(PersistenceManager persistMgr) {
this.persistMgr = persistMgr;
// setup cache with soft references to <code>NodeReferences</code> objects
refsCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.SOFT);
}
/**
*
* @param targetId
* @return
* @throws RepositoryException
*/
public synchronized NodeReferences get(NodeId targetId) throws RepositoryException {
if (refsCache.containsKey(targetId)) {
return (NodeReferences) refsCache.get(targetId);
}
NodeReferences refs;
try {
// load persisted references
refs = persistMgr.loadNodeReferences(targetId.getUUID());
} catch (NoSuchItemStateException nsise) {
// does not exist, create new
refs = persistMgr.createNodeReferencesInstance(targetId.getUUID());
} catch (ItemStateException ise) {
String msg = "error while loading references";
log.error(msg, ise);
throw new RepositoryException(msg, ise);
}
// put it in cache
refsCache.put(targetId, refs);
return refs;
}
/**
*
* @param refs
* @throws RepositoryException
*/
public synchronized void save(NodeReferences refs) throws RepositoryException {
if (!refs.hasReferences()) {
remove(refs);
return;
}
if (!refsCache.containsKey(refs.getTargetId())) {
// not yet in cache, put it in cache
refsCache.put(refs.getTargetId(), refs);
}
try {
// store references
persistMgr.store(refs);
} catch (ItemStateException ise) {
String msg = "error while storing references";
log.error(msg, ise);
throw new RepositoryException(msg, ise);
}
}
/**
*
* @param refs
* @throws RepositoryException
*/
public synchronized void remove(NodeReferences refs) throws RepositoryException {
try {
// destroy persisted references
persistMgr.destroy(refs);
} catch (ItemStateException ise) {
String msg = "error while destroying references";
log.error(msg, ise);
throw new RepositoryException(msg, ise);
}
// remove from cache
refsCache.remove(refs.getTargetId());
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org