/******************************************************************************* * Copyright (c) 2007 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.seam.internal.core; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import org.jboss.tools.common.model.project.ext.event.Change; import org.jboss.tools.common.text.ITextSourceReference; import org.jboss.tools.seam.core.BijectedAttributeType; import org.jboss.tools.seam.core.IBijectedAttribute; import org.jboss.tools.seam.core.IRole; import org.jboss.tools.seam.core.ISeamComponent; import org.jboss.tools.seam.core.ISeamComponentDeclaration; import org.jboss.tools.seam.core.ISeamComponentMethod; import org.jboss.tools.seam.core.ISeamElement; import org.jboss.tools.seam.core.ISeamJavaComponentDeclaration; import org.jboss.tools.seam.core.ISeamPackage; import org.jboss.tools.seam.core.ISeamPropertiesDeclaration; import org.jboss.tools.seam.core.ISeamProperty; import org.jboss.tools.seam.core.ISeamXmlComponentDeclaration; import org.jboss.tools.seam.core.ScopeType; import org.jboss.tools.seam.core.SeamComponentMethodType; /** * @author Viacheslav Kabanovich */ public class SeamComponent extends SeamObject implements ISeamComponent { protected String name = null; Set<ISeamComponentDeclaration> allDeclarations = new HashSet<ISeamComponentDeclaration>(); Set<ISeamJavaComponentDeclaration> javaDeclarations = new HashSet<ISeamJavaComponentDeclaration>(); Set<ISeamXmlComponentDeclaration> xmlDeclarations = new HashSet<ISeamXmlComponentDeclaration>(); Set<ISeamPropertiesDeclaration> propertyDeclarations = new HashSet<ISeamPropertiesDeclaration>(); SeamPackage projectPackage = null; SeamPackage scopePackage = null; public SeamComponent () { } /** * @see org.jboss.tools.seam.core.ISeamComponent#getBijectedAttributes() */ public Set<IBijectedAttribute> getBijectedAttributes() { ISeamJavaComponentDeclaration javaDeclaration = getJavaDeclaration(); return (javaDeclaration == null) ? null : javaDeclaration.getBijectedAttributes(); } /** * @see org.jboss.tools.seam.core.ISeamComponent#getBijectedAttributesByName(java.lang.String) */ public Set<IBijectedAttribute> getBijectedAttributesByName(String name) { ISeamJavaComponentDeclaration javaDeclaration = getJavaDeclaration(); return (javaDeclaration == null) ? null : javaDeclaration.getBijectedAttributesByName(name); } /** * @see org.jboss.tools.seam.core.ISeamComponent#getBijectedAttributesByType(org.jboss.tools.seam.core.BijectedAttributeType) */ public Set<IBijectedAttribute> getBijectedAttributesByType( BijectedAttributeType type) { ISeamJavaComponentDeclaration javaDeclaration = getJavaDeclaration(); return (javaDeclaration == null) ? null : javaDeclaration.getBijectedAttributesByType(type); } /** * @see org.jboss.tools.seam.core.ISeamComponent#getClassName() */ public String getClassName() { ISeamJavaComponentDeclaration javaDeclaration = getJavaDeclaration(); if(javaDeclaration != null) return javaDeclaration.getClassName(); Set<ISeamXmlComponentDeclaration> xml = getXmlDeclarations(); for(ISeamXmlComponentDeclaration d: xml) { if(d.getClassName() != null && d.getClassName().length() > 0) return d.getClassName(); } return null; } public ITextSourceReference getLocationFor(String path) { ISeamJavaComponentDeclaration javaDeclaration = getJavaDeclaration(); if(javaDeclaration != null) return javaDeclaration.getLocationFor(path); Set<ISeamXmlComponentDeclaration> xml = getXmlDeclarations(); for(ISeamXmlComponentDeclaration d: xml) { if(d.getLocationFor(path) != null) { return d.getLocationFor(path); } } return null; } /** * */ public int getPrecedence() { Set<ISeamXmlComponentDeclaration> xml = getXmlDeclarations(); for(ISeamXmlComponentDeclaration d: xml) { String s = d.getPrecedence(); if(s == null || s.length() == 0) continue; try { return Integer.valueOf(s); } catch (NumberFormatException e) { //ignore here } } if(xml.size() > 0) return 20; ISeamJavaComponentDeclaration javaDeclaration = getJavaDeclaration(); if(javaDeclaration != null) return javaDeclaration.getPrecedence(); return 20; } static Set<ISeamComponentMethod> EMPTY = new HashSet<ISeamComponentMethod>(); /** * @see org.jboss.tools.seam.core.ISeamComponent#getMethods() */ public Set<ISeamComponentMethod> getMethods() { ISeamJavaComponentDeclaration javaDeclaration = getJavaDeclaration(); return (javaDeclaration == null) ? EMPTY : javaDeclaration.getMethods(); } /** * @see org.jboss.tools.seam.core.ISeamComponent#getMethodsByType(org.jboss.tools.seam.core.SeamComponentMethodType) */ public Set<ISeamComponentMethod> getMethodsByType( SeamComponentMethodType type) { ISeamJavaComponentDeclaration javaDeclaration = getJavaDeclaration(); return (javaDeclaration == null) ? null : javaDeclaration.getMethodsByType(type); } /** * @see org.jboss.tools.seam.core.ISeamComponent#getRoles() */ public Set<IRole> getRoles() { ISeamJavaComponentDeclaration javaDeclaration = getJavaDeclaration(); return (javaDeclaration == null) ? null : javaDeclaration.getRoles(); } /** * @see org.jboss.tools.seam.core.ISeamComponent#isEntity() */ public boolean isEntity() { ISeamJavaComponentDeclaration javaDeclaration = getJavaDeclaration(); return (javaDeclaration != null) && javaDeclaration.isEntity(); } /** * @see org.jboss.tools.seam.core.ISeamComponent#isStateful() */ public boolean isStateful() { ISeamJavaComponentDeclaration javaDeclaration = getJavaDeclaration(); return (javaDeclaration != null) && javaDeclaration.isStateful(); } /** * @see org.jboss.tools.seam.core.ISeamComponent#isStateless() */ public boolean isStateless() { ISeamJavaComponentDeclaration javaDeclaration = getJavaDeclaration(); return (javaDeclaration != null) && javaDeclaration.isStateless(); } /** * @see org.jboss.tools.seam.core.ISeamContextVariable#getName() */ public String getName() { return name; } /** * @see org.jboss.tools.seam.core.ISeamContextVariable#getScope() */ public ScopeType getScope() { ScopeType scopeType = null; for (ISeamXmlComponentDeclaration d: xmlDeclarations) { String s = d.getScopeAsString(); if(s != null && s.length() > 0) { scopeType = d.getScope(); } if(scopeType != null && scopeType != ScopeType.UNSPECIFIED) break; } if(scopeType == null || scopeType == ScopeType.UNSPECIFIED) { ISeamJavaComponentDeclaration java = getJavaDeclaration(); if(java != null) scopeType = java.getScope(); } if(scopeType == null) scopeType = ScopeType.UNSPECIFIED; return scopeType; } /** * @see org.jboss.tools.seam.core.ISeamContextVariable#setName(java.lang.String) */ public void setName(String name) { this.name = name; } /** * @see org.jboss.tools.seam.core.ISeamContextVariable#setScope(org.jboss.tools.seam.core.ScopeType) */ public void setScope(ScopeType type) { //TODO } /** * @see org.jboss.tools.seam.core.ISeamComponent#getProperties(java.lang.String) */ public List<ISeamProperty> getProperties(String propertyName) { List<ISeamProperty> list = new ArrayList<ISeamProperty>(); Collection<ISeamProperty> ps = getProperties(); for (ISeamProperty p: ps) { if(propertyName.equals(p.getName())) list.add(p); } return list; } /** * @see org.jboss.tools.seam.core.ISeamComponent#getProperties() */ public Collection<ISeamProperty> getProperties() { Set<ISeamProperty> ps = new HashSet<ISeamProperty>(); Set<ISeamXmlComponentDeclaration> xml = getXmlDeclarations(); for (ISeamXmlComponentDeclaration d: xml) { ps.addAll(d.getProperties()); } Set<ISeamPropertiesDeclaration> pd = getPropertiesDeclarations(); for (ISeamPropertiesDeclaration d: pd) { ps.addAll(d.getProperties()); } return ps; } public Set<ISeamComponentDeclaration> getAllDeclarations() { return allDeclarations; } public ISeamJavaComponentDeclaration getJavaDeclaration() { if(javaDeclarations.isEmpty()) return null; return javaDeclarations.iterator().next(); } public Set<ISeamPropertiesDeclaration> getPropertiesDeclarations() { return propertyDeclarations; } public Set<ISeamXmlComponentDeclaration> getXmlDeclarations() { return xmlDeclarations; } public void addDeclaration(ISeamComponentDeclaration declaration) { if(allDeclarations.contains(declaration)) return; allDeclarations.add(declaration); if(name.equals(declaration.getName())) { adopt(declaration); } if(declaration instanceof ISeamJavaComponentDeclaration) { javaDeclarations.add((ISeamJavaComponentDeclaration)declaration); } else if(declaration instanceof ISeamXmlComponentDeclaration) { xmlDeclarations.add((ISeamXmlComponentDeclaration)declaration); } else if(declaration instanceof ISeamPropertiesDeclaration) { propertyDeclarations.add((ISeamPropertiesDeclaration)declaration); } ((SeamComponentDeclaration)declaration).bindToComponent(this); } public void removeDeclaration(ISeamComponentDeclaration declaration) { if(!allDeclarations.contains(declaration)) return; allDeclarations.remove(declaration); if(declaration instanceof ISeamJavaComponentDeclaration) { javaDeclarations.remove(declaration); } else if(declaration instanceof ISeamXmlComponentDeclaration) { xmlDeclarations.remove(declaration); } else if(declaration instanceof ISeamPropertiesDeclaration) { propertyDeclarations.remove(declaration); } ((SeamComponentDeclaration)declaration).unbindFromComponent(this); } @Override public String toString() { return "SeamComponent: " + getName(); //$NON-NLS-1$ } public SeamComponent clone() throws CloneNotSupportedException { return this; } public void setProjectPackage(SeamPackage p) { projectPackage = p; } public void setScopePackage(SeamPackage p) { scopePackage = p; } public List<Change> removeFromModel(List<Change> changes) { SeamScope pc = (SeamScope)getParent(); if(pc != null) { pc.removeComponent(this); changes = Change.addChange(changes, new Change(pc, null, this, null)); } if(scopePackage != null) { removeFrom(scopePackage); changes = Change.addChange(changes, new Change(scopePackage, null, this, null)); scopePackage = null; } if(projectPackage != null) { removeFrom(projectPackage); changes = Change.addChange(changes, new Change(projectPackage, null, this, null)); projectPackage = null; } return changes; } public List<Change> revalidate(List<Change> changes) { SeamScope pc = (SeamScope)getParent(); SeamScope pn = (SeamScope)getSeamProject().getScope(getScope()); if(pc != pn) { if(pc != null) { pc.removeComponent(this); changes = Change.addChange(changes, new Change(pc, null, this, null)); } setParent(pn); pn.addComponent(this); changes = Change.addChange(changes, new Change(pn, null, null, this)); if(scopePackage != null) { removeFrom(scopePackage); changes = Change.addChange(changes, new Change(scopePackage, null, this, null)); scopePackage = null; } } if(scopePackage != null && !scopePackage.getQualifiedName().equals(SeamPackageUtil.getPackageName(this))) { removeFrom(scopePackage); changes = Change.addChange(changes, new Change(scopePackage, null, this, null)); scopePackage = null; } if(scopePackage == null) { pn.validatePackage(this); } if(projectPackage != null && !projectPackage.getQualifiedName().equals(SeamPackageUtil.getPackageName(this))) { removeFrom(projectPackage); changes = Change.addChange(changes, new Change(projectPackage, null, this, null)); projectPackage = null; } if(projectPackage == null) { ((SeamProject)getSeamProject()).validatePackage(this); } return changes; } private void removeFrom(ISeamPackage p) { p.getComponents().remove(this); while(p != null && p.getComponents().size() + p.getPackages().size() == 0) { ISeamElement o = p.getParent(); if(o instanceof ISeamPackage) { ISeamPackage q = (ISeamPackage)o; q.getPackages().remove(p); p = q; } else if(o instanceof SeamScope) { SeamScope s = (SeamScope)o; s.removePackage(p); p = null; } else if(o instanceof SeamProject) { SeamProject project = (SeamProject)o; project.removePackage(p); p = null; } } } }