/*******************************************************************************
* Copyright 2013 SAP AG
*
* 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 com.sap.core.odata.api.exception;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* APPLICATION DEVELOPERS: Please use {@link ODataApplicationException} to throw custom exceptions. This class is used inside the library only.
* <p>A {@link MessageReference} references to the used message for an
* {@link ODataMessageException} and its sub classes. It supports
* internationalization and translation of exception messages.
* <br>Theses classes contain a {@link MessageReference} object which
* can be mapped to a related key and message text in the resource bundles.
* @author SAP AG
*/
public abstract class MessageReference {
protected final String key;
protected List<Object> content = null;
private MessageReference(final String key) {
this(key, null);
}
private MessageReference(final String key, final List<Object> content) {
this.key = key;
this.content = content;
}
/**
* Creates a {@link MessageReference} for given <code>class</code> and <code>key</code>.
* This combination of <code>class</code> and <code>key</code> has to be provided
* by a resource bundle.
* @param clazz {@link ODataMessageException} for which this {@link MessageReference}
* should be used
* @param key unique key (in context of {@link ODataMessageException}) for reference
* to message text in resource bundle
* @return created {@link MessageReference}
*/
public static MessageReference create(final Class<? extends ODataException> clazz, final String key) {
return new SimpleMessageReference(clazz.getName() + "." + key);
}
public MessageReference create() {
return new SingleMessageReference(key);
}
/**
* Returns message key.
*/
public String getKey() {
return key;
}
/**
* Adds given content to message reference.
*/
public MessageReference addContent(final Object... content) {
if (this.content == null) {
return new SimpleMessageReference(key, content);
} else {
final List<Object> mergedContent = new ArrayList<Object>(this.content.size() + content.length);
mergedContent.addAll(this.content);
mergedContent.addAll(Arrays.asList(content));
return new SimpleMessageReference(key, mergedContent);
}
}
/**
* Receives content for this {@link MessageReference}.
* Beware that returned list is immutable.
*/
public List<?> getContent() {
if (content == null) {
return Collections.emptyList();
} else {
return Collections.unmodifiableList(content);
}
}
/**
* Simple inner class for realization of {@link MessageReference} interface.
*/
private static class SimpleMessageReference extends MessageReference {
public SimpleMessageReference(final String implKey) {
super(implKey);
}
public SimpleMessageReference(final String implKey, final List<Object> content) {
super(implKey, content);
}
public SimpleMessageReference(final String implKey, final Object... content) {
super(implKey, Arrays.asList(content));
}
}
private static class SingleMessageReference extends MessageReference {
public SingleMessageReference(final String implKey) {
super(implKey);
}
public SingleMessageReference(final String implKey, final List<Object> content) {
super(implKey, content);
}
public SingleMessageReference(final String implKey, final Object... content) {
super(implKey, Arrays.asList(content));
}
@Override
public MessageReference addContent(final Object... content) {
if (this.content == null) {
this.content = new ArrayList<Object>();
}
this.content.addAll(Arrays.asList(content));
return this;
}
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((key == null) ? 0 : key.hashCode());
return result;
}
/**
* {@link MessageReference}s are equal if their message keys have the same value.
* @return <code>true</code> if both instances are equal, otherwise <code>false</code>.
*/
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
MessageReference other = (MessageReference) obj;
if (key == null) {
if (other.key != null) {
return false;
}
} else if (!key.equals(other.key)) {
return false;
}
return true;
}
}