blob: 2e37e40302d516d3356ccdf7b684a9495ef10a2c [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* 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.intellij.util.xml.impl;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.SmartList;
import com.intellij.util.xml.DomElement;
import com.intellij.util.xml.DomNameStrategy;
import com.intellij.util.xml.JavaMethod;
import com.intellij.util.xml.XmlName;
import com.intellij.util.xml.reflect.DomFixedChildDescription;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
/**
* @author peter
*/
public class FixedChildDescriptionImpl extends DomChildDescriptionImpl implements DomFixedChildDescription {
private final Collection<JavaMethod>[] myGetterMethods;
private final int myCount;
public FixedChildDescriptionImpl(final XmlName tagName, final Type type, final int count, final Collection<JavaMethod>[] getterMethods) {
super(tagName, type);
assert getterMethods.length == count || getterMethods == ArrayUtil.EMPTY_COLLECTION_ARRAY;
myCount = count;
myGetterMethods = getterMethods;
}
@Override
public JavaMethod getGetterMethod(int index) {
if (myGetterMethods.length == 0) return null;
final Collection<JavaMethod> methods = myGetterMethods[index];
return methods == null || methods.isEmpty() ? null : methods.iterator().next();
}
@Override
@Nullable
public <T extends Annotation> T getAnnotation(int index, Class<? extends T> annotationClass) {
final JavaMethod method = getGetterMethod(index);
if (method != null) {
final T annotation = method.getAnnotation(annotationClass);
if (annotation != null) return annotation;
}
final Type elemType = getType();
if (elemType instanceof AnnotatedElement) {
T annotation = ((AnnotatedElement)elemType).getAnnotation(annotationClass);
if (annotation != null) return annotation;
}
return super.getAnnotation(annotationClass);
}
@Override
public int getCount() {
return myCount;
}
@Override
@NotNull
public List<? extends DomElement> getValues(@NotNull final DomElement element) {
final List<DomElement> result = new SmartList<DomElement>();
final DomInvocationHandler handler = DomManagerImpl.getDomInvocationHandler(element);
if (handler != null) {
for (int i = 0; i < myCount; i++) {
result.add(handler.getFixedChild(Pair.create(this, i)).getProxy());
}
}
else {
for (Collection<JavaMethod> methods : myGetterMethods) {
if (methods != null && !methods.isEmpty()) {
result.add((DomElement)methods.iterator().next().invoke(element, ArrayUtil.EMPTY_OBJECT_ARRAY));
}
}
}
return result;
}
@Override
@NotNull
public String getCommonPresentableName(@NotNull DomNameStrategy strategy) {
return StringUtil.capitalizeWords(strategy.splitIntoWords(getXmlElementName()), true);
}
@Override
@Nullable
public final <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
return getAnnotation(0, annotationClass);
}
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
final FixedChildDescriptionImpl that = (FixedChildDescriptionImpl)o;
if (myCount != that.myCount) return false;
if (!Arrays.equals(myGetterMethods, that.myGetterMethods)) return false;
return true;
}
public String toString() {
return getXmlElementName() + " " + getGetterMethod(0) + " " + getType();
}
public int hashCode() {
int result = super.hashCode();
result = 29 * result + myCount;
return result;
}
}