001 package org.kuali.common.deploy; 002 003 import org.apache.commons.lang3.StringUtils; 004 import org.kuali.common.util.Assert; 005 import org.kuali.common.util.LocationUtils; 006 import org.kuali.common.util.nullify.NullUtils; 007 008 import com.google.common.base.Optional; 009 010 public final class Deployable { 011 012 private final String local; 013 private final String remote; 014 private final boolean exists; 015 016 private final boolean filter; 017 private final boolean required; 018 private final Optional<String> permissions; 019 020 public boolean isFilter() { 021 return filter; 022 } 023 024 public String getLocal() { 025 return local; 026 } 027 028 public String getRemote() { 029 return remote; 030 } 031 032 public Optional<String> getPermissions() { 033 return permissions; 034 } 035 036 public boolean isRequired() { 037 return required; 038 } 039 040 public boolean isExists() { 041 return exists; 042 } 043 044 public static class Builder { 045 046 private final String local; 047 private final String remote; 048 private final boolean exists; 049 050 private boolean filter = false; 051 private boolean required = true; 052 private Optional<String> permissions = Optional.absent(); 053 054 public Builder(String local, String remote) { 055 this.local = local; 056 this.remote = remote; 057 this.exists = LocationUtils.exists(local); 058 } 059 060 public Builder filter(boolean filter) { 061 this.filter = filter; 062 return this; 063 } 064 065 public Builder required(boolean required) { 066 this.required = required; 067 return this; 068 } 069 070 /** 071 * Can't be the empty string or all whitespace. <code>null</code> and the magic strings "NONE" and "NULL" are all allowed and mean the same thing. (ie no explicit 072 * permissions will be set on the remote machine for this deployable). 073 */ 074 public Builder permissions(String permissions) { 075 if (permissions != null) { 076 Assert.noBlanks(permissions); 077 } 078 String trimmed = StringUtils.trimToNull(permissions); 079 String converted = NullUtils.isNullOrNone(trimmed) ? null : trimmed; 080 this.permissions = Optional.fromNullable(converted); 081 return this; 082 } 083 084 public Deployable build() { 085 Assert.noBlanks(local, remote); 086 Assert.noNulls(permissions); 087 if (required) { 088 Assert.isTrue(exists, "[" + local + "] does not exist"); 089 } 090 return new Deployable(this); 091 } 092 093 } 094 095 private Deployable(Builder builder) { 096 this.local = builder.local; 097 this.remote = builder.remote; 098 this.exists = builder.exists; 099 this.filter = builder.filter; 100 this.required = builder.required; 101 this.permissions = builder.permissions; 102 } 103 104 }