blob: e05d7ceaf5a112ed1baf4623d3f49f855ba22aaf [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.j2ee.earproject;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.netbeans.api.java.platform.JavaPlatform;
import org.netbeans.api.java.platform.JavaPlatformManager;
import org.netbeans.api.java.project.JavaProjectConstants;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectManager;
import org.netbeans.api.project.ProjectUtils;
import org.netbeans.api.project.ant.AntArtifact;
import org.netbeans.api.project.ant.AntArtifactQuery;
import org.netbeans.modules.j2ee.clientproject.api.AppClientProjectCreateData;
import org.netbeans.modules.j2ee.clientproject.api.AppClientProjectGenerator;
import org.netbeans.modules.j2ee.common.SharabilityUtility;
import org.netbeans.modules.javaee.project.api.ant.ui.J2EEProjectProperties;
import org.netbeans.modules.j2ee.dd.api.application.Application;
import org.netbeans.modules.j2ee.dd.api.application.DDProvider;
import org.netbeans.modules.j2ee.dd.api.application.Module;
import org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment;
import org.netbeans.modules.j2ee.deployment.devmodules.api.J2eeModule;
import org.netbeans.modules.j2ee.deployment.devmodules.api.J2eePlatform;
import org.netbeans.api.j2ee.core.Profile;
import org.netbeans.api.java.classpath.JavaClassPathConstants;
import org.netbeans.api.java.project.classpath.ProjectClassPathModifier;
import org.netbeans.api.project.SourceGroup;
import org.netbeans.api.project.libraries.LibraryManager;
import org.netbeans.modules.javaee.project.api.ant.AntProjectConstants;
import org.netbeans.modules.javaee.project.api.ant.DeployOnSaveUtils;
import org.netbeans.modules.j2ee.earproject.ui.customizer.EarProjectProperties;
import org.netbeans.modules.j2ee.earproject.util.EarProjectUtil;
import org.netbeans.modules.j2ee.ejbjarproject.api.EjbJarProjectCreateData;
import org.netbeans.modules.j2ee.ejbjarproject.api.EjbJarProjectGenerator;
import org.netbeans.modules.java.api.common.project.ProjectProperties;
import org.netbeans.modules.javaee.project.api.ear.EarDDGenerator;
import org.netbeans.modules.web.project.api.WebProjectCreateData;
import org.netbeans.modules.web.project.api.WebProjectUtilities;
import org.netbeans.spi.project.support.ant.AntProjectHelper;
import org.netbeans.spi.project.support.ant.EditableProperties;
import org.netbeans.spi.project.support.ant.ProjectGenerator;
import org.netbeans.spi.project.support.ant.ReferenceHelper;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileSystem;
import org.openide.filesystems.FileSystem.AtomicAction;
import org.openide.filesystems.FileUtil;
import org.openide.modules.SpecificationVersion;
import org.openide.util.Exceptions;
import org.openide.util.Mutex;
import org.openide.util.MutexException;
import org.openide.util.NbBundle;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* Creates a fresh EarProject from scratch or imports an existing Enterprise
* Application.
*
* @author vince kraemer
*/
public final class EarProjectGenerator {
private static final Logger LOGGER = Logger.getLogger(EarProjectGenerator.class.getName());
private static final String DEFAULT_DOC_BASE_FOLDER = "src/conf"; //NOI18N
private static final String DEFAULT_BUILD_DIR = "build"; //NOI18N
private static final String DEFAULT_RESOURCE_FOLDER = "setup"; //NOI18N
private static final String SOURCE_ROOT_REF = "${" + EarProjectProperties.SOURCE_ROOT + "}"; //NOI18N
private final File prjDir;
private final String name;
private final Profile j2eeProfile;
private final String serverInstanceID;
private final String sourceLevel;
private final FileObject prjDirFO;
private String librariesDefinition;
private EarProjectGenerator(File prjDir, FileObject prjDirFO, String name, Profile j2eeProfile,
String serverInstanceID, String sourceLevel, String librariesDefinition) {
this.prjDir = prjDir;
this.prjDirFO = prjDirFO;
this.name = name;
this.j2eeProfile = j2eeProfile;
this.serverInstanceID = serverInstanceID;
// #181215: JDK 6 should be the default source/binary format for Java EE 6 projects
if (sourceLevel != null && (sourceLevel.equals("1.7")))
sourceLevel = "1.6";
this.sourceLevel = sourceLevel;
this.librariesDefinition = librariesDefinition;
}
/**
* Creates a new empty Enterprise Application project.
*
* @param prjDir the top-level directory (need not yet exist but if it does it must be empty)
* @param name the code name for the project
* @return the helper object permitting it to be further customized
* @throws IOException in case something went wrong
*/
public static AntProjectHelper createProject(File prjDir, String name, Profile j2eeProfile,
String serverInstanceId, String sourceLevel, String librariesDefinition) throws IOException {
FileObject projectDir = FileUtil.createFolder(prjDir);
final EarProjectGenerator earGen = new EarProjectGenerator(prjDir, projectDir, name, j2eeProfile,
serverInstanceId, sourceLevel, librariesDefinition);
final AntProjectHelper[] h = new AntProjectHelper[1];
// create project in one FS atomic action:
FileSystem fs = projectDir.getFileSystem();
fs.runAtomicAction(new FileSystem.AtomicAction() {
public void run() throws IOException {
AntProjectHelper helper = earGen.doCreateProject();
h[0] = helper;
}});
return h[0];
}
public static AntProjectHelper importProject(File pDir, final File sDir, String name,
Profile j2eeProfile, String serverInstanceID, final String platformName,
String sourceLevel, final Map<FileObject, ModuleType> userModules,
String librariesDefinition)
throws IOException {
FileObject projectDir = FileUtil.createFolder(pDir);
final EarProjectGenerator earGen = new EarProjectGenerator(pDir, projectDir, name,
j2eeProfile, serverInstanceID, sourceLevel, librariesDefinition);
final AntProjectHelper[] h = new AntProjectHelper[1];
// create project in one FS atomic action:
FileSystem fs = projectDir.getFileSystem();
fs.runAtomicAction(new FileSystem.AtomicAction() {
public void run() throws IOException {
AntProjectHelper helper = earGen.doImportProject(sDir, userModules, platformName);
h[0] = helper;
}});
return h[0];
}
private AntProjectHelper doCreateProject() throws IOException {
final AntProjectHelper h = setupProject();
FileObject docBase = FileUtil.createFolder(prjDirFO, DEFAULT_DOC_BASE_FOLDER);
// create a default manifest
FileUtil.copyFile(FileUtil.getConfigFile(
"org-netbeans-modules-j2ee-earproject/MANIFEST.MF"), docBase, "MANIFEST"); // NOI18N
final EarProject p = (EarProject)ProjectManager.getDefault().findProject(h.getProjectDirectory());
final ReferenceHelper refHelper = p.getReferenceHelper();
try {
ProjectManager.mutex().writeAccess(new Mutex.ExceptionAction<Void>() {
public Void run() throws Exception {
EditableProperties ep = h.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH);
ep.put(EarProjectProperties.SOURCE_ROOT, "."); //NOI18N
ep.setProperty(EarProjectProperties.META_INF, DEFAULT_DOC_BASE_FOLDER);
ep.setProperty(EarProjectProperties.RESOURCE_DIR, DEFAULT_RESOURCE_FOLDER);
h.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, ep);
ProjectManager.getDefault().saveProject(p);
copyRequiredLibraries(h, refHelper, serverInstanceID, j2eeProfile);
return null;
}
});
} catch (MutexException ex) {
Exceptions.printStackTrace(ex.getException());
}
EarProject earProject = p.getLookup().lookup(EarProject.class);
assert earProject != null;
setupDD(j2eeProfile, docBase, earProject);
return h;
}
private static void copyRequiredLibraries(AntProjectHelper h, ReferenceHelper rh,
String serverInstanceId, Profile j2eeProfile) throws IOException {
if (!h.isSharableProject()) {
return;
}
String libraryName = null;
if (j2eeProfile.equals(Profile.JAVA_EE_6_FULL) || j2eeProfile.equals(Profile.JAVA_EE_6_WEB)) {
libraryName = AntProjectConstants.ENDORSED_LIBRARY_NAME_6;
}
if (j2eeProfile.equals(Profile.JAVA_EE_7_FULL) || j2eeProfile.equals(Profile.JAVA_EE_7_WEB)) {
libraryName = AntProjectConstants.ENDORSED_LIBRARY_NAME_7;
}
if (libraryName != null) {
if (rh.getProjectLibraryManager().getLibrary(libraryName) == null) { // NOI18N
rh.copyLibrary(LibraryManager.getDefault().getLibrary(libraryName)); // NOI18N
}
}
SharabilityUtility.makeSureProjectHasCopyLibsLibrary(h, rh);
}
private AntProjectHelper doImportProject(final File srcPrjDir,
Map<FileObject, ModuleType> userModules,
String platformName) throws IOException {
FileObject srcPrjDirFO = FileUtil.toFileObject(FileUtil.normalizeFile(srcPrjDir));
FileObject docBase = FileUtil.createFolder(srcPrjDirFO, DEFAULT_DOC_BASE_FOLDER);
AntProjectHelper earHelper = setupProject();
ReferenceHelper referenceHelper = new ReferenceHelper(earHelper,
earHelper.createAuxiliaryConfiguration(), earHelper.getStandardPropertyEvaluator());
String sourceRoot = referenceHelper.createForeignFileReference(srcPrjDir, null);
String metaInf = createFileReference(referenceHelper, srcPrjDirFO, docBase);
EditableProperties ep = earHelper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH);
ep.setProperty(EarProjectProperties.SOURCE_ROOT, sourceRoot);
ep.setProperty(EarProjectProperties.META_INF, metaInf);
earHelper.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, ep);
FileObject earDirFO = earHelper.getProjectDirectory();
EarProject earProject = ProjectManager.getDefault().findProject(earDirFO).getLookup().lookup(EarProject.class);
if (null != earProject) {
Application app = null;
try {
FileObject appXml = earProject.getAppModule().getDeploymentDescriptor();
FileObject fileBeingCopied = null;
if (null != appXml) {
// make a backup copy of the application.xml and its siblings
Enumeration filesToBackup =
appXml.getParent().getChildren(false);
while (null != filesToBackup &&
filesToBackup.hasMoreElements()) {
fileBeingCopied =
(FileObject) filesToBackup.nextElement();
if (fileBeingCopied.isData() &&
fileBeingCopied.canRead()) {
try {
FileUtil.copyFile(fileBeingCopied,
appXml.getParent(),
"original_"+fileBeingCopied.getName(), // NOI18N
fileBeingCopied.getExt());
} catch (IOException ioe) {
// this is not fatal
}
}
}
app = DDProvider.getDefault().getDDRoot(appXml);
Module m[] = app.getModule();
if (null != m && m.length > 0) {
// make sure the config object has told us what to listen to...
earProject.getAppModule().getConfigSupport().ensureConfigurationReady();
// delete the modules
for (int k = 0; k < m.length; k++) {
app.removeModule(m[k]);
}
if (EarProjectUtil.isDDWritable(earProject)) {
app.write(earProject.getAppModule().getDeploymentDescriptor());
}
// notify the user here....
DialogDisplayer.getDefault().notify(
new NotifyDescriptor.Message(NbBundle.getMessage(EarProjectGenerator.class, "MESSAGE_CheckContextRoots"),
NotifyDescriptor.WARNING_MESSAGE));
}
}
} catch (IOException ioe) {
Logger.getLogger("global").log(Level.INFO, ioe.getLocalizedMessage());
}
setupDD(j2eeProfile, docBase, earProject);
if (userModules == null || userModules.isEmpty()) {
userModules = ModuleType.detectModules(srcPrjDirFO);
}
addUserModules(earProject, userModules, platformName, earHelper, earProject);
// XXX all web module URI-to-ContextRoot mapping should happen here
ProjectManager.getDefault().saveProject(earProject);
earProject.getAppModule().getConfigSupport().createInitialConfiguration();
if (sourceLevel != null) {
EarProjectGenerator.setPlatformSourceLevel(earHelper, sourceLevel);
}
}
return earHelper;
}
private void addUserModules(EarProject p, final Map<FileObject, ModuleType> userModules,
final String platformName, final AntProjectHelper h, final EarProject earProject) throws IOException {
Set<Project> ejbs = new HashSet<Project>();
Set<Project> webAndCars = new HashSet<Project>();
for (Map.Entry<FileObject, ModuleType> entry : userModules.entrySet()) {
FileObject subprojectDir = entry.getKey();
ModuleType type = entry.getValue();
Project subProject = addModule(p, type, platformName, subprojectDir);
assert subProject != null : "Directory " + subprojectDir + " does not contain valid project";
switch (type) {
case EJB:
ejbs.add(subProject);
break;
case WEB:
case CLIENT:
webAndCars.add(subProject);
break;
default:
assert false : "Unknown module type: " + type;
}
}
Project[] webAndCarsArray = webAndCars.toArray(new Project[webAndCars.size()]);
for (Project ejb : ejbs) {
addEJBToClassPaths(ejb, webAndCarsArray); // #74123
}
}
/**
* Adds EJB's artifact to Web and Application Client projects' classpaths.
*
* @param ejbJarProject must not be <code>null</code>
* @param projects may contains also <code>null</code> elements
*/
public static void addEJBToClassPaths(final Project ejbJarProject,
final Project... projects) throws IOException {
assert ejbJarProject != null;
AntArtifact[] ejbArtifacts = AntArtifactQuery.findArtifactsByType(
ejbJarProject, JavaProjectConstants.ARTIFACT_TYPE_JAR);
for (AntArtifact artifact : ejbArtifacts) {
for (Project project : projects) {
if (project == null) {
continue;
}
URI[] locations = artifact.getArtifactLocations();
if (locations.length > 0) { // sanity check
SourceGroup sgs[] = ProjectUtils.getSources(project).getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA);
if (sgs.length > 0) {
ProjectClassPathModifier.addAntArtifacts(new AntArtifact[]{artifact},
new URI[]{locations[0].normalize()}, sgs[0].getRootFolder(), JavaClassPathConstants.COMPILE_ONLY);
}
}
}
}
}
private Project addModule(EarProject p, final ModuleType type,
final String platformName, final FileObject subprojectRoot)
throws IllegalArgumentException, IOException {
// #87604 & #143772 - check first whether the module is not already a project
Project existingProject = getExistingJ2EEModuleProject(subprojectRoot);
if (existingProject != null) {
EarProjectProperties.addJ2eeSubprojects(p, new Project[] { existingProject });
return existingProject;
}
// module is not a project
FileObject javaRoot = getJavaRoot(subprojectRoot);
File srcFolders[] = getSourceFolders(javaRoot);
File subProjDir = FileUtil.normalizeFile(
new File(prjDir, subprojectRoot.getNameExt()));
AntProjectHelper subProjHelper = null;
switch (type) {
case WEB:
subProjHelper = addWebModule(subprojectRoot, srcFolders, subProjDir, platformName);
break;
case EJB:
subProjHelper = addEJBModule(javaRoot, subprojectRoot, subProjDir, platformName);
break;
case CLIENT:
subProjHelper = addAppClientModule(javaRoot, subprojectRoot, subProjDir, platformName);
break;
default:
assert false : "Unknown module type: " + type;
}
Project subProject = null;
if (null != subProjHelper) {
subProject = ProjectManager.getDefault().findProject(
subProjHelper.getProjectDirectory());
EarProjectProperties.addJ2eeSubprojects(p, new Project[] { subProject });
}
return subProject;
}
// get existing project but only java ee module
private Project getExistingJ2EEModuleProject(final FileObject projectDirectory) throws IOException {
Project project = ProjectManager.getDefault().findProject(projectDirectory);
if (EarProjectUtil.isJavaEEModule(project)) {
return project;
}
return null;
}
private AntProjectHelper addAppClientModule(final FileObject javaRoot, final FileObject subprojectRoot, final File subProjDir, final String platformName) throws IOException {
FileObject docBaseFO = FileUtil.createFolder(subprojectRoot, DEFAULT_DOC_BASE_FOLDER);
File docBase = FileUtil.toFile(docBaseFO);
AppClientProjectCreateData createData = new AppClientProjectCreateData();
createData.setProjectDir(subProjDir);
createData.setName(subprojectRoot.getName());
createData.setSourceFolders(new File[] { FileUtil.toFile(javaRoot) });
createData.setTestFolders(new File[0]);
createData.setConfFolder(docBase);
createData.setJavaEEProfile(getAcceptableProfile(j2eeProfile, serverInstanceID, J2eeModule.Type.CAR));
createData.setServerInstanceID(serverInstanceID);
AntProjectHelper subProjHelper = AppClientProjectGenerator.importProject(createData);
if (platformName != null || sourceLevel != null) {
AppClientProjectGenerator.setPlatform(subProjHelper, platformName, sourceLevel);
}
return subProjHelper;
}
private AntProjectHelper addEJBModule(final FileObject javaRoot, final FileObject subprojectRoot, final File subProjDir, final String platformName) throws IOException {
FileObject docBaseFO = FileUtil.createFolder(subprojectRoot, DEFAULT_DOC_BASE_FOLDER);
File docBase = FileUtil.toFile(docBaseFO);
EjbJarProjectCreateData createData = new EjbJarProjectCreateData();
createData.setProjectDir(subProjDir);
createData.setName(subprojectRoot.getName());
createData.setSourceFolders(new File[] {FileUtil.toFile(javaRoot)});
createData.setTestFolders(new File[0]);
createData.setConfigFilesBase(docBase);
createData.setJavaEEProfile(getAcceptableProfile(j2eeProfile, serverInstanceID, J2eeModule.Type.EJB));
createData.setServerInstanceID(serverInstanceID);
AntProjectHelper subProjHelper = EjbJarProjectGenerator.importProject(createData);
if (platformName != null || sourceLevel != null) {
EjbJarProjectGenerator.setPlatform(subProjHelper, platformName, sourceLevel);
}
return subProjHelper;
}
private AntProjectHelper addWebModule(final FileObject subprojectRoot, final File srcFolders[], final File subProjDir, final String platformName) throws IOException {
WebProjectCreateData createData = new WebProjectCreateData();
createData.setProjectDir(subProjDir);
createData.setName(subprojectRoot.getName());
createData.setWebModuleFO(subprojectRoot);
createData.setSourceFolders(srcFolders);
createData.setTestFolders(new File[0]);
createData.setDocBase(FileUtil.createFolder(subprojectRoot, "web")); //NOI18N
createData.setLibFolder(null);
createData.setJavaEEProfile(getAcceptableProfile(j2eeProfile, serverInstanceID, J2eeModule.Type.WAR));
createData.setServerInstanceID(serverInstanceID);
createData.setBuildfile("build.xml"); //NOI18N
createData.setJavaPlatformName(platformName);
createData.setSourceLevel(sourceLevel);
// # 109128, BluePrints structure
createData.setWebInfFolder(subprojectRoot.getFileObject("web/WEB-INF"));
return WebProjectUtilities.importProject(createData);
}
static FileObject setupDD(final Profile j2eeProfile, final FileObject docBase,
final EarProject earProject) throws IOException {
return EarDDGenerator.setupDD(earProject, false);
}
/** Check that the J2EE version requested for the EAR is also supported for
* the module type and if not suggest a different version.
* For now the only check is to use J2EE 1.4 if JavaEE5 is not supported.
* Otherwise use the requestedVersion.
*/
public static Profile getAcceptableProfile(Profile requestedProfile, String serverInstanceID, J2eeModule.Type moduleType) {
J2eePlatform platform = Deployment.getDefault().getJ2eePlatform(serverInstanceID);
Set<Profile> profiles = platform.getSupportedProfiles(moduleType);
if (!profiles.contains(requestedProfile) && (profiles.contains(Profile.J2EE_14))) {
return Profile.J2EE_14;
}
return requestedProfile;
}
private static String relativePath(FileObject parent, FileObject child) {
if (child.equals(parent)) {
return "";
}
if (!FileUtil.isParentOf(parent, child)) {
throw new IllegalArgumentException("Cannot find relative path, " + parent + " is not parent of " + child); // NOI18N
}
return child.getPath().substring(parent.getPath().length() + 1);
}
private AntProjectHelper setupProject() throws IOException {
EarProjectUtil.logUI(NbBundle.getBundle(EarProjectGenerator.class), "UI_EAR_PROJECT_CREATE_SHARABILITY", // NOI18N
new Object[]{Boolean.valueOf(librariesDefinition != null), Boolean.FALSE});
AntProjectHelper h = ProjectGenerator.createProject(prjDirFO, EarProjectType.TYPE, librariesDefinition);
EarProject p = (EarProject)ProjectManager.getDefault().findProject(prjDirFO);
Element data = h.getPrimaryConfigurationData(true);
Document doc = data.getOwnerDocument();
Element nameEl = doc.createElementNS(EarProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); // NOI18N
nameEl.appendChild(doc.createTextNode(name));
data.appendChild(nameEl);
Element minant = doc.createElementNS(EarProjectType.PROJECT_CONFIGURATION_NAMESPACE, "minimum-ant-version"); // NOI18N
minant.appendChild(doc.createTextNode("1.6.5")); // NOI18N
data.appendChild(minant);
Element wmLibs = doc.createElementNS(EarProjectType.PROJECT_CONFIGURATION_NAMESPACE, EarProjectProperties.TAG_WEB_MODULE_LIBRARIES); //NOI18N
data.appendChild(wmLibs);
Element addLibs = doc.createElementNS(EarProjectType.PROJECT_CONFIGURATION_NAMESPACE, EarProjectProperties.TAG_WEB_MODULE__ADDITIONAL_LIBRARIES); //NOI18N
data.appendChild(addLibs);
h.putPrimaryConfigurationData(data, true);
EditableProperties ep = h.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH);
// XXX the following just for testing, TBD:
ep.setProperty(EarProjectProperties.DIST_DIR, "dist"); // NOI18N
ep.setProperty(EarProjectProperties.DIST_JAR, "${" + EarProjectProperties.DIST_DIR + "}/${" + EarProjectProperties.JAR_NAME + "}"); // NOI18N
ep.setProperty(EarProjectProperties.J2EE_PLATFORM, j2eeProfile.toPropertiesString());
ep.setProperty(EarProjectProperties.JAR_NAME, name + ".ear"); // NOI18N
ep.setProperty(EarProjectProperties.JAR_COMPRESS, "false"); // NOI18N
ep.setProperty(EarProjectProperties.JAR_CONTENT_ADDITIONAL, "");
ep.setProperty(EarProjectProperties.CLIENT_MODULE_URI, "");
ep.setProperty(EarProjectProperties.LAUNCH_URL_RELATIVE, "");
ep.setProperty(EarProjectProperties.DISPLAY_BROWSER, "true"); // NOI18N
// deploy on save since nb 6.5
ep.setProperty(EarProjectProperties.J2EE_COMPILE_ON_SAVE, "true");
ep.setProperty(EarProjectProperties.J2EE_DEPLOY_ON_SAVE, DeployOnSaveUtils.isDeployOnSaveSupported(serverInstanceID));
String srcLevel = sourceLevel;
if (srcLevel == null) {
JavaPlatform defaultPlatform = JavaPlatformManager.getDefault().getDefaultPlatform();
SpecificationVersion v = defaultPlatform.getSpecification().getVersion();
srcLevel = v.toString();
// #89131: these levels are not actually distinct from 1.5.
// #181215: JDK 6 should be the default source/binary format for Java EE 6 projects
if (srcLevel.equals("1.7"))
srcLevel = "1.6";
}
ep.setProperty(EarProjectProperties.JAVAC_SOURCE, srcLevel); //NOI18N
ep.setProperty(EarProjectProperties.JAVAC_DEBUG, "true"); // NOI18N
ep.setProperty(EarProjectProperties.JAVAC_DEPRECATION, "false"); // NOI18N
//xxx Default should be 1.2
//http://projects.netbeans.org/buildsys/j2se-project-ui-spec.html#Build_Compiling_Sources
ep.setProperty(EarProjectProperties.JAVAC_TARGET, srcLevel); //NOI18N
ep.setProperty(EarProjectProperties.BUILD_DIR, DEFAULT_BUILD_DIR);
ep.setProperty(EarProjectProperties.BUILD_GENERATED_DIR, "${"+EarProjectProperties.BUILD_DIR+"}/generated"); // NOI18N
ep.setProperty(EarProjectProperties.BUILD_CLASSES_EXCLUDES, "**/*.java,**/*.form,**/.nbattrs"); // NOI18N
ep.setProperty(EarProjectProperties.NO_DEPENDENCIES, "false"); // NOI18N
ep.setProperty(EarProjectProperties.JAVA_PLATFORM, "default_platform"); // NOI18N
ep.setProperty(EarProjectProperties.DEBUG_CLASSPATH,
"${"+EarProjectProperties.JAVAC_CLASSPATH+"}::${"+ // NOI18N
EarProjectProperties.JAR_CONTENT_ADDITIONAL+"}:${"+ // NOI18N
EarProjectProperties.RUN_CLASSPATH+"}"); // NOI18N
if (j2eeProfile.equals(Profile.JAVA_EE_6_FULL) || j2eeProfile.equals(Profile.JAVA_EE_6_WEB)) {
ep.setProperty(ProjectProperties.ENDORSED_CLASSPATH, new String[]{AntProjectConstants.ENDORSED_LIBRARY_CLASSPATH_6});
}
if (j2eeProfile.equals(Profile.JAVA_EE_7_FULL) || j2eeProfile.equals(Profile.JAVA_EE_7_WEB)) {
ep.setProperty(ProjectProperties.ENDORSED_CLASSPATH, new String[]{AntProjectConstants.ENDORSED_LIBRARY_CLASSPATH_7});
}
EditableProperties privateEP = h.getProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH);
J2EEProjectProperties.setServerProperties(ep, privateEP, null, null, serverInstanceID, j2eeProfile, J2eeModule.Type.EAR);
h.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, ep);
h.putProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH, privateEP);
ProjectManager.getDefault().saveProject(p);
return h;
}
private String createFileReference(ReferenceHelper refHelper,
FileObject sourceprojectFO, FileObject referencedFO) {
if (FileUtil.isParentOf(prjDirFO, referencedFO)) {
return relativePath(prjDirFO, referencedFO);
} else if (FileUtil.isParentOf(sourceprojectFO, referencedFO)) {
String s = relativePath(sourceprojectFO, referencedFO);
return s.length() > 0 ? SOURCE_ROOT_REF + '/' + s : SOURCE_ROOT_REF;
} else {
return refHelper.createForeignFileReference(FileUtil.toFile(referencedFO), null);
}
}
public static void setPlatformSourceLevel(final AntProjectHelper helper, final String sourceLevel) {
FileObject projectDir = helper.getProjectDirectory();
if (projectDir == null) {
return;
}
try {
projectDir.getFileSystem().runAtomicAction(new AtomicAction() {
public void run() throws IOException {
ProjectManager.mutex().writeAccess(new Runnable() {
public void run() {
try {
EditableProperties ep = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH);
// #89131: these levels are not actually distinct from 1.5.
String srcLevel = sourceLevel;
// #181215: JDK 6 should be the default source/binary format for Java EE 6 projects
if (sourceLevel.equals("1.7"))
srcLevel = "1.6";
ep.setProperty(EarProjectProperties.JAVAC_SOURCE, srcLevel);
ep.setProperty(EarProjectProperties.JAVAC_TARGET, srcLevel);
helper.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, ep);
ProjectManager.getDefault().saveProject(ProjectManager.getDefault().findProject(helper.getProjectDirectory()));
} catch (IOException e) {
Exceptions.printStackTrace(e);
}
}
});
}
});
} catch (IOException e) {
Exceptions.printStackTrace(e);
}
}
private FileObject getJavaRoot(final FileObject moduleRoot) throws IOException {
FileObject javaRoot = moduleRoot.getFileObject("src/java"); // NOI18N
// XXX this is a hack. Remove once 56487 is resolved
if (null == javaRoot) {
FileObject srcDir = moduleRoot.getFileObject("src"); // NOI18N
if (null == srcDir) {
srcDir = moduleRoot.createFolder("src"); // NOI18N
}
javaRoot = srcDir.createFolder("java"); // NOI18N
}
return javaRoot;
// end hack for 56487
}
private File[] getSourceFolders(final FileObject javaRoot) {
return null == javaRoot ? new File[0] :
new File[] { FileUtil.toFile(javaRoot) };
}
}