blob: e89d6b833217ad0fdba378f9a23334c16d931620 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.netbeans.modules.j2ee.persistenceapi.metadata.orm.annotation;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Stack;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import org.netbeans.modules.j2ee.metadata.model.api.support.annotation.AnnotationModelHelper;
import org.netbeans.modules.j2ee.persistence.api.metadata.orm.*;
import org.netbeans.modules.j2ee.persistenceapi.metadata.orm.annotation.AttributesHelper.PropertyHandler;
public class AttributesImpl implements Attributes, PropertyHandler {
private final AnnotationModelHelper helper;
private AttributesHelper attrHelper;
private EmbeddedId embeddedId;
private final List<Id> idList = new ArrayList<Id>();
private final List<Id> derivedIdList = new ArrayList<Id>();
private final List<Version> versionList = new ArrayList<Version>();
private final List<Basic> basicList = new ArrayList<Basic>();
private final List<OneToOne> oneToOneList = new ArrayList<OneToOne>();
private final List<OneToMany> oneToManyList = new ArrayList<OneToMany>();
private final List<ManyToOne> manyToOneList = new ArrayList<ManyToOne>();
private final List<ManyToMany> manyToManyList = new ArrayList<ManyToMany>();
public AttributesImpl(EntityImpl entity) {
this(entity.getRoot(), entity.getTypeElement());
}
public AttributesImpl(MappedSuperclassImpl mappedSuperclass) {
this(mappedSuperclass.getRoot(), mappedSuperclass.getTypeElement());
}
private AttributesImpl(EntityMappingsImpl mappings, TypeElement typeElement) {
this.helper = mappings.getHelper();
Stack<TypeElement> hierarchy = new Stack<TypeElement>();
hierarchy.add(typeElement);
for (; typeElement != null;) {
TypeMirror supMirror = typeElement.getSuperclass();
if (supMirror != null && supMirror.getKind() == TypeKind.DECLARED) {
DeclaredType superclassDeclaredType = (DeclaredType) supMirror;
typeElement = (TypeElement) superclassDeclaredType.asElement();
} else {
break;
}
Map<String, ? extends AnnotationMirror> annByType = helper.getAnnotationsByType(typeElement.getAnnotationMirrors());
if (annByType.get("javax.persistence.Entity") != null || annByType.get("javax.persistence.MappedSuperclass") != null) { // NOI18N
hierarchy.add(typeElement);
}
}
while (!hierarchy.empty()) {
typeElement = hierarchy.pop();
attrHelper = new AttributesHelper(helper, typeElement, this);
attrHelper.parse();
}
}
public boolean hasFieldAccess() {
return attrHelper.hasFieldAccess();
}
@Override
public void handleProperty(Element element, String propertyName) {
Map<String, ? extends AnnotationMirror> annByType = helper.getAnnotationsByType(element.getAnnotationMirrors());
if (EntityMappingsUtilities.isTransient(annByType, element.getModifiers())) {
return;
}
AnnotationMirror oneToOneAnnotation = annByType.get("javax.persistence.OneToOne"); // NOI18N
AnnotationMirror oneToManyAnnotation = annByType.get("javax.persistence.OneToMany"); // NOI18N
AnnotationMirror manyToOneAnnotation = annByType.get("javax.persistence.ManyToOne"); // NOI18N
AnnotationMirror manyToManyAnnotation = annByType.get("javax.persistence.ManyToMany"); // NOI18N
AnnotationMirror embeddedIdAnnotation = annByType.get("javax.persistence.EmbeddedId"); // NOI18N
AnnotationMirror derivedIdAnnotation = null;
if (oneToOneAnnotation != null) {
oneToOneList.add(new OneToOneImpl(helper, element, oneToOneAnnotation, propertyName, annByType));
//it may also be part of derived id
derivedIdAnnotation = annByType.get("javax.persistence.Id"); // NOI18N
} else if (oneToManyAnnotation != null) {
oneToManyList.add(new OneToManyImpl(helper, element, oneToManyAnnotation, propertyName, annByType));
} else if (manyToOneAnnotation != null) {
manyToOneList.add(new ManyToOneImpl(helper, element, manyToOneAnnotation, propertyName, annByType));
//it may also be part of derived id
derivedIdAnnotation = annByType.get("javax.persistence.Id"); // NOI18N
} else if (manyToManyAnnotation != null) {
manyToManyList.add(new ManyToManyImpl(helper, element, manyToManyAnnotation, propertyName, annByType));
} else {
// not a relationship field
if (embeddedIdAnnotation != null) {
embeddedId = new EmbeddedIdImpl(propertyName);
} else {
AnnotationMirror versionAnnotation = annByType.get("javax.persistence.Version"); // NOI18N
AnnotationMirror idAnnotation = annByType.get("javax.persistence.Id"); // NOI18N
AnnotationMirror columnAnnotation = annByType.get("javax.persistence.Column"); // NOI18N
AnnotationMirror temporalAnnotation = annByType.get("javax.persistence.Temporal"); // NOI18N
String temporal = temporalAnnotation != null ? EntityMappingsUtilities.getTemporalType(helper, temporalAnnotation) : null;
Column column = new ColumnImpl(helper, columnAnnotation, propertyName.toUpperCase()); // NOI18N
if (idAnnotation != null) {
AnnotationMirror generatedValueAnnotation = annByType.get("javax.persistence.GeneratedValue"); // NOI18N
GeneratedValue genValue = generatedValueAnnotation != null ? new GeneratedValueImpl(helper, generatedValueAnnotation) : null;
idList.add(new IdImpl(propertyName, genValue, column, temporal));
} else if (versionAnnotation != null) {
versionList.add(new VersionImpl(propertyName, column, temporal));
} else {
AnnotationMirror basicAnnotation = annByType.get("javax.persistence.Basic"); // NOI18N
basicList.add(new BasicImpl(helper, basicAnnotation, propertyName, column, temporal));
}
}
}
//
if (derivedIdAnnotation != null) {
AnnotationMirror columnAnnotation = annByType.get("javax.persistence.Column"); // NOI18N, TODO some annotations may not be valid for derived id and it may not be requires, also need to separate from usual id later(just like embedded ids) to find if exist
AnnotationMirror temporalAnnotation = annByType.get("javax.persistence.Temporal"); // NOI18N
String temporal = temporalAnnotation != null ? EntityMappingsUtilities.getTemporalType(helper, temporalAnnotation) : null;
Column column = new ColumnImpl(helper, columnAnnotation, propertyName.toUpperCase()); // NOI18N
AnnotationMirror generatedValueAnnotation = annByType.get("javax.persistence.GeneratedValue"); // NOI18N
GeneratedValue genValue = generatedValueAnnotation != null ? new GeneratedValueImpl(helper, generatedValueAnnotation) : null;
IdImpl id = new IdImpl(propertyName, genValue, column, temporal);
idList.add(id);
derivedIdList.add(id);
}
}
@Override
public void setId(int index, Id value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public Id getId(int index) {
return idList.get(index);
}
@Override
public int sizeId() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public void setId(Id[] value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public Id[] getId() {
return idList.toArray(new Id[idList.size()]);
}
@Override
public int addId(Id value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public int removeId(Id value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public Id newId() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
public Id getDerivedId(int index) {
return derivedIdList.get(index);
}
public int sizeDerivedId() {
return derivedIdList.size(); // NOI18N
}
public Id[] getDerivedId() {
return derivedIdList.toArray(new Id[derivedIdList.size()]);
}
@Override
public void setEmbeddedId(EmbeddedId value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public EmbeddedId getEmbeddedId() {
return embeddedId;
}
@Override
public EmbeddedId newEmbeddedId() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public void setBasic(int index, Basic value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public Basic getBasic(int index) {
return basicList.get(index);
}
@Override
public int sizeBasic() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public void setBasic(Basic[] value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public Basic[] getBasic() {
return basicList.toArray(new Basic[basicList.size()]);
}
@Override
public int addBasic(Basic value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public int removeBasic(Basic value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public Basic newBasic() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public void setVersion(int index, Version value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public Version getVersion(int index) {
return versionList.get(index);
}
@Override
public int sizeVersion() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public void setVersion(Version[] value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public Version[] getVersion() {
return versionList.toArray(new Version[versionList.size()]);
}
@Override
public int addVersion(Version value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public int removeVersion(Version value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public Version newVersion() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public void setManyToOne(int index, ManyToOne value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public ManyToOne getManyToOne(int index) {
return manyToOneList.get(index);
}
@Override
public int sizeManyToOne() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public void setManyToOne(ManyToOne[] value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public ManyToOne[] getManyToOne() {
return manyToOneList.toArray(new ManyToOne[manyToOneList.size()]);
}
@Override
public int addManyToOne(ManyToOne value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public int removeManyToOne(ManyToOne value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public ManyToOne newManyToOne() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public void setOneToMany(int index, OneToMany value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public OneToMany getOneToMany(int index) {
return oneToManyList.get(index);
}
@Override
public int sizeOneToMany() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public void setOneToMany(OneToMany[] value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public OneToMany[] getOneToMany() {
return oneToManyList.toArray(new OneToMany[oneToManyList.size()]);
}
@Override
public int addOneToMany(OneToMany value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public int removeOneToMany(OneToMany value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public OneToMany newOneToMany() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public void setOneToOne(int index, OneToOne value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public OneToOne getOneToOne(int index) {
return oneToOneList.get(index);
}
@Override
public int sizeOneToOne() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public void setOneToOne(OneToOne[] value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public OneToOne[] getOneToOne() {
return oneToOneList.toArray(new OneToOne[oneToOneList.size()]);
}
@Override
public int addOneToOne(OneToOne value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public int removeOneToOne(OneToOne value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public OneToOne newOneToOne() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public void setManyToMany(int index, ManyToMany value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public ManyToMany getManyToMany(int index) {
return manyToManyList.get(index);
}
@Override
public int sizeManyToMany() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public void setManyToMany(ManyToMany[] value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public ManyToMany[] getManyToMany() {
return manyToManyList.toArray(new ManyToMany[manyToManyList.size()]);
}
@Override
public int addManyToMany(ManyToMany value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public int removeManyToMany(ManyToMany value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public ManyToMany newManyToMany() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public void setEmbedded(int index, Embedded value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public Embedded getEmbedded(int index) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public int sizeEmbedded() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public void setEmbedded(Embedded[] value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public Embedded[] getEmbedded() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public int addEmbedded(Embedded value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public int removeEmbedded(Embedded value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public Embedded newEmbedded() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public void setTransient(int index, Transient value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public Transient getTransient(int index) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public int sizeTransient() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public void setTransient(Transient[] value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public Transient[] getTransient() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public int addTransient(Transient value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public int removeTransient(Transient value) {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
@Override
public Transient newTransient() {
throw new UnsupportedOperationException("This operation is not implemented yet."); // NOI18N
}
}