/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.datamanagement.commons;
import java.io.Serializable;
import de.rcenvironment.core.utils.incubator.Assertions;
/**
* Identifier for meta data.
*
* @author Dirk Rossow
*/
public final class MetaData implements Cloneable, Serializable {
/** Maximal length of keys. */
public static final int MAX_KEY_LENGTH = 255;
/** Maximal length of values. */
public static final int MAX_VALUE_LENGTH = 32000;
/** External keys may not start with this prefix. */
// TODO delegated to MetaDataKeys for now; rewrite all references instead
public static final String PROTECTEDKEYPREFIX = MetaDataKeys.Managed.PROTECTED_KEY_PREFIX;
/** User who has written the data. Read-only data. */
public static final MetaData AUTHOR = new MetaData(MetaDataKeys.Managed.AUTHOR, false, true);
/** Date the data was written. Format: "yyyy-MM-dd HH:mm:ss". Read-only data. */
public static final MetaData DATE = new MetaData(MetaDataKeys.Managed.DATE, false, true);
/** Size of data. Read-only data. */
public static final MetaData SIZE = new MetaData(MetaDataKeys.Managed.SIZE, false, true);
/**
* User who has initial created the {@link DataReference}. Read-only data. This is a revision independent meta data.
*/
public static final MetaData CREATOR = new MetaData(MetaDataKeys.Managed.CREATOR, true, true);
private static final long serialVersionUID = -8984237820030181855L;
private final String key;
/** Used for data management internal meta data. */
private final boolean isReadOnly;
/** Constructor for read-only meta data. */
public MetaData(String key, boolean isRevisionIndependent) {
this(key, isRevisionIndependent, false);
}
public MetaData(String key, boolean isRevisionIndependent, boolean isReadOnly) {
Assertions.isTrue(key.length() <= MAX_KEY_LENGTH, "key > " + MAX_KEY_LENGTH);
this.key = key;
this.isReadOnly = isReadOnly;
}
/**
* @return <code>true</code> if this {@link MetaData} is read only.
*/
public boolean isReadOnly() {
return isReadOnly;
}
/**
* Factory method for creating new MetaData instances.
*
* @param key Key to use.
* @param isRevisionIndependent True creates a revision independent MetaData.
* @return created MetaData.
*/
@Deprecated
public static MetaData create(String key, boolean isRevisionIndependent) {
Assertions.isDefined(key, "Key must not be null.");
Assertions.isFalse(key.isEmpty(), "Key must not be empty.");
if (key.startsWith(PROTECTEDKEYPREFIX)) {
return new MetaData(key, isRevisionIndependent, true);
} else {
return new MetaData(key, isRevisionIndependent, false);
}
}
/**
* @return key representing this {@link MetaData}.
*/
public String getKey() {
return key;
}
@Override
public int hashCode() {
final int c1231 = 1231;
final int c1237 = 1237;
final int prime = 31;
int result = 1;
if (isReadOnly) {
result = prime * result + c1231;
} else {
result = prime * result + c1237;
}
if (key == null) {
result = prime * result;
} else {
result = prime * result + key.hashCode();
}
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final MetaData other = (MetaData) obj;
if (isReadOnly != other.isReadOnly) {
return false;
}
if (key == null) {
if (other.key != null) {
return false;
}
} else if (!key.equals(other.key)) {
return false;
}
return true;
}
@Override
public String toString() {
return getKey();
}
}