/*******************************************************************************
* 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.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
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.text.ITextSourceReference;
import org.jboss.tools.jst.web.model.project.ext.store.XMLStoreHelper;
import org.jboss.tools.seam.core.IOpenableElement;
import org.jboss.tools.seam.core.ISeamDeclaration;
import org.jboss.tools.seam.core.ISeamElement;
import org.jboss.tools.seam.core.ISeamXmlComponentDeclaration;
import org.w3c.dom.Element;
/**
* @author Viacheslav Kabanovich
*/
public abstract class AbstractSeamDeclaration extends SeamObject implements ISeamDeclaration, ITextSourceReference, IOpenableElement {
public static final String PATH_OF_NAME = "name"; //$NON-NLS-1$
protected String name;
protected Map<String,IValueInfo> attributes = new HashMap<String, IValueInfo>();
public AbstractSeamDeclaration() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void open() {}
public int getLength() {
// TODO Auto-generated method stub
return 0;
}
public int getStartPosition() {
// TODO Auto-generated method stub
return 0;
}
/**
* @param path
* @return source reference for some member of declaration.
* e.g. if you need source reference for @Name you have to
* invoke getLocationFor("name");
*/
public ITextSourceReference getLocationFor(String path) {
final IValueInfo valueInfo = attributes.get(path);
ITextSourceReference reference = new ITextSourceReference() {
public int getLength() {
return valueInfo != null ? valueInfo.getLength() : 0;
}
public int getStartPosition() {
return valueInfo != null ? valueInfo.getStartPosition() : 0;
}
public IResource getResource() {
return resource;
}
};
return reference;
}
public void addAttribute(String path, IValueInfo value) {
attributes.put(path, value);
}
public void setName(IValueInfo value) {
attributes.put(ISeamXmlComponentDeclaration.NAME, value);
name = value == null ? null : value.getValue();
}
boolean stringsEqual(String s1, String s2) {
return s1 == null ? s2 == null : s1.equals(s2);
}
public AbstractSeamDeclaration clone() throws CloneNotSupportedException {
AbstractSeamDeclaration c = (AbstractSeamDeclaration)super.clone();
c.attributes = new HashMap<String, IValueInfo>();
c.attributes.putAll(attributes);
return c;
}
@Override
public List<Change> merge(ISeamElement s) {
List<Change> changes = super.merge(s);
if(s instanceof AbstractSeamDeclaration) {
AbstractSeamDeclaration d = (AbstractSeamDeclaration)s;
attributes.clear();
attributes.putAll(d.attributes);
}
return changes;
}
public Element toXML(Element parent, Properties context) {
Element element = super.toXML(parent, context);
XModelObject old = pushModelObject(context);
if(name != null) element.setAttribute(SeamXMLConstants.ATTR_NAME, name);
XMLStoreHelper.saveMap(element, attributes, "attributes", context);
popModelObject(context, old);
return element;
}
public void loadXML(Element element, Properties context) {
super.loadXML(element, context);
XModelObject old = pushModelObject(context);
if(element.hasAttribute(SeamXMLConstants.ATTR_NAME)) {
name = element.getAttribute(SeamXMLConstants.ATTR_NAME);
}
XMLStoreHelper.loadMap(element, attributes, "attributes", context);
popModelObject(context, old);
}
protected XModelObject pushModelObject(Properties context) {
XModelObject old = (XModelObject)context.get(SeamXMLConstants.KEY_MODEL_OBJECT);
if(id instanceof XModelObject) {
context.put(SeamXMLConstants.KEY_MODEL_OBJECT, id);
}
return old;
}
protected void popModelObject(Properties context, XModelObject old) {
if(old != null) {
context.put(SeamXMLConstants.KEY_MODEL_OBJECT, old);
} else {
context.remove(SeamXMLConstants.KEY_MODEL_OBJECT);
}
}
public Object getAdapter(Class cls) {
if(cls == IFile.class) {
if(getResource() instanceof IFile) {
IFile f = (IFile)getResource();
if(f != null && f.exists()) {
return f;
}
}
} else if(cls == IResource.class) {
IResource r = getResource();
if(r != null && r.exists()) {
return r;
}
}
return null;
}
}