Java tutorial
/* * 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.openaz.xacml.admin.view.windows; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.openaz.xacml.admin.XacmlAdminUI; import org.apache.openaz.xacml.admin.model.GitRepositoryContainer; import org.apache.openaz.xacml.admin.model.GitRepositoryContainer.FileItem; import org.apache.openaz.xacml.admin.util.AdminNotification; import org.apache.openaz.xacml.std.pap.StdPDPPolicy; import com.vaadin.annotations.AutoGenerated; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.event.ItemClickEvent; import com.vaadin.event.ItemClickEvent.ItemClickListener; import com.vaadin.event.ShortcutAction.KeyCode; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.TreeTable; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; public class SelectWorkspacePoliciesWindow extends Window { @AutoGenerated private VerticalLayout mainLayout; @AutoGenerated private Button buttonSave; @AutoGenerated private TreeTable treeWorkspace; private static Log logger = LogFactory.getLog(SelectWorkspacePoliciesWindow.class); /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ /** * */ private static final long serialVersionUID = 1L; private final SelectWorkspacePoliciesWindow self = this; private GitRepositoryContainer treeContainer; private boolean isSaved = false; private StdPDPPolicy selectedPolicy = null; /** * The constructor should first build the main layout, set the * composition root and then do any custom initialization. * * The constructor will not be automatically regenerated by the * visual editor. */ public SelectWorkspacePoliciesWindow() { buildMainLayout(); //setCompositionRoot(mainLayout); setContent(mainLayout); // // Shortcuts // this.setCloseShortcut(KeyCode.ESCAPE); this.buttonSave.setClickShortcut(KeyCode.ENTER); // // // this.initializeTree(); this.initializeButton(); // // // this.treeWorkspace.focus(); } protected void initializeTree() { // // This is where the user's Git repository is located // final Path gitPath = ((XacmlAdminUI) UI.getCurrent()).getUserGitPath(); // // Create our Git file system container // this.treeContainer = new GitRepositoryContainer(gitPath, gitPath.toFile()); // // Create our own filter to filter out File extensions and // also the Git directory. // this.treeContainer.setFilter(new FilenameFilter() { @Override public boolean accept(File dir, String name) { // // We don't want any of the hidden files // if (name.startsWith(".git") || name.equals(".DS_Store")) { return false; } // // We definitely want xml files // if (name.endsWith(".xml")) { return true; } // // We should test if its a directory, we want those // included. // Path path = Paths.get(dir.getAbsolutePath(), name); if (Files.isDirectory(path)) { return true; } logger.warn("Filtering out: " + path.toString()); return false; } }); // // Set TreeTables datasource as our git container // this.treeWorkspace.setContainerDataSource(this.treeContainer); // // Setup other properties etc. // this.treeWorkspace.setItemIconPropertyId("Icon"); this.treeWorkspace.setVisibleColumns(new Object[] { "Name", "Version", "Size", "Last Modified", "Status" }); this.treeWorkspace.setSizeFull(); this.treeWorkspace.setSelectable(true); this.treeWorkspace.setEditable(false); // // Expand the first couple of directories // for (Object id : this.treeWorkspace.getItemIds()) { this.treeWorkspace.setCollapsed(id, false); for (Object child : this.treeWorkspace.getChildren(id)) { this.treeWorkspace.setCollapsed(child, false); } } // // Respond to table selections // this.treeWorkspace.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; @Override public void valueChange(ValueChangeEvent event) { if (self.treeWorkspace.getValue() != null) { self.buttonSave.setEnabled(true); } else { self.buttonSave.setEnabled(false); } } }); // // Double-click events // this.treeWorkspace.addItemClickListener(new ItemClickListener() { private static final long serialVersionUID = 1L; @Override public void itemClick(ItemClickEvent event) { if (event.isDoubleClick()) { // // Save and close // self.doSave(); } } }); } protected void initializeButton() { this.buttonSave.addClickListener(new ClickListener() { private static final long serialVersionUID = 1L; @Override public void buttonClick(ClickEvent event) { assert treeWorkspace.getValue() != null; // // Save everything // self.doSave(); } }); } protected void doSave() { // // Get the current selection // FileItem selectedItem = (FileItem) this.treeWorkspace.getItem(this.treeWorkspace.getValue()); // // // assert selectedItem != null; if (selectedItem == null) { return; } // create the id of the target file // Our standard for file naming is: // <domain>.<filename>.<version>.xml // since the file name usually has a ".xml", we need to strip that before adding the other parts String name = selectedItem.getName(); String id = name; if (id.endsWith(".xml")) { id = id.substring(0, id.length() - 4); } // add on the version string String version = selectedItem.getVersion(); id += "." + version; // put the .xml on the end id += ".xml"; // tack on the domain in front. Do this one level at a time until we reach one of the roots File parentFile = selectedItem.getFile(); while ((parentFile = (File) this.treeWorkspace.getParent(parentFile)) != null) { if (this.treeContainer.isRoot(parentFile)) { break; } id = parentFile.getName() + "." + id; } // Default policy to be Root policy; user can change to deferred later URI selectedURI = selectedItem.getFile().toURI(); try { // // Create the policy // this.selectedPolicy = new StdPDPPolicy(id, true, name, selectedURI); // // Mark ourselves as saved // this.isSaved = true; } catch (IOException e) { logger.error("Unable to create policy '" + id + "': " + e.getMessage()); AdminNotification.warn("Unable to create policy '" + id + "': " + e.getMessage()); } // // Close the window // this.close(); } public boolean isSaved() { return this.isSaved; } public StdPDPPolicy getSelectedPolicy() { return this.selectedPolicy; } @AutoGenerated private VerticalLayout buildMainLayout() { // common part: create layout mainLayout = new VerticalLayout(); mainLayout.setImmediate(false); mainLayout.setWidth("-1px"); mainLayout.setHeight("-1px"); mainLayout.setMargin(true); mainLayout.setSpacing(true); // top-level component properties setWidth("-1px"); setHeight("-1px"); // treeWorkspace treeWorkspace = new TreeTable(); treeWorkspace.setCaption("Select Policy(s) for PDP Group"); treeWorkspace.setImmediate(true); treeWorkspace.setWidth("100.0%"); treeWorkspace.setHeight("-1px"); mainLayout.addComponent(treeWorkspace); // buttonSave buttonSave = new Button(); buttonSave.setCaption("Save"); buttonSave.setImmediate(false); buttonSave.setWidth("-1px"); buttonSave.setHeight("-1px"); mainLayout.addComponent(buttonSave); mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); return mainLayout; } }