blob: efe44f0c519748a2b623749222ac927429be8d85 [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2011 Nicolas Deblock & Manuel Giles.
*
*
* 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:
* Nicolas Deblock nico.deblock@gmail.com - Initial API and implementation
* Manuel Giles giles.manu@live.fr - Initial API and implementation
* Cedric Dumoulin Cedric.dumoulin@lifl.fr - Idea of the java generator project & help for the conception
*
*****************************************************************************/
package org.eclipse.papyrus.designer.languages.java.generator.jdtsynchronizer.impl;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.papyrus.designer.languages.java.generator.jdtsynchronizer.GeneratorPreference;
import org.eclipse.papyrus.designer.languages.java.generator.metamodel.jdt.jdtmm.JDTJavaElement;
import org.eclipse.papyrus.designer.languages.java.generator.metamodel.jdt.jdtmm.JDTPackageFragment;
import org.eclipse.papyrus.designer.languages.java.generator.metamodel.jdt.jdtmm.JDTPackageFragmentRoot;
import org.eclipse.papyrus.designer.languages.java.generator.metamodel.jdt.jdtmm.visitor.JDTVisitor;
import org.eclipse.papyrus.designer.languages.java.generator.metamodel.jdt.jdtmm.visitor.JDTVisitorException;
/**
* allow to generate package fragment root
*
* @author Deblock Nicolas & Manuel Giles
*
*/
public class SynchJDTPackageFragmentRoot implements JDTVisitor {
private IJavaProject iprojet;
private GeneratorPreference preference;
/**
* Constructor
*
* @param iprojet
* the project parent
*/
public SynchJDTPackageFragmentRoot(IJavaProject iprojet, GeneratorPreference preference) {
super();
this.iprojet = iprojet;
this.preference = preference;
}
@Override
public void visit(JDTJavaElement element) throws JDTVisitorException {
// if element can't be generated, we stop all
if (!element.isGenerated()) {
return;
}
JDTPackageFragmentRoot root = (JDTPackageFragmentRoot) element;
try {
// research JDTPackageFragmentRoot
IPackageFragmentRoot iroot = SynchTools.searchIJavaElement(iprojet.getAllPackageFragmentRoots(), root.getElementName());
// if IPackageFragmentRoot don't exist, we create this
if (iroot == null) {
// create the folder
IFolder sourceFolder = iprojet.getProject().getFolder(root.getElementName());
try {
sourceFolder.create(false, true, null);
} catch (CoreException e) {
// folder already exist
}
iroot = iprojet.getPackageFragmentRoot(sourceFolder);
IClasspathEntry[] oldEntries = iprojet.getRawClasspath();
List<IClasspathEntry> newEntries = new ArrayList<IClasspathEntry>();
// copy the old entries in new entries
for (int i = 0; i < oldEntries.length; i++) {
// don't take the /projectName, else an exception are throw
if (oldEntries[i] != null && !oldEntries[i].getPath().toString().equals("/" + iprojet.getElementName())) {
newEntries.add(oldEntries[i]);
}
}
// add the new packageFragmentRoot
newEntries.add(JavaCore.newSourceEntry(iroot.getPath()));
IClasspathEntry[] newEntriesArray = new IClasspathEntry[newEntries.size()];
newEntries.toArray(newEntriesArray);
iprojet.setRawClasspath(newEntriesArray, null);
}
// call children
JDTVisitor visitPackageFragment = new SynchJDTPackageFragment(iroot, preference);
for (JDTPackageFragment ipack : root.getPackageFragments()) {
ipack.accept(visitPackageFragment);
}
} catch (JavaModelException e) {
e.printStackTrace();
throw new JDTVisitorException(e.getMessage(), e.getCause());
}
}
}