/* * Copyright 2011-2012 Amazon Technologies, Inc. * * Licensed 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://aws.amazon.com/apache2.0 * * This file 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 com.amazonaws.eclipse.explorer.s3; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.Action; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.forms.IFormColors; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.part.EditorPart; import org.eclipse.ui.statushandlers.StatusManager; import com.amazonaws.AmazonClientException; import com.amazonaws.eclipse.core.AwsToolkitCore; import com.amazonaws.eclipse.explorer.s3.acls.EditBucketPermissionsDialog; import com.amazonaws.eclipse.explorer.s3.acls.EditPermissionsDialog; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.AccessControlList; import com.amazonaws.services.s3.model.Bucket; public class BucketEditor extends EditorPart { public final static String ID = "com.amazonaws.eclipse.explorer.s3.bucketEditor"; private BucketEditorInput bucketEditorInput; private S3ObjectSummaryTable objectSummaryTable; public S3ObjectSummaryTable getObjectSummaryTable() { return objectSummaryTable; } @Override public void doSave(IProgressMonitor monitor) {} @Override public void doSaveAs() {} @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { setSite(site); setInput(input); bucketEditorInput = (BucketEditorInput) input; setPartName(input.getName()); } @Override public boolean isDirty() { return false; } @Override public boolean isSaveAsAllowed() { return false; } @Override public void createPartControl(Composite parent) { FormToolkit toolkit = new FormToolkit(Display.getDefault()); ScrolledForm form = new ScrolledForm(parent, SWT.V_SCROLL); form.setExpandHorizontal(true); form.setExpandVertical(true); form.setBackground(toolkit.getColors().getBackground()); form.setForeground(toolkit.getColors().getColor(IFormColors.TITLE)); form.setFont(JFaceResources.getHeaderFont()); form.setText(bucketEditorInput.getBucketName()); toolkit.decorateFormHeading(form.getForm()); form.setImage(AwsToolkitCore.getDefault().getImageRegistry().get(AwsToolkitCore.IMAGE_BUCKET)); form.getBody().setLayout(new GridLayout(1, false)); createBucketSummary(form, toolkit, bucketEditorInput.getBucketName()); createBucketObjectList(form, toolkit, bucketEditorInput.getBucketName()); form.getToolBarManager().add(new RefreshAction()); form.getToolBarManager().update(true); } private class RefreshAction extends Action { public RefreshAction() { this.setText("Refresh"); this.setToolTipText("Refresh bucket contents"); this.setImageDescriptor(AwsToolkitCore.getDefault().getImageRegistry().getDescriptor(AwsToolkitCore.IMAGE_REFRESH)); } @Override public void run() { objectSummaryTable.refresh(null); } } /** * Creates a table of buckets */ private void createBucketObjectList(final ScrolledForm form, final FormToolkit toolkit, final String bucketName) { objectSummaryTable = new S3ObjectSummaryTable(bucketEditorInput.getAccountId(), bucketEditorInput.getBucketName(), bucketEditorInput.getRegionEndpoint(), form.getBody(), toolkit, SWT.None); objectSummaryTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); } /** * Creates a summary of a bucket */ private void createBucketSummary(final ScrolledForm form, final FormToolkit toolkit, final String bucketName) { final Composite parent = toolkit.createComposite(form.getBody(), SWT.None); parent.setLayout(new GridLayout(2, false)); toolkit.createLabel(parent, "Bucket info loading"); toolkit.createLabel(parent, ""); new Thread() { @Override public void run() { Bucket bucket = null; // TODO: We don't need to list all the buckets just to get one for ( Bucket b : AwsToolkitCore.getClientFactory().getS3Client().listBuckets() ) { if ( b.getName().equals(bucketEditorInput.getName()) ) { bucket = b; break; } } if ( bucket == null ) return; updateComposite(form, toolkit, bucket); } protected void updateComposite(final ScrolledForm form, final FormToolkit toolkit, final Bucket b) { Display.getDefault().syncExec(new Runnable() { public void run() { for ( Control c : parent.getChildren() ) { c.dispose(); } toolkit.createLabel(parent, "Owner: "); toolkit.createLabel(parent, b.getOwner().getDisplayName()); toolkit.createLabel(parent, "Creation Date: "); toolkit.createLabel(parent, b.getCreationDate().toString()); Button editBucketAclButton = toolkit.createButton(parent, "Edit Bucket ACL", SWT.PUSH); editBucketAclButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { final EditPermissionsDialog editPermissionsDialog = new EditBucketPermissionsDialog(b); if (editPermissionsDialog.open() == 0) { final AmazonS3 s3 = AwsToolkitCore.getClientFactory().getS3ClientByEndpoint(bucketEditorInput.getRegionEndpoint()); new Job("Updating bucket ACL") { @Override protected IStatus run(IProgressMonitor monitor) { try { AccessControlList newAcl = editPermissionsDialog.getAccessControlList(); s3.setBucketAcl(b.getName(), editPermissionsDialog.getAccessControlList()); } catch (AmazonClientException ace) { Status status = new Status(IStatus.ERROR, AwsToolkitCore.PLUGIN_ID, "Unable to update bucket ACL: " + ace.getMessage(), ace); StatusManager.getManager().handle(status, StatusManager.SHOW); } return Status.OK_STATUS; } }.schedule(); } } public void widgetDefaultSelected(SelectionEvent e) {} }); form.reflow(true); } }); } }.start(); } @Override public void setFocus() { } }