/*
* =============================================================================
*
* Copyright (c) 2011-2016, The THYMELEAF team (http://www.thymeleaf.org)
*
* 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.thymeleaf.engine;
import java.util.Arrays;
/**
*
* @author Daniel Fernández
* @since 3.0.0
*
*/
public abstract class AttributeName {
/*
* NOTE it is VERY important that an AttributeName does NOT contain a TemplateMode, because there is a type
* of AttributeName (TextAttributeName) that is used for 3 different template modes: TEXT, JAVASCRIPT and CSS
*/
protected final String prefix;
protected final String attributeName;
protected final String[] completeAttributeNames;
private final int h;
protected AttributeName(final String prefix, final String attributeName, final String[] completeAttributeNames) {
super();
if (attributeName == null || attributeName.trim().length() == 0) {
throw new IllegalArgumentException("Attribute name cannot be null or empty");
}
// Prefix CAN be null (if the attribute is not prefixed)
this.prefix = prefix;
this.attributeName = attributeName;
this.completeAttributeNames = completeAttributeNames;
this.h = Arrays.hashCode(this.completeAttributeNames);
}
public String getAttributeName() {
return this.attributeName;
}
public boolean isPrefixed() {
return this.prefix != null;
}
public String getPrefix() {
return this.prefix;
}
public String[] getCompleteAttributeNames() {
return this.completeAttributeNames;
}
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null) {
return false;
}
if (!o.getClass().equals(this.getClass())) {
return false;
}
final AttributeName that = (AttributeName) o;
if (this.h != that.h) {
return false;
}
if (!this.completeAttributeNames[0].equals(that.completeAttributeNames[0])) {
// No need to check the other names as we have already checked the class
return false;
}
return true;
}
@Override
public int hashCode() {
return this.h;
}
@Override
public String toString() {
final StringBuilder strBuilder = new StringBuilder();
strBuilder.append('{');
strBuilder.append(this.completeAttributeNames[0]);
for (int i = 1; i < this.completeAttributeNames.length; i++) {
strBuilder.append(',');
strBuilder.append(this.completeAttributeNames[i]);
}
strBuilder.append('}');
return strBuilder.toString();
}
}