/******************************************************************************* * 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.List; import java.util.Properties; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.project.ext.IValueInfo; import org.jboss.tools.common.model.project.ext.event.Change; import org.jboss.tools.common.model.util.NamespaceMapping; import org.jboss.tools.seam.core.ISeamElement; import org.jboss.tools.seam.core.ISeamXmlComponentDeclaration; import org.jboss.tools.seam.core.ScopeType; import org.jboss.tools.seam.internal.core.scanner.xml.XMLScanner; import org.w3c.dom.Element; public class SeamXmlComponentDeclaration extends SeamPropertiesDeclaration implements ISeamXmlComponentDeclaration { String autoCreate = null; String className = null; String installed = null; String jndiName = null; String precedence = "20"; String scope = null; boolean isClassNameGuessed = false; public String getAutoCreateAsString() { return autoCreate; } public String getClassName() { return className; } public boolean isClassNameGuessed() { return isClassNameGuessed; } public boolean getInstalledAsString() { return !"false".equals(installed); //$NON-NLS-1$ } public String getJndiName() { return jndiName; } public String getPrecedence() { return precedence; } public ScopeType getScope() { if(scope == null || scope.length() == 0) return ScopeType.UNSPECIFIED; try { return ScopeType.valueOf(scope.toUpperCase()); } catch (IllegalArgumentException e) { return ScopeType.UNSPECIFIED; } } public String getScopeAsString() { return scope; } public boolean isAutoCreate() { return "true".equals(autoCreate); //$NON-NLS-1$ } public boolean isInstalled() { return !"false".equals(installed); //$NON-NLS-1$ } public void setClassName(String className) { this.className = className; } public void setClassName(IValueInfo value) { attributes.put(CLASS, value); setClassName(value == null ? null : value.getValue()); } public void setClassNameGuessed(boolean b) { isClassNameGuessed = b; } public void setAutoCreate(String autoCreate) { this.autoCreate = autoCreate; } public void setAutoCreate(IValueInfo value) { attributes.put(AUTO_CREATE, value); setAutoCreate(value == null ? null : value.getValue()); } public void setInstalled(String installed) { this.installed = installed; } public void setInstalled(IValueInfo value) { attributes.put(INSTALLED, value); setInstalled(value == null ? null : value.getValue()); } public void setJndiName(String jndiName) { this.jndiName = jndiName; } public void setJndiName(IValueInfo value) { attributes.put(JNDI_NAME, value); setJndiName(value == null ? null : value.getValue()); } public void setPrecedence(String precedence) { this.precedence = precedence; if(precedence == null || precedence.length() == 0) { this.precedence = "20"; } } public void setPrecedence(IValueInfo value) { attributes.put(PRECEDENCE, value); setPrecedence(value == null ? null : value.getValue()); } public void setScope(String scope) { this.scope = scope; } public void setScope(IValueInfo value) { attributes.put(SCOPE, value); setScope(value == null ? null : value.getValue()); } /** * Merges loaded data into currently used declaration. * If changes were done returns a list of changes. * @param d * @return list of changes */ @Override public List<Change> merge(ISeamElement s) { List<Change> changes = super.merge(s); SeamXmlComponentDeclaration xd = (SeamXmlComponentDeclaration)s; if(!stringsEqual(className, xd.className)) { changes = Change.addChange(changes, new Change(this, CLASS, className, xd.className)); className = xd.className; } this.isClassNameGuessed = xd.isClassNameGuessed; if(!stringsEqual(autoCreate, xd.autoCreate)) { changes = Change.addChange(changes, new Change(this, AUTO_CREATE, autoCreate, xd.autoCreate)); autoCreate = xd.autoCreate; } if(!stringsEqual(installed, xd.installed)) { changes = Change.addChange(changes, new Change(this, INSTALLED, installed, xd.installed)); installed = xd.installed; } if(!stringsEqual(jndiName, xd.jndiName)) { changes = Change.addChange(changes, new Change(this, JNDI_NAME, jndiName, xd.jndiName)); jndiName = xd.jndiName; } if(!stringsEqual(precedence, xd.precedence)) { changes = Change.addChange(changes, new Change(this, PRECEDENCE, precedence, xd.precedence)); precedence = xd.precedence; } if(!stringsEqual(scope, xd.scope)) { changes = Change.addChange(changes, new Change(this, SCOPE, scope, xd.scope)); scope = xd.scope; } return changes; } public SeamXmlComponentDeclaration clone() throws CloneNotSupportedException { SeamXmlComponentDeclaration c = (SeamXmlComponentDeclaration)super.clone(); return c; } public String getXMLClass() { return SeamXMLConstants.CLS_XML; } public Element toXML(Element parent, Properties context) { Element element = super.toXML(parent, context); if(isClassNameGuessed) { element.setAttribute("isClassNameGuessed", "true"); } return element; } public void loadXML(Element element, Properties context) { super.loadXML(element, context); setAutoCreate(attributes.get(AUTO_CREATE)); setInstalled(attributes.get(INSTALLED)); setJndiName(attributes.get(JNDI_NAME)); setPrecedence(attributes.get(PRECEDENCE)); setScope(attributes.get(SCOPE)); setClassName(attributes.get(CLASS)); isClassNameGuessed = "true".equals(element.getAttribute("isClassNameGuessed")); if(className == null && id instanceof XModelObject) { XModelObject c = (XModelObject)id; if(c.getModelEntity().getName().equals("FileSeamComponent12")) { className = XMLScanner.getImpliedClassName(c, source); isClassNameGuessed = true; } else { XModelObject f = c; while(f != null && f.getFileType() != XModelObject.FILE) f = f.getParent(); NamespaceMapping nm = NamespaceMapping.load(f); SeamProject sp = (SeamProject)context.get("seamProject"); className = XMLScanner.getDefaultClassName(c, nm, sp); isClassNameGuessed = true; } } } }