/* license-start
*
* Copyright (C) 2008 - 2013 Crispico, <http://www.crispico.com/>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details, at <http://www.gnu.org/licenses/>.
*
* Contributors:
* Crispico - Initial API and implementation
*
* license-end
*/
package com.crispico.flower.mp.codesync.code.java.adapter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jface.text.Document;
import org.eclipse.text.edits.TextEdit;
import org.flowerplatform.editor.EditorPlugin;
import org.flowerplatform.editor.file.IFileAccessController;
import com.crispico.flower.mp.codesync.code.adapter.AbstractFileModelAdapter;
import com.crispico.flower.mp.model.codesync.CodeSyncElement;
/**
* Mapped to files with the extension <code>java</code>. Chidren are {@link ASTNode}s.
*
* @author Mariana
*/
public class JavaFileModelAdapter extends AbstractFileModelAdapter {
@Override
public Object createChildOnContainmentFeature(Object file, Object feature, Object correspondingChild) {
CompilationUnit cu = getOrCreateCompilationUnit(file);
ASTNode node = (ASTNode) JavaTypeModelAdapter.createCorrespondingModelElement(cu.getAST(), (CodeSyncElement) correspondingChild);
cu.types().add(node);
return node;
}
@Override
public void removeChildrenOnContainmentFeature(Object parent, Object feature, Object child) {
((ASTNode) child).delete();
}
@Override
public List<?> getChildren(Object modelElement) {
return getOrCreateCompilationUnit(modelElement).types();
}
private CompilationUnit getOrCreateCompilationUnit(Object file) {
return (CompilationUnit) getOrCreateFileInfo(file);
}
/**
* Creates a new compilation unit from the file's content.
*/
@Override
protected Object createFileInfo(Object file) {
ASTParser parser = ASTParser.newParser(AST.JLS4);
Map options = new HashMap<>(JavaCore.getOptions());
options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_7);
parser.setCompilerOptions(options);
boolean fileExists = EditorPlugin.getInstance().getFileAccessController().exists(file);
char[] initialContent = fileExists ? getFileContent(file) : new char[0];
parser.setSource(initialContent);
CompilationUnit astRoot = (CompilationUnit) parser.createAST(null);
astRoot.recordModifications();
return astRoot;
}
private char[] getFileContent(Object file) {
IFileAccessController fileAccessController = EditorPlugin.getInstance().getFileAccessController();
return fileAccessController.readFileToString(file).toCharArray();
}
@Override
protected TextEdit rewrite(Document document, Object fileInfo) {
CompilationUnit cu = (CompilationUnit) fileInfo;
return cu.rewrite(document, null);
}
}