org.apache.usergrid.chop.webapp.view.user.KeyListLayout.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.usergrid.chop.webapp.view.user.KeyListLayout.java

Source

/*
 * 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.apache.usergrid.chop.webapp.view.user;

import com.vaadin.ui.*;
import com.vaadin.ui.themes.Reindeer;
import org.apache.usergrid.chop.webapp.service.InjectorFactory;
import org.apache.usergrid.chop.webapp.service.KeyService;
import org.apache.usergrid.chop.webapp.view.util.UIUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.attribute.PosixFilePermission;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class KeyListLayout extends AbsoluteLayout implements Upload.Receiver, Upload.SucceededListener {

    private static final Logger LOG = LoggerFactory.getLogger(KeyListLayout.class);

    private final KeyService keyService = InjectorFactory.getInstance(KeyService.class);

    private final TextField keyNameField = new TextField("Key Pair Name:");

    private final int START_TOP = 160;

    private final ArrayList<String> keyNames = new ArrayList<String>();
    private final ArrayList<Label> keyLabels = new ArrayList<Label>();
    private final ArrayList<Button> keyRemoveButtons = new ArrayList<Button>();

    private String username;

    KeyListLayout() {
        init();
        addTitleLabel();
        addUploadControls();
    }

    private void init() {
        setHeight("400px");
        setWidth("500px");
    }

    void addTitleLabel() {
        UIUtil.addLabel(this, "<b>Manage Keys</b>", "left: 0px; top: 10px;", "120px");
    }

    void addUploadControls() {

        keyNameField.setWidth("290px");
        keyNameField.setValue("key-pair-name");
        addComponent(keyNameField, "left: 0px; top: 50px;");

        Upload upload = new Upload("", this);
        upload.setButtonCaption("Add");
        upload.addSucceededListener(this);

        addComponent(upload, "left: 0px; top: 80px;");
    }

    @Override
    public OutputStream receiveUpload(String fileName, String mimeType) {

        FileOutputStream outStream = null;

        try {
            File file = keyService.addFile(username, keyNameField.getValue(), fileName);
            outStream = new FileOutputStream(file);
            /** SSH requires that key files only have read-write permissions for OWNER */
            Set<PosixFilePermission> permissions = new HashSet<PosixFilePermission>();
            permissions.add(PosixFilePermission.OWNER_READ);
            permissions.add(PosixFilePermission.OWNER_WRITE);
            Files.setPosixFilePermissions(file.toPath(), permissions);
        } catch (IOException e) {
            LOG.error("Error while setting key file permissions.", e);
        }

        return outStream;
    }

    @Override
    public void uploadSucceeded(Upload.SucceededEvent succeededEvent) {
        loadKeys();
        Notification.show("Upload", "File uploaded!", Notification.Type.TRAY_NOTIFICATION);
    }

    public void loadKeys(String username) {
        this.username = username;
        loadKeys();
    }

    private void clearKeys() {
        for (Label label : keyLabels) {
            removeComponent(label);
        }

        for (Button button : keyRemoveButtons) {
            removeComponent(button);
        }

        keyNames.clear();
        keyLabels.clear();
        keyRemoveButtons.clear();
    }

    private void loadKeys() {

        clearKeys();

        Map<String, String> keys = keyService.getKeys(username);
        int top = START_TOP;

        for (Map.Entry<String, String> e : keys.entrySet()) {
            keyNames.add(e.getKey());
            addKeyLabel(e.getKey(), e.getValue(), top);
            addKeyRemoveButton(e.getKey(), top);
            top += 20;
        }
    }

    private void addKeyLabel(String keyPairName, String filePath, int top) {

        String text = String.format("%s: %s", keyPairName, filePath);
        String position = String.format("left: 30px; top: %spx;", top);

        Label label = UIUtil.addLabel(this, text, position, "500px");
        keyLabels.add(label);
    }

    private void addKeyRemoveButton(final String keyName, int top) {

        String position = String.format("left: 0px; top: %spx;", top);

        Button button = UIUtil.addButton(this, "[X]", position, "25px");
        button.setStyleName(Reindeer.BUTTON_LINK);

        button.addClickListener(new Button.ClickListener() {
            public void buttonClick(Button.ClickEvent event) {
                removeKey(keyName);
            }
        });

        keyRemoveButtons.add(button);
    }

    private void removeKey(String keyName) {
        keyService.removeKey(username, keyName);
        loadKeys();
    }

    public void disableKeyLabels() {
        for (Label l : keyLabels) {
            l.setVisible(false);
        }
    }
}