/*
* Copyright 2012 NGDATA nv
*
* 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.lilyproject.repository.impl;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.lilyproject.repository.api.FieldNotFoundException;
import org.lilyproject.repository.api.IdentityRecordStack;
import org.lilyproject.repository.api.Metadata;
import org.lilyproject.repository.api.QName;
import org.lilyproject.repository.api.Record;
import org.lilyproject.repository.api.RecordException;
import org.lilyproject.repository.api.RecordId;
import org.lilyproject.repository.api.ResponseStatus;
import org.lilyproject.repository.api.Scope;
/**
* Wrapper around Record that disallows updates.
*/
public class UnmodifiableRecord implements Record, Cloneable {
private Record delegate;
private static final String MSG = "Modification of this record object was not expected.";
public UnmodifiableRecord(Record delegate) {
this.delegate = delegate;
}
@Override
public void setId(RecordId recordId) {
throw new RuntimeException(MSG);
}
@Override
public RecordId getId() {
return delegate.getId();
}
@Override
public void setVersion(Long version) {
throw new RuntimeException(MSG);
}
@Override
public Long getVersion() {
return delegate.getVersion();
}
@Override
public void setRecordType(QName name, Long version) {
throw new RuntimeException(MSG);
}
@Override
public void setRecordType(QName name) {
throw new RuntimeException(MSG);
}
@Override
public QName getRecordTypeName() {
return delegate.getRecordTypeName();
}
@Override
public Long getRecordTypeVersion() {
return delegate.getRecordTypeVersion();
}
@Override
public void setRecordType(Scope scope, QName name, Long version) {
throw new RuntimeException(MSG);
}
@Override
public QName getRecordTypeName(Scope scope) {
return delegate.getRecordTypeName(scope);
}
@Override
public Long getRecordTypeVersion(Scope scope) {
return delegate.getRecordTypeVersion(scope);
}
@Override
public void setField(QName fieldName, Object value) {
throw new RuntimeException(MSG);
}
@Override
public void delete(QName fieldName, boolean addToFieldsToDelete) {
throw new RuntimeException(MSG);
}
@Override
public <T> T getField(QName fieldName) throws FieldNotFoundException {
// The cast to (T) is only needed for a bug in JDK's < 1.6u24
return (T)delegate.getField(fieldName);
}
@Override
public boolean hasField(QName fieldName) {
return delegate.hasField(fieldName);
}
@Override
public Map<QName, Object> getFields() {
return Collections.unmodifiableMap(delegate.getFields());
}
@Override
public void addFieldsToDelete(List<QName> fieldNames) {
throw new RuntimeException(MSG);
}
@Override
public void removeFieldsToDelete(List<QName> fieldNames) {
throw new RuntimeException(MSG);
}
@Override
public List<QName> getFieldsToDelete() {
return Collections.unmodifiableList(delegate.getFieldsToDelete());
}
@Override
public ResponseStatus getResponseStatus() {
return delegate.getResponseStatus();
}
@Override
public void setResponseStatus(ResponseStatus status) {
throw new RuntimeException(MSG);
}
@Override
public Record clone() {
return delegate.clone();
}
@Override
public Record cloneRecord(IdentityRecordStack parentRecords) throws RecordException {
return delegate.cloneRecord(parentRecords);
}
@Override
public Record cloneRecord() throws RecordException {
return delegate.cloneRecord();
}
@Override
public boolean equals(Object obj) {
return delegate.equals(obj);
}
@Override
public int hashCode() {
return delegate != null ? delegate.hashCode() : 0;
}
@Override
public boolean softEquals(Object obj) {
return delegate.softEquals(obj);
}
@Override
public void setDefaultNamespace(String namespace) {
throw new RuntimeException(MSG);
}
@Override
public void setRecordType(String recordTypeName) {
throw new RuntimeException(MSG);
}
@Override
public void setRecordType(String recordTypeName, Long version) {
throw new RuntimeException(MSG);
}
@Override
public void setRecordType(Scope scope, String recordTypeName, Long version) {
throw new RuntimeException(MSG);
}
@Override
public void setField(String fieldName, Object value) {
throw new RuntimeException(MSG);
}
@Override
public <T> T getField(String fieldName) throws FieldNotFoundException, RecordException {
// The cast to (T) is only needed for a bug in JDK's < 1.6u24
return (T)delegate.getField(fieldName);
}
@Override
public void delete(String fieldName, boolean addToFieldsToDelete) {
throw new RuntimeException(MSG);
}
@Override
public boolean hasField(String fieldName) throws RecordException {
return delegate.hasField(fieldName);
}
@Override
public Map<String, String> getAttributes() {
return Collections.unmodifiableMap(delegate.getAttributes());
}
@Override
public boolean hasAttributes() {
return delegate.hasAttributes();
}
@Override
public void setAttributes(Map<String, String> attributes) {
throw new RuntimeException(MSG);
}
@Override
public Metadata getMetadata(QName fieldName) {
// Metadata objects are immutable
return delegate.getMetadata(fieldName);
}
@Override
public void setMetadata(QName fieldName, Metadata metadata) {
throw new RuntimeException(MSG);
}
@Override
public Map<QName, Metadata> getMetadataMap() {
// Metadata objects are immutable
return Collections.unmodifiableMap(delegate.getMetadataMap());
}
}