/*******************************************************************************
* Copyright (c) 2012 The PDT Extension Group (https://github.com/pdt-eg)
* 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
******************************************************************************/
package org.pdtextensions.server.internal.web;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.IProjectFacet;
import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.osgi.service.prefs.BackingStoreException;
import org.pdtextensions.server.PEXServerPlugin;
import org.pdtextensions.server.web.IPhpWebFolder;
import org.pdtextensions.server.web.IPhpWebProject;
import org.pdtextensions.server.web.IPhpWebProjectListener;
/**
* The web project implementation.
*
* @author mepeisen
*/
public class PhpWebProject implements IPhpWebProject {
/**
* the underlying project
*/
private IProject project;
private IWebProjectStorage storage;
private List<IPhpWebProjectListener> listeners = new ArrayList<IPhpWebProjectListener>();
/**
* Constructor
* @param project
*/
public PhpWebProject(IProject project) {
this.project = project;
}
@Override
public IProject getEclipseProject() {
return this.project;
}
@Override
public IScriptProject getScriptProject() {
return DLTKCore.create(project);
}
@Override
public IFacetedProject getFacetedProject() {
try {
return ProjectFacetsManager.create(project);
} catch (CoreException ex) {
PEXServerPlugin.logError(ex);
return null;
}
}
private void init() {
if (this.storage == null) {
if (this.hasWebFacet()) {
try {
this.storage = new SettingsPhpProjectStorage(project);
} catch (BackingStoreException e) {
PEXServerPlugin.logError(e);
this.storage = new PlainPhpProjectStorage(project);
}
} else {
this.storage = new PlainPhpProjectStorage(project);
}
}
}
@Override
public IContainer getDefaultWebFolder() {
init();
return this.storage.getDefaultWebFolder();
}
@Override
public boolean hasWebFacet() {
final IFacetedProject faceted = this.getFacetedProject();
if (faceted != null) {
final IProjectFacet webFacet = ProjectFacetsManager
.getProjectFacet(FACET_ID);
return faceted.hasProjectFacet(webFacet);
}
return false;
}
@Override
public void activateWebFacet() throws CoreException {
final IFacetedProject faceted = this.getFacetedProject();
if (faceted != null) {
final IProjectFacet webFacet = ProjectFacetsManager
.getProjectFacet(FACET_ID);
if (faceted.hasProjectFacet(webFacet)) {
return;
}
final IProjectFacetVersion version = webFacet.getVersion(FACET_VERSION_1_0);
faceted.installProjectFacet(version, null, new NullProgressMonitor());
try {
this.storage = new SettingsPhpProjectStorage(project);
} catch (BackingStoreException e) {
throw new CoreException(new Status(IStatus.ERROR, PEXServerPlugin.PLUGIN_ID, "Error reading preferences", e)); //$NON-NLS-1$
}
}
}
@Override
public void setDefaultWebFolder(IContainer folder) throws CoreException {
init();
final IContainer oldValue = this.getDefaultWebFolder();
if (!oldValue.equals(folder)) {
this.storage.setDefaultWebFolder(folder);
}
}
@Override
public IPhpWebFolder[] getWebFolders() {
init();
return this.storage.getWebFolders();
}
@Override
public IPhpWebFolder createWebFolder(IContainer folder, String pathName)
throws CoreException {
init();
final WebFolder result = new WebFolder(storage.createWebFolder(folder, pathName));
for (final IPhpWebProjectListener listener : listeners) {
listener.onAddedWebFolder(this, result);
}
return result;
}
@Override
public void removeWebFolder(IPhpWebFolder folder) throws CoreException {
init();
this.storage.removeWebFolder(((WebFolder)folder).folder);
for (final IPhpWebProjectListener listener : listeners) {
listener.onRemovedFolder(this, folder);
}
}
@Override
public void registerProjectListener(IPhpWebProjectListener listener) {
this.listeners.add(listener);
}
@Override
public void removeProjectListener(IPhpWebProjectListener listener) {
this.listeners.remove(listener);
}
public void notifyProjectClosed() {
for (final IPhpWebProjectListener listener : listeners) {
listener.onProjectClosed(this);
}
}
public void notifySettingsChanged() {
if (storage instanceof SettingsPhpProjectStorage) {
try {
((SettingsPhpProjectStorage) storage).reload();
} catch (BackingStoreException e) {
PEXServerPlugin.logError(e);
}
// TODO Notify listeners about changes
}
}
private class WebFolder implements IPhpWebFolder {
private IPhpWebFolder folder;
public WebFolder(IPhpWebFolder folder) {
this.folder = folder;
}
/**
* @see org.pdtextensions.server.web.IPhpWebFolder#getFolder()
*/
@Override
public IContainer getFolder() {
return folder.getFolder();
}
/**
* @see org.pdtextensions.server.web.IPhpWebFolder#getPathName()
*/
@Override
public String getPathName() {
return folder.getPathName();
}
/**
* @see org.pdtextensions.server.web.IPhpWebFolder#set(org.eclipse.core.resources.IContainer, java.lang.String)
*/
@Override
public void set(IContainer folder, String pathName)
throws CoreException {
final IContainer oldFolder = this.folder.getFolder();
final String oldPath = this.folder.getPathName();
this.folder.set(folder, pathName);
for (final IPhpWebProjectListener listener : listeners) {
listener.onChangedFolder(PhpWebProject.this, this.folder, oldFolder, folder, oldPath, pathName);
}
}
}
}