org.ldp4j.application.data.PropertyCollection Maven / Gradle / Ivy
/**
* #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
* This file is part of the LDP4j Project:
* http://www.ldp4j.org/
*
* Center for Open Middleware
* http://www.centeropenmiddleware.com/
* #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
* Copyright (C) 2014-2016 Center for Open Middleware.
* #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
* 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.
* #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
* Artifact : org.ldp4j.framework:ldp4j-application-api:0.2.1
* Bundle : ldp4j-application-api-0.2.1.jar
* #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
*/
package org.ldp4j.application.data;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.locks.ReentrantReadWriteLock;
final class PropertyCollection implements Iterable {
private final Map properties;
private final ReentrantReadWriteLock lock;
private final MutableDataSet dataSet;
private final Individual, ?> individual;
PropertyCollection(Individual,?> individual, MutableDataSet context) {
this.individual = individual;
this.dataSet = context;
this.properties=new LinkedHashMap();
this.lock=new ReentrantReadWriteLock();
}
@Override
public Iterator iterator() {
return properties().iterator();
}
int size() {
this.lock.readLock().lock();
try {
return this.properties.size();
} finally {
this.lock.readLock().unlock();
}
}
boolean isEmpty() {
this.lock.readLock().lock();
try {
return this.properties.isEmpty();
} finally {
this.lock.readLock().unlock();
}
}
Collection properties() {
this.lock.readLock().lock();
try {
List result = new ArrayList();
for(MutableProperty property:this.properties.values()) {
result.add(new ImmutableProperty(property));
}
return result;
} finally {
this.lock.readLock().unlock();
}
}
boolean hasProperty(URI propertyId) {
this.lock.readLock().lock();
try {
return this.properties.containsKey(propertyId);
} finally {
this.lock.readLock().unlock();
}
}
Property property(URI propertyId) {
this.lock.readLock().lock();
try {
MutableProperty result=this.properties.get(propertyId);
if(result!=null) {
return new ImmutableProperty(result);
}
return result;
} finally {
this.lock.readLock().unlock();
}
}
void addValue(URI propertyId, Value value) {
checkNotNull(propertyId,"Property identifier cannot be null");
checkNotNull(value,"Property value cannot be null");
this.lock.writeLock().lock();
try {
MutableProperty property=this.properties.get(propertyId);
if(property==null) {
property = new MutableProperty(this.individual,this.dataSet,propertyId);
this.properties.put(propertyId,property);
}
property.addValue(value);
} finally {
this.lock.writeLock().unlock();
}
}
void removeValue(URI propertyId, Value value) {
checkNotNull(propertyId,"Property identifier cannot be null");
checkNotNull(value,"Property value cannot be null");
this.lock.writeLock().lock();
try {
MutableProperty property=this.properties.get(propertyId);
if(property!=null) {
property.removeValue(value);
if(!property.hasValues()) {
this.properties.remove(propertyId);
}
}
} finally {
this.lock.writeLock().unlock();
}
}
Set propertyIds() {
this.lock.readLock().lock();
try {
return new LinkedHashSet(this.properties.keySet());
} finally {
this.lock.readLock().unlock();
}
}
}