package org.maziarz.yiiclipse.wizards;
import java.io.ByteArrayInputStream;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileInfo;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.undo.CreateFileOperation;
import org.eclipse.ui.ide.undo.CreateFolderOperation;
import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
import org.maziarz.yiiclipse.YiiclipseBundle;
public class YiiProjectWorkspaceHelper {
private IRunnableContext runnableContext;
public static YiiProjectWorkspaceHelper INSTANCE = new YiiProjectWorkspaceHelper();
public void buildBasicProjectStructure(IRunnableContext context, IProject project) {
this.runnableContext = context;
IFolder folder;
folder = this.createFolder(project, "assets");
putOtherWritePermission(folder);
this.createFolder(project, "css");
this.createFolder(project, "images");
this.createFolder(project, "protected");
this.createFolder(project, "protected/components");
this.createFolder(project, "protected/config");
this.createFolder(project, "protected/controllers");
this.createFolder(project, "protected/data");
folder = this.createFolder(project, "protected/runtime");
putOtherWritePermission(folder);
this.createFolder(project, "protected/views");
this.createFolder(project, "protected/models");
this.createFolder(project, "protected/views/layouts");
}
private void putOtherWritePermission(IFolder folder) {
int permissions = this.fetchPermissions(folder);
int other_write = permissions | EFS.ATTRIBUTE_OTHER_WRITE;
this.putPermissions(folder, other_write);
}
public IFolder createFolder(IContainer container, String folderName) {
IPath folderPath = container.getFullPath().append(folderName);
IWorkspaceRoot workspaceRoot = container.getWorkspace().getRoot();
IFolder folderHandle = workspaceRoot.getFolder(folderPath);
ISafeRunnable op = this.createFolderOperation(folderHandle);
SafeRunner.run(op);
return folderHandle;
}
private ISafeRunnable createFolderOperation(final IFolder folderHandle) {
return new ISafeRunnable() {
@Override
public void run() throws Exception {
CreateFolderOperation op = new CreateFolderOperation(folderHandle, null, "Creating folder");
op.execute(null, WorkspaceUndoUtil.getUIInfoAdapter(getShell()));
YiiclipseBundle.debug("Folder created: "+folderHandle);
}
@Override
public void handleException(Throwable exception) {
}
};
}
protected IRunnableWithProgress createFolderOperationWithProgress(final IFolder folderHandle) {
return new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
CreateFolderOperation op = new CreateFolderOperation(folderHandle, null, "Creating folder");
try {
op.execute(monitor, WorkspaceUndoUtil.getUIInfoAdapter(getShell()));
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
};
}
public IFile createFile(IContainer container, String fileName) {
IPath filePath =container.getFullPath().append(fileName);
IWorkspaceRoot workspaceRoot = container.getWorkspace().getRoot();
IFile fileHandle = workspaceRoot.getFile(filePath);
ISafeRunnable op = this.createFileOperation(fileHandle);
SafeRunner.run(op);
return fileHandle;
}
private ISafeRunnable createFileOperation(final IFile fileHandle) {
return new ISafeRunnable() {
@Override
public void run() throws Exception {
CreateFileOperation op = new CreateFileOperation(fileHandle, null, new ByteArrayInputStream("".getBytes()), "Creating file");
op.execute(null, WorkspaceUndoUtil.getUIInfoAdapter(getShell()));
YiiclipseBundle.debug("File created: "+fileHandle);
}
@Override
public void handleException(Throwable exception) {
}
};
}
private IRunnableWithProgress createFileOperationWithProgress(final IFile fileHandle) {
return new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
CreateFileOperation op = new CreateFileOperation(fileHandle, null, new ByteArrayInputStream("".getBytes()), "Creating file");
try {
op.execute(monitor, WorkspaceUndoUtil.getUIInfoAdapter(getShell()));
} catch (ExecutionException e) {
throw new IllegalStateException(e);
}
}
};
}
protected void performOperationWithBusyCursor(IRunnableWithProgress runnable, String title) {
try {
// PlatformUI.getWorkbench().getProgressService().busyCursorWhile(runnable);
runnableContext.run(true, false, runnable);
} catch (InterruptedException e) {
return;
} catch (InvocationTargetException e) {
MessageDialog.openError(getShell(), title + " Error", e.getTargetException().getMessage());
return;
}
}
public Shell getShell() {
if (runnableContext instanceof IWizardContainer) {
return ((IWizardContainer) runnableContext).getShell();
}
return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
}
private int fetchPermissions(IResource resource) {
IFileStore store = null;
try {
store = EFS.getStore(resource.getLocationURI());
} catch (CoreException e) {
return 0;
}
IFileInfo info = store.fetchInfo();
int permissions = 0;
if (info.exists()) {
permissions |= info.getAttribute(EFS.ATTRIBUTE_OWNER_READ) ? EFS.ATTRIBUTE_OWNER_READ : 0;
permissions |= info.getAttribute(EFS.ATTRIBUTE_OWNER_WRITE) ? EFS.ATTRIBUTE_OWNER_WRITE : 0;
permissions |= info.getAttribute(EFS.ATTRIBUTE_OWNER_EXECUTE) ? EFS.ATTRIBUTE_OWNER_EXECUTE : 0;
permissions |= info.getAttribute(EFS.ATTRIBUTE_GROUP_READ) ? EFS.ATTRIBUTE_GROUP_READ : 0;
permissions |= info.getAttribute(EFS.ATTRIBUTE_GROUP_WRITE) ? EFS.ATTRIBUTE_GROUP_WRITE : 0;
permissions |= info.getAttribute(EFS.ATTRIBUTE_GROUP_EXECUTE) ? EFS.ATTRIBUTE_GROUP_EXECUTE : 0;
permissions |= info.getAttribute(EFS.ATTRIBUTE_OTHER_READ) ? EFS.ATTRIBUTE_OTHER_READ : 0;
permissions |= info.getAttribute(EFS.ATTRIBUTE_OTHER_WRITE) ? EFS.ATTRIBUTE_OTHER_WRITE : 0;
permissions |= info.getAttribute(EFS.ATTRIBUTE_OTHER_EXECUTE) ? EFS.ATTRIBUTE_OTHER_EXECUTE : 0;
permissions |= info.getAttribute(EFS.ATTRIBUTE_IMMUTABLE) ? EFS.ATTRIBUTE_IMMUTABLE : 0;
}
return permissions;
}
private boolean putPermissions(IResource resource, int permissions) {
IFileStore store = null;
try {
store = EFS.getStore(resource.getLocationURI());
} catch (CoreException e) {
return false;
}
IFileInfo fileInfo = store.fetchInfo();
if (!fileInfo.exists())
return false;
fileInfo.setAttribute(EFS.ATTRIBUTE_OWNER_READ, (permissions & EFS.ATTRIBUTE_OWNER_READ) != 0);
fileInfo.setAttribute(EFS.ATTRIBUTE_OWNER_WRITE, (permissions & EFS.ATTRIBUTE_OWNER_WRITE) != 0);
fileInfo.setAttribute(EFS.ATTRIBUTE_OWNER_EXECUTE, (permissions & EFS.ATTRIBUTE_OWNER_EXECUTE) != 0);
fileInfo.setAttribute(EFS.ATTRIBUTE_GROUP_READ, (permissions & EFS.ATTRIBUTE_GROUP_READ) != 0);
fileInfo.setAttribute(EFS.ATTRIBUTE_GROUP_WRITE, (permissions & EFS.ATTRIBUTE_GROUP_WRITE) != 0);
fileInfo.setAttribute(EFS.ATTRIBUTE_GROUP_EXECUTE, (permissions & EFS.ATTRIBUTE_GROUP_EXECUTE) != 0);
fileInfo.setAttribute(EFS.ATTRIBUTE_OTHER_READ, (permissions & EFS.ATTRIBUTE_OTHER_READ) != 0);
fileInfo.setAttribute(EFS.ATTRIBUTE_OTHER_WRITE, (permissions & EFS.ATTRIBUTE_OTHER_WRITE) != 0);
fileInfo.setAttribute(EFS.ATTRIBUTE_OTHER_EXECUTE, (permissions & EFS.ATTRIBUTE_OTHER_EXECUTE) != 0);
fileInfo.setAttribute(EFS.ATTRIBUTE_IMMUTABLE, (permissions & EFS.ATTRIBUTE_IMMUTABLE) != 0);
try {
store.putInfo(fileInfo, EFS.SET_ATTRIBUTES, null);
} catch (CoreException e) {
return false;
}
return true;
}
}