# HG changeset patch # User Sergey B. Petrov # Date 1343742425 -14400 # Node ID 33e28d781030172c89fc6ffbce8c20ccf3341bdc # Parent c24e02c572accaa55eb70f31a5693aa81b606fe7 #216053 may be related, cause up 20 time fater validation in case of 60 queries in simple test case diff --git a/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java b/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java --- a/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java +++ b/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java @@ -91,6 +91,7 @@ } @Override public ErrorDescription[] apply(TypeElement subject, ProblemContext ctx){ + long start = System.nanoTime(); Object modEl = ctx.getModelElement(); Entity entity = (Entity) (modEl instanceof Entity ? modEl : null); List first = Utilities.findAnnotations(subject, JPAAnnotations.NAMED_QUERY); @@ -131,6 +132,7 @@ JPQLQueryHelper helper = new JPQLQueryHelper(); Project project = FileOwnerQuery.getOwner(ctx.getFileObject()); List problems = new ArrayList(); + ManagedTypeProvider mtp = new ManagedTypeProvider(project, ((JPAProblemContext)ctx).getMetaData()); for(int index=0;index tmp = null; try{ tmp = helper.validate(); @@ -151,6 +153,7 @@ } if(tmp!=null && tmp.size()>0)problems.addAll(tmp); helper.dispose(); + System.out.println("TIME TO COMPLETE: "+(System.nanoTime() - start)); } if (problems != null && problems.size()>0){ ErrorDescription[] ret = new ErrorDescription[problems.size()]; # HG changeset patch # User Sergey B. Petrov # Date 1343742767 -14400 # Node ID 683732ae24fa4c719c2df0a4d45ad711d4fe6c83 # Parent 56d640e1f17dc548569f16625d74d38d695b7487 #216053 remove sout diff --git a/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java b/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java --- a/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java +++ b/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java @@ -153,7 +153,7 @@ } if(tmp!=null && tmp.size()>0)problems.addAll(tmp); helper.dispose(); - System.out.println("TIME TO COMPLETE: "+(System.nanoTime() - start)); + //System.out.println("TIME TO COMPLETE: "+(System.nanoTime() - start)); } if (problems != null && problems.size()>0){ ErrorDescription[] ret = new ErrorDescription[problems.size()]; # HG changeset patch # User Sergey B. Petrov # Date 1343748193 -14400 # Node ID 04fe2f14a1bb44129c4941432e648086548afeb9 # Parent 93b664a8f5d7f4e1a1f5922767f04a80c63ed049 #216053 optimize case of null types to avoid resuse of javasource.run... for nulls diff --git a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java --- a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java +++ b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java @@ -70,48 +70,51 @@ */ public class TypeRepository implements ITypeRepository { private final Project project; - private final Map types; + private final Map types; private PUDataObject dObj; private MetadataModelReadHelper> readHelper; TypeRepository(Project project){ this.project = project; - types = new HashMap(); + types = new HashMap(); } @Override public IType getEnumType(String fqn) { - IType ret = types.get(fqn); + System.out.println("ENUM: "+fqn); + IType[] ret = types.get(fqn); if(ret == null){ fillTypeElement(fqn); ret = types.get(fqn); } - return ret; + return ret[0]; } @Override public IType getType(Class type) { String fqn = type.getCanonicalName(); - IType ret = types.get(fqn); + System.out.println("TYPECL: "+fqn); + IType[] ret = types.get(fqn); if(ret == null){ fillTypeElement(type); ret = types.get(fqn); } - return ret; + return ret[0]; } @Override public IType getType(String fqn) { - IType ret = types.get(fqn); + System.out.println("TYPEFQ: "+fqn); + IType[] ret = types.get(fqn); if(ret == null){ if(IType.UNRESOLVABLE_TYPE.equals(fqn)){ - types.put(fqn, new Type(this, fqn)); + types.put(fqn, new Type[] {new Type(this, fqn)}); } else { fillTypeElement(fqn); } ret = types.get(fqn); } - return ret; + return ret[0]; } @Override @@ -120,8 +123,10 @@ } private void fillTypeElement(final String fqn){ + System.out.println("FILL FQN: "+fqn); Sources sources=ProjectUtils.getSources(project); SourceGroup groups[]=sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA); + types.put(fqn, new Type[]{null}); if(groups != null && groups.length>0){ SourceGroup firstGroup=groups[0]; FileObject fo=firstGroup.getRootFolder(); @@ -132,7 +137,7 @@ @Override public void run(WorkingCopy wc) throws Exception { TypeElement te = wc.getElements().getTypeElement(fqn); - if(te != null)types.put(fqn, new Type(TypeRepository.this, te)); + if(te!=null) types.put(fqn, new Type[]{new Type(TypeRepository.this, te)}); } }); } catch (IOException ex) { @@ -141,7 +146,7 @@ } } private void fillTypeElement(Class type){ - types.put(type.getName(), new Type(TypeRepository.this, type)); + types.put(type.getName(), new Type[]{new Type(TypeRepository.this, type)}); } } # HG changeset patch # User Sergey B. Petrov # Date 1343748270 -14400 # Node ID 3e9de776939ff311d9cf9317a5073414655f736d # Parent 04fe2f14a1bb44129c4941432e648086548afeb9 #216053 clean sout diff --git a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java --- a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java +++ b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java @@ -81,7 +81,6 @@ @Override public IType getEnumType(String fqn) { - System.out.println("ENUM: "+fqn); IType[] ret = types.get(fqn); if(ret == null){ fillTypeElement(fqn); @@ -93,7 +92,6 @@ @Override public IType getType(Class type) { String fqn = type.getCanonicalName(); - System.out.println("TYPECL: "+fqn); IType[] ret = types.get(fqn); if(ret == null){ fillTypeElement(type); @@ -104,7 +102,6 @@ @Override public IType getType(String fqn) { - System.out.println("TYPEFQ: "+fqn); IType[] ret = types.get(fqn); if(ret == null){ if(IType.UNRESOLVABLE_TYPE.equals(fqn)){ @@ -123,7 +120,6 @@ } private void fillTypeElement(final String fqn){ - System.out.println("FILL FQN: "+fqn); Sources sources=ProjectUtils.getSources(project); SourceGroup groups[]=sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA); types.put(fqn, new Type[]{null}); # HG changeset patch # User Sergey B. Petrov # Date 1343754188 -14400 # Node ID f0cc35fdd043afa20ebd53ccf4b12066e7694a2c # Parent 2f890ac66de3a09a4e74f9540bb041a70953dc70 #216053 shouldn't start validation of next query if validation is cancelled diff --git a/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java b/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java --- a/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java +++ b/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java @@ -60,7 +60,6 @@ import org.eclipse.persistence.jpa.internal.jpql.JPQLQueryProblemResourceBundle; import org.eclipse.persistence.jpa.jpql.JPQLQueryHelper; import org.eclipse.persistence.jpa.jpql.JPQLQueryProblem; -import org.eclipse.persistence.jpa.jpql.spi.IQuery; import org.netbeans.api.project.FileOwnerQuery; import org.netbeans.api.project.Project; import org.netbeans.modules.j2ee.jpa.model.JPAAnnotations; @@ -81,7 +80,7 @@ * Verify content of @NamedQuery query * TODO: good to move warning to query level instead of class level */ -public class JPQLValidation extends JPAClassRule { +public class JPQLValidation extends JPAClassRule{ /** Creates a new instance of NonFinalClass */ public JPQLValidation() { @@ -91,7 +90,6 @@ } @Override public ErrorDescription[] apply(TypeElement subject, ProblemContext ctx){ - long start = System.nanoTime(); Object modEl = ctx.getModelElement(); Entity entity = (Entity) (modEl instanceof Entity ? modEl : null); List first = Utilities.findAnnotations(subject, JPAAnnotations.NAMED_QUERY); @@ -133,7 +131,7 @@ Project project = FileOwnerQuery.getOwner(ctx.getFileObject()); List problems = new ArrayList(); ManagedTypeProvider mtp = new ManagedTypeProvider(project, ((JPAProblemContext)ctx).getMetaData()); - for(int index=0;index0)problems.addAll(tmp); helper.dispose(); - //System.out.println("TIME TO COMPLETE: "+(System.nanoTime() - start)); } - if (problems != null && problems.size()>0){ + if (!ctx.isCancelled() && problems != null && problems.size()>0){ ErrorDescription[] ret = new ErrorDescription[problems.size()]; for(int i=0;i # Date 1343919702 -14400 # Node ID 4d42c10d44c96a58c184c70dad371231ced18311 # Parent 2231f618026370ee01108db5c0493c0f4303efaa #216053 more complex cancel logic to skip long getTypeElement for imvalidated model diff --git a/j2ee.jpa.verification/manifest.mf b/j2ee.jpa.verification/manifest.mf --- a/j2ee.jpa.verification/manifest.mf +++ b/j2ee.jpa.verification/manifest.mf @@ -1,6 +1,6 @@ Manifest-Version: 1.0 OpenIDE-Module: org.netbeans.modules.j2ee.jpa.verification -OpenIDE-Module-Specification-Version: 1.22 +OpenIDE-Module-Specification-Version: 1.22.1 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/j2ee/jpa/verification/Bundle.properties AutoUpdate-Show-In-Client: false diff --git a/j2ee.jpa.verification/nbproject/project.xml b/j2ee.jpa.verification/nbproject/project.xml --- a/j2ee.jpa.verification/nbproject/project.xml +++ b/j2ee.jpa.verification/nbproject/project.xml @@ -71,7 +71,7 @@ - 1.29 + 1.31.1 diff --git a/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/CancelListener.java b/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/CancelListener.java new file mode 100644 --- /dev/null +++ b/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/CancelListener.java @@ -0,0 +1,50 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2012 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Contributor(s): + * + * Portions Copyrighted 2012 Sun Microsystems, Inc. + */ +package org.netbeans.modules.j2ee.jpa.verification; + +/** + * handle verification cancelling with this interface + * @author sp153251 + */ +public interface CancelListener { + void cancelled(); +} diff --git a/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/JPAProblemContext.java b/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/JPAProblemContext.java --- a/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/JPAProblemContext.java +++ b/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/JPAProblemContext.java @@ -44,6 +44,8 @@ package org.netbeans.modules.j2ee.jpa.verification; +import java.util.HashSet; +import java.util.Set; import org.netbeans.modules.j2ee.jpa.model.AccessType; import org.netbeans.modules.j2ee.jpa.verification.common.ProblemContext; import org.netbeans.modules.j2ee.persistence.api.metadata.orm.EntityMappingsMetadata; @@ -60,6 +62,7 @@ private boolean mappedSuperClass; private AccessType accessType; private EntityMappingsMetadata metadata; + private Set cListeners; public boolean isEntity(){ return entity; @@ -112,4 +115,27 @@ public boolean isJPAClass(){ return entity || embeddable || idClass || mappedSuperClass; } + + @Override + public void setCancelled(boolean cancelled) { + super.setCancelled(cancelled); + if(cancelled && cListeners != null) { + for(CancelListener cl:cListeners) { + cl.cancelled(); + } + } + } + + public void addCancelListener(CancelListener aThis) { + if(cListeners == null) { + cListeners = new HashSet(); + } + cListeners.add(aThis); + } + + public void removeCancelListener(CancelListener cl) { + if(cListeners != null) { + cListeners.remove(cl); + } + } } diff --git a/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java b/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java --- a/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java +++ b/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java @@ -63,6 +63,7 @@ import org.netbeans.api.project.FileOwnerQuery; import org.netbeans.api.project.Project; import org.netbeans.modules.j2ee.jpa.model.JPAAnnotations; +import org.netbeans.modules.j2ee.jpa.verification.CancelListener; import org.netbeans.modules.j2ee.jpa.verification.JPAClassRule; import org.netbeans.modules.j2ee.jpa.verification.JPAClassRule.ClassConstraints; import org.netbeans.modules.j2ee.jpa.verification.JPAProblemContext; @@ -80,7 +81,9 @@ * Verify content of @NamedQuery query * TODO: good to move warning to query level instead of class level */ -public class JPQLValidation extends JPAClassRule{ +public class JPQLValidation extends JPAClassRule implements CancelListener{ + + private ManagedTypeProvider mtp;//need to store as jpql validation may be too long and need to be cancelled if required /** Creates a new instance of NonFinalClass */ public JPQLValidation() { @@ -90,6 +93,8 @@ } @Override public ErrorDescription[] apply(TypeElement subject, ProblemContext ctx){ + JPAProblemContext jpaCtx = (JPAProblemContext)ctx; + jpaCtx.addCancelListener(this); Object modEl = ctx.getModelElement(); Entity entity = (Entity) (modEl instanceof Entity ? modEl : null); List first = Utilities.findAnnotations(subject, JPAAnnotations.NAMED_QUERY); @@ -130,7 +135,7 @@ JPQLQueryHelper helper = new JPQLQueryHelper(); Project project = FileOwnerQuery.getOwner(ctx.getFileObject()); List problems = new ArrayList(); - ManagedTypeProvider mtp = new ManagedTypeProvider(project, ((JPAProblemContext)ctx).getMetaData()); + mtp = new ManagedTypeProvider(project, jpaCtx.getMetaData()); for(int index=0;index0)problems.addAll(tmp); helper.dispose(); } + ErrorDescription[] ret = null; if (!ctx.isCancelled() && problems != null && problems.size()>0){ - ErrorDescription[] ret = new ErrorDescription[problems.size()]; + ret = new ErrorDescription[problems.size()]; for(int i=0;i managedTypes; private ITypeRepository typeRepository; private final EntityMappings mappings; + private boolean valid = true;//used to conrol long tasks, if not valid long tasks should be either terminated or goes short way public ManagedTypeProvider(Project project, EntityMappingsMetadata metaData) { this.project = project; @@ -124,7 +116,7 @@ @Override public ITypeRepository getTypeRepository() { if (typeRepository == null) { - typeRepository = new TypeRepository(project); + typeRepository = new TypeRepository(project, this); } return typeRepository; } @@ -141,6 +133,19 @@ initializeManagedTypes(); return Collections.unmodifiableCollection(managedTypes.values()); } + + public boolean isValid() { + return valid; + } + + /** + * make model invalid and it shoul case processing to stop, minimize etc. + * results with SPI may not be consider valid if provider isn't valid + */ + public void invalidate() { + valid = false; + //TODO: may have sense to clean stored data + } private void initializeManagedTypes() { if (managedTypes == null) { diff --git a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java --- a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java +++ b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java @@ -73,9 +73,12 @@ private final Map types; private PUDataObject dObj; private MetadataModelReadHelper> readHelper; + private final ManagedTypeProvider mtp; - TypeRepository(Project project){ + + TypeRepository(Project project, ManagedTypeProvider mtp) { this.project = project; + this.mtp = mtp; types = new HashMap(); } @@ -123,7 +126,7 @@ Sources sources=ProjectUtils.getSources(project); SourceGroup groups[]=sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA); types.put(fqn, new Type[]{null}); - if(groups != null && groups.length>0){ + if(mtp.isValid() && groups != null && groups.length>0){ SourceGroup firstGroup=groups[0]; FileObject fo=firstGroup.getRootFolder(); ClasspathInfo classpathInfo = ClasspathInfo.create(fo); @@ -132,8 +135,12 @@ javaSource.runModificationTask(new Task() { @Override public void run(WorkingCopy wc) throws Exception { - TypeElement te = wc.getElements().getTypeElement(fqn); - if(te!=null) types.put(fqn, new Type[]{new Type(TypeRepository.this, te)}); + if(mtp.isValid()) {//model will be filled with nulls after provider invalidation and with values only if valid provider + TypeElement te = wc.getElements().getTypeElement(fqn); + if(te!=null) { + types.put(fqn, new Type[]{new Type(TypeRepository.this, te)}); + } + } } }); } catch (IOException ex) { # HG changeset patch # User Sergey B. Petrov # Date 1344263683 -14400 # Node ID ac886697d0b8edafd2d69362b45c6ae9261c98dd # Parent 79352aac0a14629f566497e371c89d315f99866b #216053 optimize enum test, should drop number of getTypeElements even more diff --git a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java --- a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java +++ b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java @@ -86,7 +86,24 @@ public IType getEnumType(String fqn) { IType[] ret = types.get(fqn); if(ret == null){ - fillTypeElement(fqn); + //get main type + int lastPoint = fqn.lastIndexOf('.'); + String mainPart = lastPoint > 0 ? fqn.substring(0, lastPoint) : null; + if(mainPart != null){ + IType[] mainType = types.get(mainPart); + if(mainType == null){ + fillTypeElement(mainPart); + } + mainType = types.get(mainPart); + if(mainType[0] != null){ + fillTypeElement(fqn); + } else { + types.put(fqn, new Type[]{null}); + } + } else { + //shouldn't happens + fillTypeElement(fqn); + } ret = types.get(fqn); } return ret[0]; # HG changeset patch # User Sergey B. Petrov # Date 1344435513 -14400 # Node ID a14d1177500e120afc6fad6db505a7bbbb1b9ffc # Parent 5b64fdbbc16e938ded918afe61bc009e4c713532 #216053 minor cleanup diff --git a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/ManagedTypeProvider.java b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/ManagedTypeProvider.java --- a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/ManagedTypeProvider.java +++ b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/ManagedTypeProvider.java @@ -150,23 +150,6 @@ private void initializeManagedTypes() { if (managedTypes == null) { managedTypes = new HashMap(); - //TODO fill -// EntityClassScope entityClassScope = EntityClassScope.getEntityClassScope(project.getProjectDirectory()); -// MetadataModel model = entityClassScope.getEntityMappingsModel(true); -// MetadataModelReadHelper> readHelper = MetadataModelReadHelper.create(model, new MetadataModelAction>() { -// -// @Override -// public List run(EntityMappingsMetadata metadata) { -// return Arrays.asList(metadata.getRoot().getEntity()); -// } -// }); -// List entities = null; -// try { -// entities = readHelper.getResult(); -// } catch (ExecutionException ex) { -// Exceptions.printStackTrace(ex); -// } - //TODO: not only entities but mapped superclasses and embeddable? for (org.netbeans.modules.j2ee.persistence.api.metadata.orm.Entity persistentType : mappings.getEntity()) { # HG changeset patch # User Sergey B. Petrov # Date 1344517822 -14400 # Node ID ad57dfaae79ae9cc37e250fe94e1cf54a9a3068d # Parent a14d1177500e120afc6fad6db505a7bbbb1b9ffc #216053 don't need to call Elements.get.. even for entities now, replace "toString" with other option diff --git a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/Type.java b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/Type.java --- a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/Type.java +++ b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/Type.java @@ -238,7 +238,9 @@ TypeElement tmpEl = el; while(tmpEl != null){ - if(tmpEl.getQualifiedName().toString().equals(name)) return true; + if(tmpEl.getQualifiedName().contentEquals(name)) { + return true; + } else { TypeMirror supMirror = tmpEl.getSuperclass(); if (supMirror.getKind() == TypeKind.DECLARED) { diff --git a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java --- a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java +++ b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java @@ -47,6 +47,7 @@ import java.util.Map; import javax.lang.model.element.TypeElement; import org.eclipse.persistence.jpa.jpql.TypeHelper; +import org.eclipse.persistence.jpa.jpql.spi.IManagedType; import org.eclipse.persistence.jpa.jpql.spi.IType; import org.eclipse.persistence.jpa.jpql.spi.ITypeRepository; import org.netbeans.api.java.project.JavaProjectConstants; @@ -127,7 +128,16 @@ if(IType.UNRESOLVABLE_TYPE.equals(fqn)){ types.put(fqn, new Type[] {new Type(this, fqn)}); } else { - fillTypeElement(fqn); + //try to find in managed + int lastPnt = fqn.lastIndexOf('.'); + ManagedType mt = (ManagedType) (lastPnt > -1 ? mtp.getManagedType(fqn.substring(lastPnt+1)) : mtp.getManagedType(fqn)); + if(mt != null && mt.getPersistentObject() != null && mt.getPersistentObject().getTypeElement()!=null && mt.getPersistentObject().getTypeElement().getQualifiedName().contentEquals(fqn)) { + TypeElement te = mt.getPersistentObject().getTypeElement(); + types.put(fqn, new Type[]{new Type(TypeRepository.this, te)}); + } else { + // + fillTypeElement(fqn); + } } ret = types.get(fqn); } # HG changeset patch # User Sergey B. Petrov # Date 1344597417 -14400 # Node ID ba1cec2f2a36961d4bb5a63eb0ddc8752761598c # Parent 1e5cbdc99be6e6c981759d7b1365c15e5b0eb1b7 #216053 replace typeelement usage with persistentobject usage in some places diff --git a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/Type.java b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/Type.java --- a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/Type.java +++ b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/Type.java @@ -56,6 +56,7 @@ import org.eclipse.persistence.jpa.jpql.spi.IType; import org.eclipse.persistence.jpa.jpql.spi.ITypeDeclaration; import org.eclipse.persistence.jpa.jpql.spi.ITypeRepository; +import org.netbeans.modules.j2ee.metadata.model.api.support.annotation.PersistentObject; /** * @@ -64,6 +65,7 @@ public class Type implements IType{ private final Element element; + private PersistentObject po; private final ITypeRepository repository; private ITypeDeclaration tDeclaration; private final Class type; @@ -71,6 +73,13 @@ private String[] enumConstants; private String typeName; + public Type(ITypeRepository typeRepository, PersistentObject po) { + element = null; + this.po = po; + this.repository = typeRepository; + type = null; + } + public Type(ITypeRepository typeRepository, Element element){ this.element = element; this.repository = typeRepository; @@ -97,7 +106,9 @@ public Iterable constructors() { if(constructors == null){ constructors = new ArrayList(); - if(element != null){ + if(po!=null) { + collectConstructors(constructors, po.getTypeElement()); + } else if(element != null){ collectConstructors(constructors, element); } else if (type != null) { collectConstructors(constructors, type); @@ -124,9 +135,10 @@ @Override public String[] getEnumConstants() { if(enumConstants == null){ - if(element != null){ + Element elt = po != null ? po.getTypeElement() : element; + if(elt != null){ ArrayList constants = new ArrayList(); - for( Element el:element.getEnclosedElements() ){ + for( Element el:elt.getEnclosedElements() ){ if(el.getKind() == ElementKind.ENUM_CONSTANT){ constants.add(el.getSimpleName().toString()); } @@ -154,9 +166,10 @@ @Override public String getName() { if(typeName == null){ - if(element != null){ - if(element instanceof TypeElement) typeName = ((TypeElement) element).getQualifiedName().toString(); - else typeName = element.asType().toString(); + Element elt = po != null ? po.getTypeElement() : element; + if(elt != null){ + if(elt instanceof TypeElement) typeName = ((TypeElement) elt).getQualifiedName().toString(); + else typeName = elt.asType().toString(); } else if (type != null) { typeName = type.getName(); } @@ -174,17 +187,20 @@ @Override public boolean hasAnnotation(Class type) { - return element != null ? (element.getAnnotation(type) != null) : (type!=null && type.isAnnotationPresent(type)); + Element elt = po != null ? po.getTypeElement() : element; + return elt != null ? (elt.getAnnotation(type) != null) : (type!=null && type.isAnnotationPresent(type)); } @Override public boolean isAssignableTo(IType itype) { if(this == itype) return true; Type tp = (Type) itype; - if(element != null && tp.element !=null){ + Element elt1 = po != null ? po.getTypeElement() : element; + Element elt2 = tp.po != null ? tp.po.getTypeElement() : tp.element; + if(elt1 != null && elt2 !=null){ //interbal nb type String rootName = itype.getName(); - TypeElement tEl = (TypeElement) (element instanceof TypeElement ? element : null); + TypeElement tEl = (TypeElement) (elt1 instanceof TypeElement ? elt1 : null); return haveInHierarchy(tEl, rootName); } else if (type !=null && tp.type!=null) { //java type @@ -196,12 +212,13 @@ @Override public boolean isEnum() { - return (element instanceof TypeElement ? ((TypeElement)element).getKind() == ElementKind.ENUM : (type != null) && type.isEnum()); + Element elt = po != null ? po.getTypeElement() : element; + return (elt instanceof TypeElement ? ((TypeElement)elt).getKind() == ElementKind.ENUM : (type != null) && type.isEnum()); } @Override public boolean isResolvable() { - return type!=null || element!=null; + return type!=null || element!=null || po!=null; } @Override diff --git a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java --- a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java +++ b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java @@ -59,6 +59,8 @@ import org.netbeans.api.project.ProjectUtils; import org.netbeans.api.project.SourceGroup; import org.netbeans.api.project.Sources; +import org.netbeans.modules.j2ee.metadata.model.api.support.annotation.AnnotationModelHelper; +import org.netbeans.modules.j2ee.metadata.model.api.support.annotation.PersistentObject; import org.netbeans.modules.j2ee.persistence.api.metadata.orm.EntityMappingsMetadata; import org.netbeans.modules.j2ee.persistence.unit.PUDataObject; import org.netbeans.modules.j2ee.persistence.util.MetadataModelReadHelper; @@ -132,8 +134,7 @@ int lastPnt = fqn.lastIndexOf('.'); ManagedType mt = (ManagedType) (lastPnt > -1 ? mtp.getManagedType(fqn.substring(lastPnt+1)) : mtp.getManagedType(fqn)); if(mt != null && mt.getPersistentObject() != null && mt.getPersistentObject().getTypeElement()!=null && mt.getPersistentObject().getTypeElement().getQualifiedName().contentEquals(fqn)) { - TypeElement te = mt.getPersistentObject().getTypeElement(); - types.put(fqn, new Type[]{new Type(TypeRepository.this, te)}); + types.put(fqn, new Type[]{new Type(TypeRepository.this, mt.getPersistentObject())}); } else { // fillTypeElement(fqn); @@ -157,6 +158,7 @@ SourceGroup firstGroup=groups[0]; FileObject fo=firstGroup.getRootFolder(); ClasspathInfo classpathInfo = ClasspathInfo.create(fo); + final AnnotationModelHelper helper = AnnotationModelHelper.create(classpathInfo); JavaSource javaSource = JavaSource.create(classpathInfo); try { javaSource.runModificationTask(new Task() { @@ -165,7 +167,8 @@ if(mtp.isValid()) {//model will be filled with nulls after provider invalidation and with values only if valid provider TypeElement te = wc.getElements().getTypeElement(fqn); if(te!=null) { - types.put(fqn, new Type[]{new Type(TypeRepository.this, te)}); + PersistentObject po = new PersistentObject(helper, te) {}; + types.put(fqn, new Type[]{new Type(TypeRepository.this, po)}); } } } # HG changeset patch # User Sergey B. Petrov # Date 1344609251 -14400 # Node ID c099d7c90c4a5754f464f84fa2e94235c660e406 # Parent ad24f8c84033e3f8adfe5716f9cf83c8e4b54265 #216053 use one annotation helper diff --git a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/ManagedTypeProvider.java b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/ManagedTypeProvider.java --- a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/ManagedTypeProvider.java +++ b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/ManagedTypeProvider.java @@ -95,7 +95,7 @@ public IManagedType getManagedType(IType itype) { initializeManagedTypes(); for (IManagedType mt : managedTypes.values()) { - if (mt.getType().equals(itype)) { + if (isValid() && mt.getType().equals(itype)) { return mt; } } diff --git a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/Type.java b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/Type.java --- a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/Type.java +++ b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/Type.java @@ -41,10 +41,12 @@ */ package org.netbeans.modules.j2ee.persistence.spi.jpql; +import java.io.IOException; import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.concurrent.Callable; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.ExecutableElement; @@ -56,7 +58,9 @@ import org.eclipse.persistence.jpa.jpql.spi.IType; import org.eclipse.persistence.jpa.jpql.spi.ITypeDeclaration; import org.eclipse.persistence.jpa.jpql.spi.ITypeRepository; +import org.netbeans.modules.j2ee.metadata.model.api.support.annotation.AnnotationModelHelper; import org.netbeans.modules.j2ee.metadata.model.api.support.annotation.PersistentObject; +import org.openide.util.Exceptions; /** * @@ -78,6 +82,7 @@ this.po = po; this.repository = typeRepository; type = null; + typeName = po.getTypeElementHandle().getQualifiedName(); } public Type(ITypeRepository typeRepository, Element element){ @@ -107,7 +112,7 @@ if(constructors == null){ constructors = new ArrayList(); if(po!=null) { - collectConstructors(constructors, po.getTypeElement()); + collectConstructors(constructors, getTypeElement(po)); } else if(element != null){ collectConstructors(constructors, element); } else if (type != null) { @@ -135,7 +140,7 @@ @Override public String[] getEnumConstants() { if(enumConstants == null){ - Element elt = po != null ? po.getTypeElement() : element; + Element elt = po != null ? getTypeElement(po) : element; if(elt != null){ ArrayList constants = new ArrayList(); for( Element el:elt.getEnclosedElements() ){ @@ -166,7 +171,7 @@ @Override public String getName() { if(typeName == null){ - Element elt = po != null ? po.getTypeElement() : element; + Element elt = po != null ? getTypeElement(po) : element; if(elt != null){ if(elt instanceof TypeElement) typeName = ((TypeElement) elt).getQualifiedName().toString(); else typeName = elt.asType().toString(); @@ -187,7 +192,7 @@ @Override public boolean hasAnnotation(Class type) { - Element elt = po != null ? po.getTypeElement() : element; + Element elt = po != null ? getTypeElement(po) : element; return elt != null ? (elt.getAnnotation(type) != null) : (type!=null && type.isAnnotationPresent(type)); } @@ -195,8 +200,8 @@ public boolean isAssignableTo(IType itype) { if(this == itype) return true; Type tp = (Type) itype; - Element elt1 = po != null ? po.getTypeElement() : element; - Element elt2 = tp.po != null ? tp.po.getTypeElement() : tp.element; + Element elt1 = po != null ? getTypeElement(po) : element; + Element elt2 = tp.po != null ? getTypeElement(tp.po) : tp.element; if(elt1 != null && elt2 !=null){ //interbal nb type String rootName = itype.getName(); @@ -212,7 +217,7 @@ @Override public boolean isEnum() { - Element elt = po != null ? po.getTypeElement() : element; + Element elt = po != null ? getTypeElement(po) : element; return (elt instanceof TypeElement ? ((TypeElement)elt).getKind() == ElementKind.ENUM : (type != null) && type.isEnum()); } @@ -284,4 +289,25 @@ ITypeRepository getTypeRepository() { return repository; } + + private TypeElement getTypeElement(final PersistentObject po){ + if(true)return po.getTypeElement(); + TypeElement te = null; + TypeRepository tr = (TypeRepository) this.repository; + final AnnotationModelHelper amh = tr.getAnnotationModelHelper(); + if(amh!=null) { + try { + te = amh.runJavaSourceTask(new Callable() { + + @Override + public TypeElement call() throws Exception { + return po.getTypeElement(); + } + }); + } catch (IOException ex) { + + } + } + return te; + } } diff --git a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java --- a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java +++ b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java @@ -45,16 +45,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.Callable; import javax.lang.model.element.TypeElement; import org.eclipse.persistence.jpa.jpql.TypeHelper; -import org.eclipse.persistence.jpa.jpql.spi.IManagedType; import org.eclipse.persistence.jpa.jpql.spi.IType; import org.eclipse.persistence.jpa.jpql.spi.ITypeRepository; import org.netbeans.api.java.project.JavaProjectConstants; import org.netbeans.api.java.source.ClasspathInfo; -import org.netbeans.api.java.source.JavaSource; -import org.netbeans.api.java.source.Task; -import org.netbeans.api.java.source.WorkingCopy; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectUtils; import org.netbeans.api.project.SourceGroup; @@ -62,10 +59,8 @@ import org.netbeans.modules.j2ee.metadata.model.api.support.annotation.AnnotationModelHelper; import org.netbeans.modules.j2ee.metadata.model.api.support.annotation.PersistentObject; import org.netbeans.modules.j2ee.persistence.api.metadata.orm.EntityMappingsMetadata; -import org.netbeans.modules.j2ee.persistence.unit.PUDataObject; import org.netbeans.modules.j2ee.persistence.util.MetadataModelReadHelper; import org.openide.filesystems.FileObject; -import org.openide.util.Exceptions; /** * @@ -74,9 +69,9 @@ public class TypeRepository implements ITypeRepository { private final Project project; private final Map types; - private PUDataObject dObj; private MetadataModelReadHelper> readHelper; private final ManagedTypeProvider mtp; + private AnnotationModelHelper amh; TypeRepository(Project project, ManagedTypeProvider mtp) { @@ -151,30 +146,28 @@ } private void fillTypeElement(final String fqn){ - Sources sources=ProjectUtils.getSources(project); - SourceGroup groups[]=sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA); types.put(fqn, new Type[]{null}); - if(mtp.isValid() && groups != null && groups.length>0){ - SourceGroup firstGroup=groups[0]; - FileObject fo=firstGroup.getRootFolder(); - ClasspathInfo classpathInfo = ClasspathInfo.create(fo); - final AnnotationModelHelper helper = AnnotationModelHelper.create(classpathInfo); - JavaSource javaSource = JavaSource.create(classpathInfo); - try { - javaSource.runModificationTask(new Task() { - @Override - public void run(WorkingCopy wc) throws Exception { - if(mtp.isValid()) {//model will be filled with nulls after provider invalidation and with values only if valid provider - TypeElement te = wc.getElements().getTypeElement(fqn); - if(te!=null) { - PersistentObject po = new PersistentObject(helper, te) {}; - types.put(fqn, new Type[]{new Type(TypeRepository.this, po)}); - } + if(mtp.isValid()){ + getAnnotationModelHelper(); + if(amh != null && mtp.isValid()) { + try { + amh.runJavaSourceTask(new Callable() { + + @Override + public Void call() throws Exception { + if(mtp.isValid()) {//model will be filled with nulls after provider invalidation and with values only if valid provider + TypeElement te = amh.getCompilationController().getElements().getTypeElement(fqn); + if(te!=null) { + PersistentObject po = new PersistentObject(amh, te) {}; + types.put(fqn, new Type[]{new Type(TypeRepository.this, po)}); + } + } + return null; } - } - }); - } catch (IOException ex) { - Exceptions.printStackTrace(ex); + }); + } catch (IOException ex) { + //TODO: any logging? + } } } } @@ -182,4 +175,17 @@ types.put(type.getName(), new Type[]{new Type(TypeRepository.this, type)}); } + AnnotationModelHelper getAnnotationModelHelper() { + if(amh == null) { + Sources sources=ProjectUtils.getSources(project); + SourceGroup groups[]=sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA); + if(groups != null && groups.length>0){ + SourceGroup firstGroup=groups[0]; + FileObject fo=firstGroup.getRootFolder(); + ClasspathInfo classpathInfo = ClasspathInfo.create(fo); + amh = AnnotationModelHelper.create(classpathInfo); + } + } + return amh; + } } # HG changeset patch # User Sergey B. Petrov # Date 1344862363 -14400 # Node ID 42c4a850f305ce05711b4c5b1e61d12d6f01741e # Parent ff6eb73460d146897ccda3134b369e8bdbaf911b #216053 avoid call to getTypeElement for invalid model as it may be out of proper thread. diff --git a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/ManagedType.java b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/ManagedType.java --- a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/ManagedType.java +++ b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/ManagedType.java @@ -90,7 +90,9 @@ @Override public IType getType() { if (type == null) { + if(((ManagedTypeProvider)provider).isValid()){ type = provider.getTypeRepository().getType(element.getTypeElement().getQualifiedName().toString()); + } } return type; } diff --git a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/Type.java b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/Type.java --- a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/Type.java +++ b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/Type.java @@ -291,23 +291,10 @@ } private TypeElement getTypeElement(final PersistentObject po){ - if(true)return po.getTypeElement(); - TypeElement te = null; - TypeRepository tr = (TypeRepository) this.repository; - final AnnotationModelHelper amh = tr.getAnnotationModelHelper(); - if(amh!=null) { - try { - te = amh.runJavaSourceTask(new Callable() { - - @Override - public TypeElement call() throws Exception { - return po.getTypeElement(); - } - }); - } catch (IOException ex) { - - } - } - return te; + if(((TypeRepository) repository).isValid()){ + return po.getTypeElement(); + } else { + return null; + } } } diff --git a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java --- a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java +++ b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java @@ -121,7 +121,7 @@ @Override public IType getType(String fqn) { IType[] ret = types.get(fqn); - if(ret == null){ + if(ret == null && isValid()){ if(IType.UNRESOLVABLE_TYPE.equals(fqn)){ types.put(fqn, new Type[] {new Type(this, fqn)}); } else { @@ -147,15 +147,15 @@ private void fillTypeElement(final String fqn){ types.put(fqn, new Type[]{null}); - if(mtp.isValid()){ + if(isValid()){ getAnnotationModelHelper(); - if(amh != null && mtp.isValid()) { + if(amh != null && isValid()) { try { amh.runJavaSourceTask(new Callable() { @Override public Void call() throws Exception { - if(mtp.isValid()) {//model will be filled with nulls after provider invalidation and with values only if valid provider + if(isValid()) {//model will be filled with nulls after provider invalidation and with values only if valid provider TypeElement te = amh.getCompilationController().getElements().getTypeElement(fqn); if(te!=null) { PersistentObject po = new PersistentObject(amh, te) {}; @@ -188,4 +188,8 @@ } return amh; } + + boolean isValid(){ + return mtp.isValid(); + } } # HG changeset patch # User Sergey B. Petrov # Date 1344959783 -14400 # Node ID 2cc39b8de892f9a5b74b0cb1dd255d50b2be6d91 # Parent 6cba5e8b5e196e0a25fbbec5519cde078018fe99 #216053 - reuse java model from top of cc/validation instead of new javasource creation, more rubust enum test for long cases like a.b.c.d diff --git a/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java b/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java --- a/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java +++ b/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java @@ -84,7 +84,7 @@ public class JPQLValidation extends JPAClassRule implements CancelListener{ private ManagedTypeProvider mtp;//need to store as jpql validation may be too long and need to be cancelled if required - + private JPQLQueryHelper helper; /** Creates a new instance of NonFinalClass */ public JPQLValidation() { setClassContraints(Arrays.asList(ClassConstraints.ENTITY, @@ -132,10 +132,10 @@ } } } - JPQLQueryHelper helper = new JPQLQueryHelper(); + helper = new JPQLQueryHelper(); Project project = FileOwnerQuery.getOwner(ctx.getFileObject()); List problems = new ArrayList(); - mtp = new ManagedTypeProvider(project, jpaCtx.getMetaData()); + mtp = new ManagedTypeProvider(project, jpaCtx.getMetaData(), jpaCtx.getCompilationInfo().getElements()); for(int index=0;index types; + private final Map packages; private MetadataModelReadHelper> readHelper; private final ManagedTypeProvider mtp; - private AnnotationModelHelper amh; + private final Elements elements; - TypeRepository(Project project, ManagedTypeProvider mtp) { + TypeRepository(Project project, ManagedTypeProvider mtp, Elements elements) { this.project = project; this.mtp = mtp; + this.elements = elements; types = new HashMap(); + packages = new HashMap(); } @Override @@ -90,7 +84,30 @@ if(mainPart != null){ IType[] mainType = types.get(mainPart); if(mainType == null){ - fillTypeElement(mainPart); + //first check packages + int mainFirstPoint = mainPart.indexOf('.'); + int mainLastPoint = mainPart.lastIndexOf('.'); + + if(mainFirstPoint != mainLastPoint && mainFirstPoint>-1){ + //we have at least 2 points and at least one for package (we may have nested enums) + for(int packagePartIndex = mainFirstPoint;packagePartIndex-1;packagePartIndex = mainPart.indexOf('.', packagePartIndex+1)){ + String packageStr = mainPart.substring(0,packagePartIndex); + Boolean exist = packages.get(packageStr); + if(exist == null){ + packages.put(packageStr, elements.getPackageElement(packageStr)!=null); + exist = packages.get(packageStr); + } + if(Boolean.FALSE.equals(exist)){ + mainType = new Type[]{null}; + types.put(mainPart, mainType); + break; + } + } + } + // + if(mainType == null){ + fillTypeElement(mainPart); + } } mainType = types.get(mainPart); if(mainType[0] != null){ @@ -137,7 +154,7 @@ } ret = types.get(fqn); } - return ret[0]; + return ret!=null ? ret[0] : null; } @Override @@ -148,25 +165,10 @@ private void fillTypeElement(final String fqn){ types.put(fqn, new Type[]{null}); if(isValid()){ - getAnnotationModelHelper(); - if(amh != null && isValid()) { - try { - amh.runJavaSourceTask(new Callable() { - - @Override - public Void call() throws Exception { - if(isValid()) {//model will be filled with nulls after provider invalidation and with values only if valid provider - TypeElement te = amh.getCompilationController().getElements().getTypeElement(fqn); - if(te!=null) { - PersistentObject po = new PersistentObject(amh, te) {}; - types.put(fqn, new Type[]{new Type(TypeRepository.this, po)}); - } - } - return null; - } - }); - } catch (IOException ex) { - //TODO: any logging? + if(isValid()) { + TypeElement te = elements.getTypeElement(fqn); + if(te!=null) { + types.put(fqn, new Type[]{new Type(TypeRepository.this, te)}); } } } @@ -174,22 +176,13 @@ private void fillTypeElement(Class type){ types.put(type.getName(), new Type[]{new Type(TypeRepository.this, type)}); } - - AnnotationModelHelper getAnnotationModelHelper() { - if(amh == null) { - Sources sources=ProjectUtils.getSources(project); - SourceGroup groups[]=sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA); - if(groups != null && groups.length>0){ - SourceGroup firstGroup=groups[0]; - FileObject fo=firstGroup.getRootFolder(); - ClasspathInfo classpathInfo = ClasspathInfo.create(fo); - amh = AnnotationModelHelper.create(classpathInfo); - } - } - return amh; - } + boolean isValid(){ return mtp.isValid(); } + + void invalidate() { + + } } # HG changeset patch # User Sergey B. Petrov # Date 1345111731 -14400 # Node ID ce30917740cf49be59bdbb972e27505cd3666319 # Parent 800a91c700a90a6b98a05a370dfaeb300584d36f #216053, #216956 check null diff --git a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/ManagedTypeProvider.java b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/ManagedTypeProvider.java --- a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/ManagedTypeProvider.java +++ b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/ManagedTypeProvider.java @@ -149,7 +149,10 @@ public void invalidate() { valid = false; //TODO: may have sense to clean stored data - ((TypeRepository)typeRepository).invalidate(); + if(typeRepository != null) { + ((TypeRepository)typeRepository).invalidate(); + typeRepository = null; + } } private void initializeManagedTypes() { # HG changeset patch # User Sergey B. Petrov # Date 1345202895 -14400 # Node ID 5098ce51a4ac857c73d901a419057461638523b4 # Parent 56a3552b174947c48008a1e1e4d1c4224a9eab8f #216053, #216827 don't need to reparse annotation mirors as model is already created diff --git a/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java b/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java --- a/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java +++ b/j2ee.jpa.verification/src/org/netbeans/modules/j2ee/jpa/verification/rules/entity/JPQLValidation.java @@ -41,7 +41,6 @@ * Version 2 license, then the option applies only if the new code is * made subject to such option by the copyright holder. */ - package org.netbeans.modules.j2ee.jpa.verification.rules.entity; import java.util.ArrayList; @@ -49,27 +48,21 @@ import java.util.List; import java.util.ListResourceBundle; import java.util.Locale; -import java.util.Map; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.logging.Level; -import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.AnnotationValue; -import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import org.eclipse.persistence.jpa.internal.jpql.JPQLQueryProblemResourceBundle; import org.eclipse.persistence.jpa.jpql.JPQLQueryHelper; import org.eclipse.persistence.jpa.jpql.JPQLQueryProblem; import org.netbeans.api.project.FileOwnerQuery; import org.netbeans.api.project.Project; -import org.netbeans.modules.j2ee.jpa.model.JPAAnnotations; import org.netbeans.modules.j2ee.jpa.verification.CancelListener; import org.netbeans.modules.j2ee.jpa.verification.JPAClassRule; import org.netbeans.modules.j2ee.jpa.verification.JPAClassRule.ClassConstraints; import org.netbeans.modules.j2ee.jpa.verification.JPAProblemContext; import org.netbeans.modules.j2ee.jpa.verification.JPAProblemFinder; import org.netbeans.modules.j2ee.jpa.verification.common.ProblemContext; -import org.netbeans.modules.j2ee.jpa.verification.common.Utilities; import org.netbeans.modules.j2ee.persistence.api.metadata.orm.Entity; import org.netbeans.modules.j2ee.persistence.api.metadata.orm.NamedQuery; import org.netbeans.modules.j2ee.persistence.spi.jpql.ManagedTypeProvider; @@ -78,102 +71,69 @@ import org.netbeans.spi.editor.hints.Severity; /** - * Verify content of @NamedQuery query - * TODO: good to move warning to query level instead of class level + * Verify content of + * + * @NamedQuery query TODO: good to move warning to query level instead of class + * level */ -public class JPQLValidation extends JPAClassRule implements CancelListener{ - +public class JPQLValidation extends JPAClassRule implements CancelListener { + private ManagedTypeProvider mtp;//need to store as jpql validation may be too long and need to be cancelled if required private JPQLQueryHelper helper; - /** Creates a new instance of NonFinalClass */ + + /** + * Creates a new instance of NonFinalClass + */ public JPQLValidation() { setClassContraints(Arrays.asList(ClassConstraints.ENTITY, ClassConstraints.EMBEDDABLE, ClassConstraints.MAPPED_SUPERCLASS)); } - - @Override public ErrorDescription[] apply(TypeElement subject, ProblemContext ctx){ - JPAProblemContext jpaCtx = (JPAProblemContext)ctx; + + @Override + public ErrorDescription[] apply(TypeElement subject, ProblemContext ctx) { + JPAProblemContext jpaCtx = (JPAProblemContext) ctx; jpaCtx.addCancelListener(this); Object modEl = ctx.getModelElement(); Entity entity = (Entity) (modEl instanceof Entity ? modEl : null); - List first = Utilities.findAnnotations(subject, JPAAnnotations.NAMED_QUERY); - ArrayList values = new ArrayList(); - ArrayList names = new ArrayList(); - if(first == null || first.size()==0){ - AnnotationMirror qs = Utilities.findAnnotation(subject, JPAAnnotations.NAMED_QUERIES); - if(qs != null){ - Map maps = qs.getElementValues(); - for(AnnotationValue vl:maps.values()){ - List lst = (List) vl.getValue(); - for(Object val:lst){ - if(val instanceof AnnotationMirror){ - AnnotationMirror am = (AnnotationMirror) val; - if(JPAAnnotations.NAMED_QUERY.equals(am.getAnnotationType().toString())){ - AnnotationValue qAttrValue = Utilities.getAnnotationAttrValue(am, "query"); - AnnotationValue nmAttrValue = Utilities.getAnnotationAttrValue(am, "name"); - if(qAttrValue != null){ - values.add(qAttrValue.getValue().toString()); - names.add(nmAttrValue == null ? "" : nmAttrValue.getValue().toString()); - } - } - } - } - } - } - } - else { - for(AnnotationMirror mr:first){ - AnnotationValue qAttrValue = Utilities.getAnnotationAttrValue(mr, "query"); - AnnotationValue nmAttrValue = Utilities.getAnnotationAttrValue(mr, "name"); - if(qAttrValue != null){ - values.add(qAttrValue.getValue().toString()); - names.add(nmAttrValue == null ? "" : nmAttrValue.getValue().toString()); - } - } - } helper = new JPQLQueryHelper(); Project project = FileOwnerQuery.getOwner(ctx.getFileObject()); List problems = new ArrayList(); mtp = new ManagedTypeProvider(project, jpaCtx.getMetaData(), jpaCtx.getCompilationInfo().getElements()); - for(int index=0;index tmp = null; + try { + tmp = helper.validate(); + } catch (UnsupportedOperationException ex) { + JPAProblemFinder.LOG.log(Level.INFO, "Unsupported jpql validation case: " + ex.getMessage(), ex); + } catch (NullPointerException ex) { + JPAProblemFinder.LOG.log(Level.INFO, "NPE in jpql validation: " + ex.getMessage(), ex); + } + if (tmp != null && tmp.size() > 0) { + problems.addAll(tmp); + } + helper.dispose(); } - helper.setQuery(new Query(nq, value, mtp)); - List tmp = null; - try{ - tmp = helper.validate(); - } catch (UnsupportedOperationException ex) { - JPAProblemFinder.LOG.log(Level.INFO, "Unsupported jpql validation case: " + ex.getMessage(), ex); - }catch (NullPointerException ex) { - JPAProblemFinder.LOG.log(Level.INFO, "NPE in jpql validation: " + ex.getMessage(), ex); - } - if(tmp!=null && tmp.size()>0)problems.addAll(tmp); - helper.dispose(); } ErrorDescription[] ret = null; - if (!ctx.isCancelled() && problems != null && problems.size()>0){ + if (!ctx.isCancelled() && problems != null && problems.size() > 0) { ret = new ErrorDescription[problems.size()]; - for(int i=0;i # Date 1345209104 -14400 # Node ID 402a62a7867f85576422e82b747175a5009014bd # Parent 0d4a0856bed8f4267626a4202b6a0268eae460d3 #216053, #216827 first entity open create entities model, avoid duplicate parsing should improve perfomance (likely a bit only) diff --git a/j2ee.persistenceapi/src/org/netbeans/modules/j2ee/persistenceapi/metadata/orm/annotation/EntityImpl.java b/j2ee.persistenceapi/src/org/netbeans/modules/j2ee/persistenceapi/metadata/orm/annotation/EntityImpl.java --- a/j2ee.persistenceapi/src/org/netbeans/modules/j2ee/persistenceapi/metadata/orm/annotation/EntityImpl.java +++ b/j2ee.persistenceapi/src/org/netbeans/modules/j2ee/persistenceapi/metadata/orm/annotation/EntityImpl.java @@ -90,7 +90,7 @@ AnnotationMirror entityAnn = annByType.get("javax.persistence.Entity"); // NOI18N if (entityAnn == null) { return false; - }annByType.get("javax.persistence.NamedQueries"); + } AnnotationParser parser = AnnotationParser.create(helper); parser.expectString("name", AnnotationParser.defaultValue(typeElement.getSimpleName().toString())); // NOI18N ParseResult parseResult = parser.parse(entityAnn); // NOI18N @@ -101,10 +101,10 @@ // XXX locale? table = new TableImpl(helper, annByType.get("javax.persistence.Table"), name.toUpperCase()); // NOI18N //fill named queries - AnnotationMirror nqsAnn = annByType.get("javax.persistence.NamedQueries"); + AnnotationMirror nqsAnn = annByType.get("javax.persistence.NamedQueries");// NOI18N ArrayList nqAnn = null; if(nqsAnn == null){ - nqsAnn = annByType.get("javax.persistence.NamedQuery"); + nqsAnn = annByType.get("javax.persistence.NamedQuery");// NOI18N if(nqsAnn != null){ nqAnn = new ArrayList(); nqAnn.add(nqsAnn); @@ -117,9 +117,8 @@ for(Object val:lst){ if(val instanceof AnnotationMirror){ AnnotationMirror am = (AnnotationMirror) val; - if("javax.persistence.NamedQuery".equals(am.getAnnotationType().toString())){ + if("javax.persistence.NamedQuery".equals(am.getAnnotationType().toString())){//NOI18N nqAnn.add(am); - //values.add(Utilities.getAnnotationAttrValue(am, "query").toString()); } } } @@ -133,7 +132,6 @@ for(AnnotationMirror am:nqAnn){ parseResult = parser.parse(am); // NOI18N String nm = parseResult.get("name", String.class); // NOI18N - parseResult = parser.parse(am); // NOI18N String qr = parseResult.get("query", String.class); // NOI18N this.addNamedQuery(new NamedQueryImpl(nm, qr)); } # HG changeset patch # User Sergey B. Petrov # Date 1345482448 -14400 # Node ID e515274a3c8cf5da86307b1dc673aca044208a4a # Parent 8c74ae76ee6d024625bb3bcb637875274ea68bd8 #216053, #216827 do not support enums in default package, it shoud be exremely rare case even if some providers may support and resolve it. diff --git a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java --- a/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java +++ b/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/jpql/TypeRepository.java @@ -103,6 +103,9 @@ break; } } + } else if(mainFirstPoint == -1) { + mainType = new Type[]{null}; + types.put(mainPart, mainType); } // if(mainType == null){ # HG changeset patch # User Jan Becicka # Date 1346075197 -7200 # Branch easel_css_72 # Node ID d405ea772fe6d891d349f053a0600ec47e8ba0aa # Parent 666e5a2ebaa8af1b33dfd3ff7c58d5e16f4c01d0 # Parent 2ecc406cdbe443bbc7f2fc5e4203368888fb20e2 Manual merge diff --git a/html.navigator/src/org/netbeans/modules/html/navigator/HtmlNavigatorPanelUI.java b/html.navigator/src/org/netbeans/modules/html/navigator/HtmlNavigatorPanelUI.java --- a/html.navigator/src/org/netbeans/modules/html/navigator/HtmlNavigatorPanelUI.java +++ b/html.navigator/src/org/netbeans/modules/html/navigator/HtmlNavigatorPanelUI.java @@ -232,6 +232,7 @@ //no need to explicitly call pageModelDocumentChanged() as the //PageModel fill fire change event } + inspectedFileObject = getInspectedFileFromPageModel(); } @@ -349,6 +350,8 @@ } private void cacheDomToNb(Node root) { + if (root==null) + return; if (root instanceof HtmlElementNode) { Node res = ((HtmlElementNode) root).getDOMNode(); if (res!=null) { @@ -363,9 +366,11 @@ private void refreshNodeDOMStatus() { LOGGER.fine("refreshNodeDOMStatus()"); HtmlElementNode root = getRootNode(); + boolean refresh = true; if (root != null) { //if we are inspecting the current file, the source changes propagates just after the fresh DOM is received if(sourceDescription != null) { + refresh = sourceDescription.getFileObject().equals(inspectedFileObject); root.setDescription(sourceDescription); sourceDescription = null; setSynchronizationState(true); @@ -382,7 +387,11 @@ } }; domDescription.addChangeListener(WeakListeners.change(changeListener, domDescription)); - root.setDescription(domDescription); + if (refresh) { + root.setDescription(domDescription); + } else { + root.setDescription(WebKitNodeDescription.empty(WebKitNodeDescription.DOM)); + } LOGGER.fine("root.refreshDOMStatus() called"); } @@ -452,10 +461,6 @@ if (fo==null) return; - if (inspectedFileObject == fo) { - refreshDOM(); - return; - } if (!"text/html".equals(FileUtil.getMIMEType(fo))) { return; @@ -465,14 +470,16 @@ if (source == null) { return; } - showWaitNode(); + + //TODO: uncomment when working again + //showWaitNode(); try { ParserManager.parse(Collections.singleton(source), new UserTask() { @Override public void run(ResultIterator resultIterator) throws Exception { setParserResult((HtmlParserResult)resultIterator.getParserResult()); - inspectedFileObject = fo; + //inspectedFileObject = getInspectedFileFromPageModel(); refreshDOM(); } }); @@ -793,10 +800,13 @@ if (node instanceof HtmlElementNode) { final Node domNode = ((HtmlElementNode) node).getDOMNode(); if (domNode!=null) { - node = domNode; + highlight = Arrays.asList(domNode); + } else { + highlight = Collections.EMPTY_LIST; } + } else { + highlight = Arrays.asList(node); } - highlight = Arrays.asList(node); } else { highlight = Collections.EMPTY_LIST; }