blob: 19142ad7b482cd56a0b54cab82b83c87c2c4ab54 [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.projectimport.eclipse.core;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.prefs.Preferences;
import org.netbeans.api.annotations.common.CheckForNull;
import org.netbeans.api.annotations.common.NonNull;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectUtils;
import org.netbeans.api.queries.CollocationQuery;
import org.netbeans.modules.projectimport.eclipse.core.spi.ProjectImportModel;
import org.netbeans.modules.projectimport.eclipse.core.spi.ProjectTypeFactory;
import org.netbeans.modules.projectimport.eclipse.core.spi.ProjectTypeUpdater;
import org.netbeans.spi.project.support.ant.PropertyUtils;
import org.openide.filesystems.FileUtil;
import org.openide.util.Exceptions;
import org.openide.util.NbPreferences;
/**
* Represents reference to Eclipse project which consist of eclipse project location,
* eclipse workspace location, eclipse files timestamp and key identifying relevant
* import data. File references are stored relative if collocated. If differnt user
* opens NetBeans project and Eclipse reference cannot be resolved then UI asking
* for eclipse project location and eclipse workspace location is shown. These
* are stored in NbPreferences in userdir for now.
*/
public class EclipseProjectReference {
private Project project;
private final File eclipseProjectLocation;
private final File eclipseWorkspaceLocation;
private long timestamp;
private String key;
private boolean initialized;
private EclipseProject eclipseProject;
private ProjectImportModel importModel;
private final static String PROJECT_PREFIX = "project-"; //NOI18N
private final static String WORKSPACE_PREFIX = "workspace-"; //NOI18N
public EclipseProjectReference(Project project, String eclipseProjectLocation, String eclipseWorkspaceLocation, long timestamp, String key) {
this.eclipseProjectLocation = PropertyUtils.resolveFile(FileUtil.toFile(project.getProjectDirectory()), eclipseProjectLocation);
if (eclipseWorkspaceLocation != null) {
this.eclipseWorkspaceLocation = PropertyUtils.resolveFile(FileUtil.toFile(project.getProjectDirectory()), eclipseWorkspaceLocation);
} else {
this.eclipseWorkspaceLocation = null;
}
this.timestamp = timestamp;
this.key = key;
this.project = project;
}
Project getProject() {
return project;
}
public @NonNull File getEclipseProjectLocation() {
return eclipseProjectLocation;
}
public @CheckForNull File getEclipseWorkspaceLocation() {
return eclipseWorkspaceLocation;
}
File getFallbackEclipseProjectLocation() {
String path = getPreferences().get(PROJECT_PREFIX+getEclipseProjectLocation().getPath(), null);
if (path != null) {
return new File(path);
}
return getEclipseProjectLocation();
}
File getFallbackWorkspaceProjectLocation() {
if (eclipseWorkspaceLocation == null) {
return null;
}
String path = getPreferences().get(WORKSPACE_PREFIX+getEclipseWorkspaceLocation().getPath(), null);
if (path != null) {
return FileUtil.normalizeFile(new File(path));
}
return getEclipseWorkspaceLocation();
}
void updateReference(String eclipseLocation, String eclipseWorkspace) {
if (eclipseLocation != null) {
getPreferences().put(PROJECT_PREFIX+getEclipseProjectLocation().getPath(), eclipseLocation); //NOI18N
}
if (eclipseWorkspace != null) {
getPreferences().put(WORKSPACE_PREFIX+getEclipseWorkspaceLocation().getPath(), eclipseWorkspace); //NOI18N
}
}
private static Preferences getPreferences() {
return NbPreferences.forModule(EclipseProjectReference.class);
}
public static @CheckForNull EclipseProjectReference read(Project project) {
// XXX using shared prefs is incorrect if an absolute path was stored!
Preferences prefs = ProjectUtils.getPreferences(project, EclipseProjectReference.class, true);
String projectLoc = prefs.get("project", null); //NOI18N
if (projectLoc == null) {
return null;
}
return new EclipseProjectReference(project, projectLoc, prefs.get("workspace", null), Long.parseLong(prefs.get("timestamp", null)), prefs.get("key", null)); //NOI18N
}
public static void write(Project project, EclipseProjectReference ref) {
Preferences prefs = ProjectUtils.getPreferences(project, EclipseProjectReference.class, true);
File baseDir = FileUtil.toFile(project.getProjectDirectory());
if (CollocationQuery.areCollocated(baseDir, ref.eclipseProjectLocation)) {
prefs.put("project", PropertyUtils.relativizeFile(baseDir, ref.eclipseProjectLocation)); //NOI18N
} else {
prefs.put("project", ref.eclipseProjectLocation.getPath()); //NOI18N
}
if (ref.eclipseWorkspaceLocation != null) {
if (CollocationQuery.areCollocated(baseDir, ref.eclipseWorkspaceLocation)) {
prefs.put("workspace", PropertyUtils.relativizeFile(baseDir, ref.eclipseWorkspaceLocation)); //NOI18N
} else {
prefs.put("workspace", ref.eclipseWorkspaceLocation.getPath()); //NOI18N
}
}
prefs.put("timestamp", Long.toString(ref.getCurrentTimestamp())); //NOI18N
prefs.put("key", ref.key); //NOI18N
}
/**
* @param deepTest if false only file timestamps are compared; if false
* project classpath is compared
*/
public boolean isUpToDate(boolean deepTest) {
if (getCurrentTimestamp() > timestamp) {
return false;
} else if (!deepTest) {
return true;
}
EclipseProject ep = getEclipseProject(true);
if (ep == null) {
// an exception was thrown; pretend proj is uptodate
return true;
}
if (!(ep.getProjectTypeFactory() instanceof ProjectTypeUpdater)) {
assert false : "project with <eclipse> data in project.xml is upgradable: "+ //NOI18N
project.getProjectDirectory()+" " +ep.getProjectTypeFactory().getClass().getName(); //NOI18N
}
ProjectTypeUpdater updater = (ProjectTypeUpdater)ep.getProjectTypeFactory();
return key.equals(updater.calculateKey(importModel));
}
void update(List<String> importProblems) throws IOException {
EclipseProject ep = getEclipseProject(true);
if (ep == null) {
// an exception was thrown; pretend proj is uptodate
return;
}
ProjectTypeFactory factory = ep.getProjectTypeFactory();
if (!(factory instanceof ProjectTypeUpdater)) {
assert false : "project with <eclipse> data in project.xml is upgradable"; //NOI18N
return;
}
// resolve classpath containers
ep.resolveContainers(importProblems, true);
// create ENV variables in build.properties
ep.setupEnvironmentVariables(importProblems);
// perform update
key = ((ProjectTypeUpdater) factory).update(project, importModel, key, importProblems);
write(project, this);
}
private long getCurrentTimestamp() {
// use directly Files:
File dotClasspath = new File(getFallbackEclipseProjectLocation(), ".classpath"); //NOI18N
File dotProject = new File(getFallbackEclipseProjectLocation(), ".project"); //NOI18N
return Math.max(dotClasspath.lastModified(), dotProject.lastModified());
}
boolean isEclipseProjectReachable() {
boolean b = EclipseUtils.isRegularProject(eclipseProjectLocation) &&
(eclipseWorkspaceLocation == null ||
(eclipseWorkspaceLocation != null && EclipseUtils.isRegularWorkSpace(eclipseWorkspaceLocation)));
if (b) {
// if project/workspace are reachable remove fallback properties
getPreferences().remove(PROJECT_PREFIX+eclipseProjectLocation.getPath());
if (eclipseWorkspaceLocation != null) {
getPreferences().remove(WORKSPACE_PREFIX+eclipseWorkspaceLocation.getPath());
}
return true;
}
return EclipseUtils.isRegularProject(getFallbackEclipseProjectLocation()) &&
(eclipseWorkspaceLocation == null ||
(eclipseWorkspaceLocation != null && EclipseUtils.isRegularWorkSpace(getFallbackWorkspaceProjectLocation())));
}
public EclipseProject getEclipseProject(boolean forceReload) {
if (forceReload || !initialized) {
try {
EclipseProject ep = null;
if (getFallbackWorkspaceProjectLocation() != null) {
Workspace w = WorkspaceFactory.getInstance().load(getFallbackWorkspaceProjectLocation());
ep = w.getProjectByProjectDir(getFallbackEclipseProjectLocation());
}
if (ep == null) {
ep = ProjectFactory.getInstance().load(getFallbackEclipseProjectLocation(), getFallbackWorkspaceProjectLocation());
}
eclipseProject = ep;
} catch (ProjectImporterException ex) {
Exceptions.printStackTrace(ex);
eclipseProject = null;
initialized = true;
return null;
}
File f = FileUtil.toFile(project.getProjectDirectory());
importModel = new ProjectImportModel(eclipseProject, f,
JavaPlatformSupport.getJavaPlatformSupport().getJavaPlatform(eclipseProject, new ArrayList<String>()), Collections.<Project>emptyList());
initialized = true;
}
return eclipseProject;
}
}