/******************************************************************************* * 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 * * Contributor: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.seam.internal.core; import java.util.HashSet; import java.util.List; import java.util.Properties; import java.util.Set; import org.eclipse.core.resources.IResource; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IMember; import org.eclipse.jdt.core.JavaModelException; import org.jboss.tools.common.model.project.ext.event.Change; import org.jboss.tools.seam.core.ISeamComponentMethod; import org.jboss.tools.seam.core.ISeamElement; import org.jboss.tools.seam.core.SeamComponentMethodType; import org.w3c.dom.Element; /** * @author Viacheslav Kabanovich */ public class SeamComponentMethod extends SeamObject implements ISeamComponentMethod { Set<SeamComponentMethodType> types = new HashSet<SeamComponentMethodType>(); IMember javaSource = null; public SeamComponentMethod() {} /** * @return is types of the method */ public Set<SeamComponentMethodType> getTypes() { return types; } public boolean isOfType(SeamComponentMethodType type) { return types.contains(type); } public IMember getSourceMember() { return javaSource; } public void setSourceMember(IMember javaSource) { this.javaSource = javaSource; } public int getLength() { if(javaSource == null) return 0; try { if(javaSource.getSourceRange() == null) return 0; return javaSource.getSourceRange().getLength(); } catch (JavaModelException e) { //ignore return 0; } } public IResource getResource() { if(resource == null) { if(javaSource == null) return super.getResource(); resource = javaSource.getResource(); } return resource; } public int getStartPosition() { if(javaSource == null) return 0; try { if(javaSource.getSourceRange() == null) return 0; return javaSource.getSourceRange().getOffset(); } catch (JavaModelException e) { //ignore return 0; } } @Override public List<Change> merge(ISeamElement s) { List<Change> changes = super.merge(s); SeamComponentMethod m = (SeamComponentMethod)s; if(!typesAreEqual(types, m.types)) { changes = Change.addChange(changes, new Change(this, "types", types, m.types)); //$NON-NLS-1$ this.types = m.types; } return changes; } boolean typesAreEqual(Set<SeamComponentMethodType> types1, Set<SeamComponentMethodType> types2) { if(types1 == null || types2 == null) return types2 == types1; if(types1.size() != types2.size()) return false; for (SeamComponentMethodType t : types2) { if(!types1.contains(t)) return false; } return true; } public SeamComponentMethod clone() throws CloneNotSupportedException { SeamComponentMethod c = (SeamComponentMethod)super.clone(); c.types = new HashSet<SeamComponentMethodType>(); c.types.addAll(types); return c; } public String getXMLName() { return SeamXMLConstants.TAG_METHOD; } static String ATTR_COMP_TYPES = "comp-types"; public Element toXML(Element parent, Properties context) { Element element = super.toXML(parent, context); if(types != null) { StringBuffer sb = new StringBuffer(); for (SeamComponentMethodType t : types) { sb.append(t.toString()).append(';'); } element.setAttribute(ATTR_COMP_TYPES, sb.toString()); } return element; } public void loadXML(Element element, Properties context) { super.loadXML(element, context); if(id instanceof IMember) { javaSource = (IMember)id; } if(element.hasAttribute(ATTR_COMP_TYPES)) { String v = element.getAttribute(ATTR_COMP_TYPES); if(v != null && v.length() > 0) { String[] cs = v.split(";"); for (int i = 0; i < cs.length; i++) { types.add(SeamComponentMethodType.valueOf(cs[i])); } } } } @Override public IJavaElement getSourceElement() { return getSourceMember(); } }