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.IOException; import java.nio.file.Path; import java.nio.file.Paths; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.Status; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.dircache.DirCache; import org.eclipse.jgit.dircache.DirCacheEntry; import org.eclipse.jgit.errors.NoWorkTreeException; import org.apache.openaz.xacml.admin.XacmlAdminUI; import org.apache.openaz.xacml.admin.model.GitStatusContainer; import org.apache.openaz.xacml.admin.model.GitStatusContainer.GitEntry; import org.apache.openaz.xacml.admin.model.GitStatusContainer.StatusItem; import org.apache.openaz.xacml.admin.util.AdminNotification; import com.vaadin.annotations.AutoGenerated; import com.vaadin.data.Buffered.SourceException; import com.vaadin.data.Item; import com.vaadin.data.Validator.InvalidValueException; import com.vaadin.event.FieldEvents.TextChangeEvent; import com.vaadin.event.FieldEvents.TextChangeListener; 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.Table; import com.vaadin.ui.Table.ColumnGenerator; import com.vaadin.ui.TextArea; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; public class GitPushWindow extends Window { /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ @AutoGenerated private VerticalLayout mainLayout; @AutoGenerated private Button buttonPush; @AutoGenerated private Table tableChanges; @AutoGenerated private TextArea textAreaComments; /** * */ private static final long serialVersionUID = 1L; private static final Log logger = LogFactory.getLog(GitPushWindow.class); private final GitPushWindow self = this; private final GitStatusContainer container; private final Git git; private final File target; private boolean isSaved = false; /** * 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. * @param git * @param status */ public GitPushWindow(Git git, File target, Status status) { buildMainLayout(); //setCompositionRoot(mainLayout); setContent(mainLayout); // // Save data // this.git = git; this.target = target; this.container = new GitStatusContainer(status); // // Set our shortcuts // this.setCloseShortcut(KeyCode.ESCAPE); // // Initialize GUI // this.initializeText(); this.initializeTable(status); this.initializeButtons(); // // Focus // this.textAreaComments.focus(); } protected void initializeText() { this.textAreaComments.setImmediate(true); this.textAreaComments.addTextChangeListener(new TextChangeListener() { private static final long serialVersionUID = 1L; @Override public void textChange(TextChangeEvent event) { if (event.getText().isEmpty()) { self.buttonPush.setEnabled(false); } else { if (self.container.getConflictCount() == 0) { self.buttonPush.setEnabled(true); } else { self.buttonPush.setEnabled(false); } } } }); } protected void initializeTable(Status status) { // // Setup the table // this.tableChanges.setContainerDataSource(this.container); this.tableChanges.setPageLength(this.container.size()); this.tableChanges.setImmediate(true); // // Generate column // this.tableChanges.addGeneratedColumn("Entry", new ColumnGenerator() { private static final long serialVersionUID = 1L; @Override public Object generateCell(Table source, Object itemId, Object columnId) { Item item = self.container.getItem(itemId); assert item != null; if (item instanceof StatusItem) { return self.generateGitEntryComponent(((StatusItem) item).getGitEntry()); } assert item instanceof StatusItem; return null; } }); } protected Object generateGitEntryComponent(final GitEntry entry) { // // If its conflicting, take care of it // if (entry.isConflicting()) { return this.generateConflictingEntry(entry); } if (entry.isUntracked()) { return this.generateUntrackedEntry(entry); } /* if (entry.isChanged() || entry.isModified() || entry.isUncommitted()) { return this.generateUncommittedEntry(entry); } */ return null; } protected Object generateConflictingEntry(final GitEntry entry) { Button resolve = new Button("Resolve"); resolve.setImmediate(true); resolve.addClickListener(new ClickListener() { private static final long serialVersionUID = 1L; @Override public void buttonClick(ClickEvent event) { } }); return resolve; } protected Object generateUntrackedEntry(final GitEntry entry) { Button add = new Button("Add"); add.setImmediate(true); add.addClickListener(new ClickListener() { private static final long serialVersionUID = 1L; @Override public void buttonClick(ClickEvent event) { try { DirCache cache = self.git.add().addFilepattern(entry.getName()).call(); DirCacheEntry cacheEntry = cache.getEntry(entry.getName()); assert cacheEntry != null; if (cacheEntry == null) { return; } if (cacheEntry.isMerged()) { self.refreshStatus(); } } catch (GitAPIException e) { String error = "Failed to add: " + e.getLocalizedMessage(); logger.error(error); AdminNotification.error(error); } } }); return add; } protected Object generateUncommittedEntry(final GitEntry entry) { Button commit = new Button("Commit"); commit.setImmediate(true); commit.addClickListener(new ClickListener() { private static final long serialVersionUID = 1L; @Override public void buttonClick(ClickEvent event) { } }); return commit; } protected void initializeButtons() { this.buttonPush.setEnabled(false); this.buttonPush.addClickListener(new ClickListener() { private static final long serialVersionUID = 1L; @Override public void buttonClick(ClickEvent event) { try { // // Commit // self.textAreaComments.commit(); // // Mark as saved // self.isSaved = true; // // Close the window // self.close(); } catch (SourceException | InvalidValueException idontcare) { //NOPMD // // Vaadin will highlight the failed requirement or validation // } } }); } protected void refreshStatus() { try { // // Grab our working repository // Path repoPath = ((XacmlAdminUI) getUI()).getUserGitPath(); final Git git = Git.open(repoPath.toFile()); // // Get our status // final String base; Status status; if (target == null) { base = "."; } else { Path relativePath = repoPath.relativize(Paths.get(target.getPath())); base = relativePath.toString(); } if (logger.isDebugEnabled()) { logger.debug("Status on base: " + base); } status = git.status().addPath(base).call(); // // Pass it to our container // this.container.refreshStatus(status); this.tableChanges.refreshRowCache(); } catch (NoWorkTreeException | IOException | GitAPIException e) { String error = "Failed to refresh status: " + e.getLocalizedMessage(); logger.error(error); } } public boolean isSaved() { return this.isSaved; } public String getComment() { return this.textAreaComments.getValue(); } @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"); // textAreaComments textAreaComments = new TextArea(); textAreaComments.setCaption("Add Comments"); textAreaComments.setImmediate(false); textAreaComments.setDescription( "Enter comments that reflect the changes you have made to the repository domains and/or policy files."); textAreaComments.setWidth("400px"); textAreaComments.setHeight("-1px"); textAreaComments.setInvalidAllowed(false); textAreaComments.setRequired(true); textAreaComments.setInputPrompt("Eg. Add new rule for employees in marketing department."); mainLayout.addComponent(textAreaComments); // tableChanges tableChanges = new Table(); tableChanges.setCaption("Changes To Be Pushed"); tableChanges.setImmediate(false); tableChanges.setWidth("100.0%"); tableChanges.setHeight("-1px"); mainLayout.addComponent(tableChanges); mainLayout.setExpandRatio(tableChanges, 1.0f); // buttonPush buttonPush = new Button(); buttonPush.setCaption("Push Changes"); buttonPush.setImmediate(true); buttonPush.setWidth("-1px"); buttonPush.setHeight("-1px"); mainLayout.addComponent(buttonPush); mainLayout.setComponentAlignment(buttonPush, new Alignment(48)); return mainLayout; } }