/* * 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.data.Item; import com.vaadin.data.Property; import com.vaadin.data.fieldgroup.FieldGroup; import com.vaadin.data.util.IndexedContainer; import com.vaadin.ui.*; import org.apache.usergrid.chop.api.ProviderParams; import org.apache.usergrid.chop.stack.User; import org.apache.usergrid.chop.webapp.dao.ProviderParamsDao; import org.apache.usergrid.chop.webapp.dao.UserDao; import org.apache.usergrid.chop.webapp.dao.model.BasicProviderParams; import org.apache.usergrid.chop.webapp.service.InjectorFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; @SuppressWarnings("unchecked") public class UserSubwindow extends Window { private static final Logger LOG = LoggerFactory.getLogger(UserSubwindow.class); private static final String USERNAME = "Username"; private static final String PASSWORD = "Password"; private static final String INSTANCE_TYPE = "Instance Type"; private static final String ACCESS_KEY = "Access Key"; private static final String SECRET_KEY = "Secret Key"; private static final String IMAGE_ID = "Image Id"; private static final String KEY_PAIR_NAME = "Key Pair Name"; private static final String[] FIELD_NAMES = new String[]{ USERNAME, PASSWORD, INSTANCE_TYPE, ACCESS_KEY, SECRET_KEY, IMAGE_ID, KEY_PAIR_NAME }; private final UserDao userDao = InjectorFactory.getInstance(UserDao.class); private final ProviderParamsDao providerParamsDao = InjectorFactory.getInstance(ProviderParamsDao.class); private final Table userList = new Table(); private final Button addNewUserButton = new Button("New"); private final Button removeUserButton = new Button("Remove this user"); private final Button saveButton = new Button("Save All"); private final Button closeButton = new Button("Close"); private final FormLayout userEditLayout = new FormLayout(); private final FieldGroup editorFields = new FieldGroup(); private final IndexedContainer userContainer; private final KeyListLayout keyListLayout = new KeyListLayout(); /* * After UI class is created, init() is executed. You should build and wire * up your user interface here. */ public UserSubwindow() { super("User Manager"); userContainer = loadUserList(); init(); initLayout(); initUserList(); initUserEditLayout(); initButtons(); } private IndexedContainer loadUserList() { IndexedContainer ic = new IndexedContainer(); for (String fieldName : FIELD_NAMES) { ic.addContainerProperty(fieldName, String.class, ""); } List<User> users = userDao.getList(); for (User user : users) { ProviderParams params = providerParamsDao.getByUser(user.getUsername()); Object id = ic.addItem(); ic.getContainerProperty(id, USERNAME).setValue(user.getUsername()); ic.getContainerProperty(id, PASSWORD).setValue(user.getPassword()); if (params != null) { ic.getContainerProperty(id, ACCESS_KEY).setValue(params.getAccessKey()); ic.getContainerProperty(id, IMAGE_ID).setValue(params.getImageId()); ic.getContainerProperty(id, INSTANCE_TYPE).setValue(params.getInstanceType()); ic.getContainerProperty(id, SECRET_KEY).setValue(params.getSecretKey()); ic.getContainerProperty(id, KEY_PAIR_NAME).setValue(params.getKeyName()); } else { ic.getContainerProperty(id, ACCESS_KEY).setValue(""); ic.getContainerProperty(id, IMAGE_ID).setValue(""); ic.getContainerProperty(id, INSTANCE_TYPE).setValue(""); ic.getContainerProperty(id, KEY_PAIR_NAME).setValue(""); ic.getContainerProperty(id, SECRET_KEY).setValue(""); } } return ic; } private void init() { setHeight("100%"); setWidth("100%"); center(); setClosable(false); setModal(true); } private void initLayout() { // Root of the user interface component tree is set HorizontalSplitPanel splitPanel = new HorizontalSplitPanel(); setContent(splitPanel); // Build the component tree VerticalLayout leftLayout = new VerticalLayout(); splitPanel.addComponent(leftLayout); splitPanel.addComponent(userEditLayout); leftLayout.addComponent(userList); HorizontalLayout buttonsLayout = new HorizontalLayout(); buttonsLayout.addComponent(addNewUserButton); buttonsLayout.addComponent(saveButton); buttonsLayout.addComponent(closeButton); leftLayout.addComponent(buttonsLayout); // Set the contents in the left of the split panel to use all the space leftLayout.setSizeFull(); // On the left side, expand the size of userList so that it uses all the space left after from bottomLeftLayout leftLayout.setExpandRatio(userList, 1); userList.setSizeFull(); // Put a little margin around the fields in the right side editor userEditLayout.setMargin(true); userEditLayout.setVisible(false); } private void initUserEditLayout() { // User interface can be created dynamically to reflect underlying data for (String fieldName : FIELD_NAMES) { TextField field = new TextField(fieldName); userEditLayout.addComponent(field); field.setWidth("100%"); // We use a FieldGroup to connect multiple components to a data source at once. editorFields.bind(field, fieldName); } userEditLayout.addComponent(removeUserButton); userEditLayout.addComponent(keyListLayout); /* * Data can be buffered in the user interface. When doing so, commit() * writes the changes to the data source. Here we choose to write the * changes automatically without calling commit(). */ editorFields.setBuffered(false); } private void initButtons() { addNewUserButton.addClickListener(new Button.ClickListener() { public void buttonClick(Button.ClickEvent event) { /* * Rows in the Container data model are called Item. Here we add * a new row in the beginning of the list. */ userContainer.removeAllContainerFilters(); Object contactId = userContainer.addItemAt(0); /* * Each Item has a set of Properties that hold values. Here we * set a couple of those. */ userList.getContainerProperty(contactId, USERNAME).setValue( "Username"); userList.getContainerProperty(contactId, PASSWORD).setValue( "Password"); /* Lets choose the newly created contact to edit it. */ userList.select(contactId); } }); removeUserButton.addClickListener(new Button.ClickListener() { public void buttonClick(Button.ClickEvent event) { Object contactId = userList.getValue(); userList.removeItem(contactId); String username = (String) userList.getItem(contactId).getItemProperty(USERNAME).getValue(); userDao.delete(username); } }); closeButton.addClickListener(new Button.ClickListener() { public void buttonClick(Button.ClickEvent event) { close(); } }); saveButton.addClickListener(new Button.ClickListener() { public void buttonClick(Button.ClickEvent event) { for (Object itemId : userList.getItemIds()) { String username = (String) userList.getItem(itemId).getItemProperty(USERNAME).getValue(); String password = (String) userList.getItem(itemId).getItemProperty(PASSWORD).getValue(); String instanceType = (String) userList.getItem(itemId) .getItemProperty(INSTANCE_TYPE) .getValue(); String accessKey = (String) userList.getItem(itemId).getItemProperty(ACCESS_KEY).getValue(); String secretKey = (String) userList.getItem(itemId).getItemProperty(SECRET_KEY).getValue(); String imageId = (String) userList.getItem(itemId).getItemProperty(IMAGE_ID).getValue(); String keyPairName = (String) userList.getItem(itemId) .getItemProperty(KEY_PAIR_NAME) .getValue(); try { userDao.save(new User(username, password)); BasicProviderParams pParams = new BasicProviderParams(username, instanceType, accessKey, secretKey, imageId, keyPairName); ProviderParams old = providerParamsDao.getByUser(username); if (old != null) { pParams.setKeys(old.getKeys()); } providerParamsDao.save(pParams); } catch (Exception e) { LOG.error("Error while saving a user: ", e); } } close(); } }); } private void initUserList() { userList.setContainerDataSource(userContainer); userList.setVisibleColumns(new String[]{USERNAME}); userList.setSelectable(true); userList.setImmediate(true); userList.addValueChangeListener(new Property.ValueChangeListener() { public void valueChange(Property.ValueChangeEvent event) { showSelectedUser(); } }); } private void showSelectedUser() { Object itemId = userList.getValue(); userEditLayout.setVisible(itemId != null); /** * When a contact is selected from the list, we want to show that in our editor on the right. * This is nicely done by the FieldGroup that binds all the fields to the corresponding Properties * in our contact at once. */ if (itemId == null) { return; } Item userItem = userList.getItem(itemId); editorFields.setItemDataSource(userItem); String username = (String) userItem.getItemProperty(USERNAME).getValue(); keyListLayout.loadKeys(username); } }