/** * Copyright (c) 2006-2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are 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: * IBM - Initial API and implementation */ package org.eclipse.emf.codegen.merge.java.facade.jdom; import java.util.Hashtable; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.jdom.DOMFactory; import org.eclipse.jdt.core.jdom.IDOMCompilationUnit; import org.eclipse.jdt.core.jdom.IDOMField; import org.eclipse.jdt.core.jdom.IDOMImport; import org.eclipse.jdt.core.jdom.IDOMInitializer; import org.eclipse.jdt.core.jdom.IDOMMethod; import org.eclipse.jdt.core.jdom.IDOMNode; import org.eclipse.jdt.core.jdom.IDOMPackage; import org.eclipse.jdt.core.jdom.IDOMType; import org.eclipse.emf.codegen.CodeGenPlugin; import org.eclipse.emf.codegen.merge.java.facade.FacadeHelper; import org.eclipse.emf.codegen.merge.java.facade.JCompilationUnit; import org.eclipse.emf.codegen.merge.java.facade.JField; import org.eclipse.emf.codegen.merge.java.facade.JImport; import org.eclipse.emf.codegen.merge.java.facade.JInitializer; import org.eclipse.emf.codegen.merge.java.facade.JMethod; import org.eclipse.emf.codegen.merge.java.facade.JNode; import org.eclipse.emf.codegen.merge.java.facade.JPackage; import org.eclipse.emf.codegen.merge.java.facade.JType; @SuppressWarnings({"deprecation", "unchecked", "rawtypes"}) public class JDOMFacadeHelper extends FacadeHelper { public static IDOMNode getIDOMNode(JNode node) { return node instanceof JDOMJNode ? ((JDOMJNode)node).getWrappedObject() : null; } protected DOMFactory jdomFactory; protected boolean forcedSourceCompatibility; public JDOMFacadeHelper() { setForcedSourceCompatibility(true); } @Override public void reset() { jdomFactory = null; super.reset(); } protected DOMFactory getJDOMFactory() { if (jdomFactory == null) { jdomFactory = new DOMFactory(); } return jdomFactory; } public void setForcedSourceCompatibility(boolean forcedSourceCompatibility) { this.forcedSourceCompatibility = forcedSourceCompatibility; } public boolean isForcedSourceCompatibility() { return forcedSourceCompatibility; } protected void adjustSourceCompatibility(String value) { Hashtable map = JavaCore.getOptions(); map.put(JavaCore.COMPILER_SOURCE, value); JavaCore.setOptions(map); } @Override public JCompilationUnit createCompilationUnit(String name, String contents) { String sourceCompatibility = JavaCore.getOption(JavaCore.COMPILER_SOURCE); if (sourceCompatibility != null) { if ("1.4".compareTo(sourceCompatibility) < 0) { if (isForcedSourceCompatibility()) { adjustSourceCompatibility("1.4"); } else { sourceCompatibility = null; CodeGenPlugin.INSTANCE.log(CodeGenPlugin.INSTANCE.getString("_UI_JDOMInvalidSourceCompatibility_message")); } } else { sourceCompatibility = null; } } JDOMJCompilationUnit compilationUnit = (JDOMJCompilationUnit)convertToNode(getJDOMFactory().createCompilationUnit(contents, name)); compilationUnit.setOriginalContent(contents); if (sourceCompatibility != null) { adjustSourceCompatibility(sourceCompatibility); } return compilationUnit; } @Override public String getOriginalContents(JCompilationUnit compilationUnit) { return ((JDOMJCompilationUnit)compilationUnit).getOriginalContent(); } @Override protected JNode doConvertToNode(Object object) { JDOMJNode node = null; if (object instanceof IDOMCompilationUnit) { node = new JDOMJCompilationUnit((IDOMCompilationUnit)object); } else if (object instanceof IDOMField) { node = new JDOMJField((IDOMField)object); } else if (object instanceof IDOMImport) { node = new JDOMJImport((IDOMImport)object); } else if (object instanceof IDOMInitializer) { node = new JDOMJInitializer((IDOMInitializer)object); } else if (object instanceof IDOMMethod) { node = new JDOMJMethod((IDOMMethod)object); } else if (object instanceof IDOMPackage) { node = new JDOMJPackage((IDOMPackage)object); } else if (object instanceof IDOMType) { node = new JDOMJType((IDOMType)object); } if (node != null) { node.setFacadeHelper(this); } return node; } @Override public Object getContext(JNode node) { return null; } @Override public JNode cloneNode(Object context, JNode node) { String content = applyFormatRules(node.getContents()); IDOMNode idomNode = null; if (node instanceof JCompilationUnit) { idomNode = getIDOMNode(createCompilationUnit(node.getName(), content)); } else if (node instanceof JField) { idomNode = getJDOMFactory().createField(content); } else if (node instanceof JImport) { idomNode = getJDOMFactory().createImport(content); } else if (node instanceof JInitializer) { idomNode = getJDOMFactory().createInitializer(content); } else if (node instanceof JMethod) { idomNode = getJDOMFactory().createMethod(content); } else if (node instanceof JPackage) { idomNode = getJDOMFactory().createPackage(content); } else if (node instanceof JType) { idomNode = getJDOMFactory().createType(content); } else { IDOMNode originalIDOMNode = JDOMFacadeHelper.getIDOMNode(node); if (originalIDOMNode != null) { idomNode = (IDOMNode)originalIDOMNode.clone(); } } return idomNode != null ? convertToNode(idomNode) : null; } @Override public boolean addChild(JNode node, JNode child) { if (child != null) { IDOMNode idomNode = getIDOMNode(node); IDOMNode idomChild = getIDOMNode(child); idomNode.addChild(idomChild); return true; } else { return false; } } @Override public boolean insertSibling(JNode node, JNode sibiling, boolean before) { if (sibiling != null) { IDOMNode idomNode = getIDOMNode(node); if (!before) { idomNode = idomNode.getNextNode(); } IDOMNode idomSibiling = getIDOMNode(sibiling); idomNode.insertSibling(idomSibiling); return true; } else { return false; } } @Override public boolean remove(JNode node) { IDOMNode idomNode = getIDOMNode(node); IDOMNode parent = idomNode.getParent(); if (parent != null) { idomNode.remove(); return true; } return false; } @Override public JNode getFirstChild(JNode node) { IDOMNode idomNode = getIDOMNode(node); return convertToNode(idomNode.getFirstChild()); } @Override public JNode getPrevious(JNode node) { IDOMNode idomNode = getIDOMNode(node); return convertToNode(idomNode.getPreviousNode()); } @Override public JNode getNext(JNode node) { IDOMNode idomNode = getIDOMNode(node); return convertToNode(idomNode.getNextNode()); } @Override public boolean fixInterfaceBrace() { return true; } @Override public boolean canYieldWrongJavadoc() { return true; } @Override public boolean isSibilingTraversalExpensive() { return false; } }