/*******************************************************************************
* 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.lang.annotation.Inherited;
import java.util.List;
import java.util.Properties;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.project.ext.event.Change;
import org.jboss.tools.common.xml.XMLUtilities;
import org.jboss.tools.jst.web.model.project.ext.store.XMLStoreHelper;
import org.jboss.tools.seam.core.ISeamElement;
import org.jboss.tools.seam.core.ISeamProject;
import org.w3c.dom.Element;
/**
* @author Viacheslav Kabanovich
*/
public class SeamObject implements ISeamElement {
/**
* Object that allows to identify this object.
*/
protected Object id;
/**
* Path of resource where this object is declared.
*/
protected IPath source;
/**
* Resource where this object is declared.
*/
protected IResource resource = null;
/**
* Parent seam object in the seam model.
*/
protected ISeamElement parent;
public SeamObject() {}
public ISeamProject getSeamProject() {
return parent == null ? null : parent.getSeamProject();
}
public Object getId() {
return id;
}
/**
* Sets id for this object.
* For most objects it is object of Java or XML model
* from which this object is loaded.
*/
public void setId(Object id) {
this.id = id;
}
/**
* Sets path of resource that declares this object.
*/
public void setSourcePath(IPath path) {
source = path;
}
/**
* Returns path of resource that declares this object.
* @return
*/
public IPath getSourcePath() {
if(source == null && parent != null) return parent.getSourcePath();
return source;
}
public IResource getResource() {
if(resource != null) return resource;
if(source != null) {
resource = ResourcesPlugin.getWorkspace().getRoot().getFile(source);
}
if(resource == null && parent != null) {
return parent.getResource();
}
return resource;
}
/**
* Returns parent object of seam model.
* @return
*/
public ISeamElement getParent() {
return parent;
}
public void setParent(ISeamElement parent) {
this.parent = parent;
}
protected void adopt(ISeamElement child) {
if(child.getSeamProject() != null && child.getSeamProject() != getSeamProject()) return;
((SeamObject)child).setParent(this);
}
/**
* Merges loaded object into current object.
* If changes were done returns a list of changes.
* If there are no changes, null is returned,
* which prevents creating a lot of unnecessary objects.
* @param f
* @return list of changes
*/
public List<Change> merge(ISeamElement s) {
SeamObject o = (SeamObject)s;
source = o.source;
id = o.id;
resource = o.resource;
//If there are no changes, null is returned,
//which prevents creating a lot of unnecessary objects.
//Subclasses and clients must check returned
//value for null, before using it.
return null;
}
public SeamObject clone() throws CloneNotSupportedException {
SeamObject c = (SeamObject)super.clone();
c.parent = null;
//do not copy parent
return c;
}
//Serializing to XML
public String getXMLName() {
return "object";
}
public String getXMLClass() {
return null;
}
public Element toXML(Element parent, Properties context) {
Element element = XMLUtilities.createElement(parent, getXMLName());
if(getXMLClass() != null) {
element.setAttribute(SeamXMLConstants.ATTR_CLASS, getXMLClass());
}
if(source != null && !source.equals(context.get(SeamXMLConstants.ATTR_PATH))) {
element.setAttribute(SeamXMLConstants.ATTR_PATH, source.toString());
}
if(id != null) {
if(id instanceof String) {
Element eid = XMLUtilities.createElement(element, SeamXMLConstants.TAG_ID);
eid.setAttribute(SeamXMLConstants.ATTR_CLASS, SeamXMLConstants.CLS_STRING);
eid.setAttribute(SeamXMLConstants.ATTR_VALUE, id.toString());
} else if(id instanceof IType) {
XMLStoreHelper.saveType(element, ((IType)id), SeamXMLConstants.TAG_ID, context);
} else if(id instanceof IField) {
XMLStoreHelper.saveField(element, ((IField)id), SeamXMLConstants.TAG_ID, context);
} else if(id instanceof IMethod) {
XMLStoreHelper.saveMethod(element, ((IMethod)id), SeamXMLConstants.TAG_ID, context);
} else if(id instanceof XModelObject) {
XModelObject o = (XModelObject)id;
XMLStoreHelper.saveModelObject(element, o, SeamXMLConstants.TAG_ID, context);
}
}
return element;
}
public void loadXML(Element element, Properties context) {
String s = element.getAttribute(SeamXMLConstants.ATTR_PATH);
if(s != null && s.length() > 0) {
source = new Path(s);
} else {
source = (IPath)context.get(SeamXMLConstants.ATTR_PATH);
}
Element e_id = XMLUtilities.getUniqueChild(element, SeamXMLConstants.TAG_ID);
if(e_id != null) {
String cls = e_id.getAttribute(SeamXMLConstants.ATTR_CLASS);
if(SeamXMLConstants.CLS_STRING.equals(cls)) {
id = e_id.getAttribute("string");
} else if(SeamXMLConstants.CLS_TYPE.equals(cls)) {
id = XMLStoreHelper.loadType(e_id, context);
} else if(SeamXMLConstants.CLS_FIELD.equals(cls)) {
id = XMLStoreHelper.loadField(e_id, context);
} else if(SeamXMLConstants.CLS_METHOD.equals(cls)) {
id = XMLStoreHelper.loadMethod(e_id, context);
} else if(SeamXMLConstants.CLS_MODEL_OBJECT.equals(cls)) {
id = XMLStoreHelper.loadModelObject(e_id, context);
}
}
}
public Object getAdapter(Class cls) {
return null;
}
}