Java tutorial
/* Copyright 2017 Microsoft Open 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://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 com.microsoftopentechnologies.windowsazurestorage.service; import com.microsoftopentechnologies.windowsazurestorage.AzureBlobMetadataPair; import com.microsoftopentechnologies.windowsazurestorage.Messages; import com.microsoftopentechnologies.windowsazurestorage.exceptions.WAStorageException; import com.microsoftopentechnologies.windowsazurestorage.helper.Constants; import com.microsoftopentechnologies.windowsazurestorage.service.model.PublisherServiceData; import com.microsoftopentechnologies.windowsazurestorage.service.model.UploadType; import hudson.EnvVars; import hudson.FilePath; import hudson.Util; import org.apache.commons.lang.StringUtils; import java.io.IOException; import java.net.URI; import java.util.HashMap; import java.util.StringTokenizer; public abstract class UploadService extends StoragePluginService<PublisherServiceData> { protected static final String zipFolderName = "artifactsArchive"; protected static final String zipName = "archive.zip"; protected UploadService(PublisherServiceData serviceData) { super(serviceData); } protected abstract void uploadIndividuals(String embeddedVP, FilePath[] paths) throws WAStorageException; protected abstract void uploadArchive(String archiveIncludes) throws WAStorageException; @Override public final int execute() throws WAStorageException { if (serviceData.getUploadType() == UploadType.INVALID) { // no files are uploaded println("Upload type is INVALID, nothing to do."); return 0; } int filesUploaded = 0; // Counter to track no. of files that are uploaded try { final FilePath workspacePath = serviceData.getRemoteWorkspace(); println(Messages.WAStoragePublisher_uploading()); final StringBuilder archiveIncludes = new StringBuilder(); StringTokenizer strTokens = new StringTokenizer(serviceData.getFilePath(), fpSeparator); while (strTokens.hasMoreElements()) { String fileName = strTokens.nextToken(); String embeddedVP = null; if (fileName != null && fileName.contains("::")) { int embVPSepIndex = fileName.indexOf("::"); // Separate fileName and Virtual directory name if (fileName.length() > embVPSepIndex + 1) { embeddedVP = fileName.substring(embVPSepIndex + 2, fileName.length()); if (StringUtils.isBlank(embeddedVP)) { embeddedVP = null; } else if (!embeddedVP.endsWith(Constants.FWD_SLASH)) { embeddedVP = embeddedVP + Constants.FWD_SLASH; } } fileName = fileName.substring(0, embVPSepIndex); } // List all the paths without the zip archives. FilePath[] paths = workspacePath.list(fileName, excludedFilesAndZip()); archiveIncludes.append(",").append(fileName); filesUploaded += paths.length; if (paths.length != 0 && serviceData.getUploadType() != UploadType.ZIP) { // the uploadType is either INDIVIDUAL or BOTH, upload included individual files thus. uploadIndividuals(embeddedVP, paths); } } // if uploadType is BOTH or ZIP, create an archive.zip and upload if (filesUploaded != 0 && (serviceData.getUploadType() != UploadType.INDIVIDUAL)) { uploadArchive(archiveIncludes.toString()); } } catch (IOException | InterruptedException e) { throw new WAStorageException(e.getMessage(), e.getCause()); } return filesUploaded; } protected String excludedFilesAndZip() { // Make sure we exclude the tempPath from archiving. String excludesWithoutZip = "**/" + zipFolderName + "*/" + zipName; if (serviceData.getExcludedFilesPath() != null) { excludesWithoutZip = serviceData.getExcludedFilesPath() + "," + excludesWithoutZip; } return excludesWithoutZip; } /** * Convert the path on local file sytem to relative path on azure storage * * @param path the local path * @param embeddedVP the embedded virtual path * @return */ protected String getItemPath(final FilePath path, final String embeddedVP) throws IOException, InterruptedException { final URI workspaceURI = serviceData.getRemoteWorkspace().toURI(); // Remove the workspace bit of this path final URI srcURI = workspaceURI.relativize(path.toURI()); final String srcURIPath = srcURI.getPath(); String prefix = StringUtils.isBlank(serviceData.getVirtualPath()) ? "" : serviceData.getVirtualPath(); if (!StringUtils.isBlank(embeddedVP)) { prefix += embeddedVP; } return prefix + srcURIPath; } protected HashMap<String, String> updateMetadata(final HashMap<String, String> metadata) throws IOException, InterruptedException { final EnvVars env = serviceData.getRun().getEnvironment(serviceData.getTaskListener()); if (serviceData.getAzureBlobMetadata() != null) { for (AzureBlobMetadataPair pair : serviceData.getAzureBlobMetadata()) { final String resolvedKey = Util.replaceMacro(pair.getKey(), env); final String resolvedValue = Util.replaceMacro(pair.getValue(), env); // Azure does not allow null, empty or whitespace metadata key if (resolvedKey == null || resolvedKey.trim().length() == 0) { println("Ignoring blank metadata key"); continue; } // Azure does not allow null, empty or whitespace metadata value if (resolvedValue == null || resolvedValue.trim().length() == 0) { println("Ignoring blank metadata value, key: " + resolvedKey); continue; } metadata.put(resolvedKey, resolvedValue); } } return metadata; } }