Command | Description |
---|---|
destroy | Stops and deletes all traces of the vagrant machine |
halt | Stops the vagrant machine |
init | Initializes a new Vagrant environment by creating a Vagrantfile. Vagrant boxes can be found from the following link: Discover Vagrant Boxes - Vagrant Cloud (vagrantup.com) |
provision | Provisions the vagrant machine |
reload | Restarts vagrant machine, loads new Vagrantfile configuration |
resume | Resume a suspended vagrant machine |
ssh | Connects to machine via SSH |
ssh-config | Outputs OpenSSH valid configuration to connect to the machine |
status | Outputs status of the vagrant machine |
suspend | Suspends the machine |
up | Starts and provisions the vagrant environment |
validate | Validates the Vagrantfile |
version | Prints current and latest Vagrant version |
Page 14 of 34
Groovy Snippet
List<String> getMavenVersions(String metadataXmlURL) {
def strVersions = new ArrayList<String>()
def mvnData = new URL(metadataXmlURL)
def mvnCN = mvnData.openConnection()
mvnCN.requestMethod = 'GET'
if (mvnCN.responseCode==200) {
def rawResponse = mvnCN.inputStream.text
def versionMatcher = rawResponse =~ '<version>(.*)</version>'
while(versionMatcher.find()) {
for (nVersion in versionMatcher) {
strVersions.add(nVersion[1]);
}
}
}
strVersions.sort {v1, v2 ->
v2.compareTo(v1)
}
return strVersions
}
Example Usage
def metatdataAddress = 'https://repo.maven.apache.org/maven2/xyz/ronella/casual/trivial-chunk/maven-metadata.xml'
def versions = getMavenVersions(metatdataAddress)
println versions
Use case
The downloaded snapshot has timestamp associated with it like the following:
artifact-1.0.0-20211012.041152-1.jar
But the tooling is expecting an absolute name like the the following:
artifact-1.0.0-SNAPSHOT.jar
Powershell Script
#The target artifact
$ArtifactId = "artifact"
#The target SNAPSHOT version
$Version = "1.0.0-SNAPSHOT"
if ($Version -match "^(.*)-SNAPSHOT$")
{
$Prefix = "{0}-{1}" -f $ArtifactId,$Matches.1
$Pattern = "^(${Prefix}).*(\.jar)$"
Get-ChildItem ('.') | ForEach-Object {
If ($_.Name -match $Pattern) {
$NewName = "{0}-SNAPSHOT{1}" -f $Matches.1, $Matches.2
Rename-Item $_ -NewName $NewName
$Message = "Renaming from {0} to {1}" -f $_.Name, $NewName
echo $Message
}
}
}
The pattern matching enhancement that conditionally extract data from an object if the instanceof operator was satisfied and assigns it to a variable.
The variable in this pattern matching is following a flow scope. This means that the variable is in scope if it is guaranted that it can satisfies the instanceof operator.
Code Without Pattern Matching
record Person(String firstName, String lastName) {}
Record rec = new Person("Juan", "Dela Cruz");
//Check if rec is a Person.
if (rec instanceof Person) {
//rec can safely be casted to Person.
var person = (Person) rec;
System.out.println(person);
System.out.println(person.firstName());
System.out.println(person.lastName());
}
Notice that casting the rec to Person once the check succeded is required.
Code With Pattern Matching
record Person(String firstName, String lastName) {}
Record rec = new Person("Juan", "Dela Cruz");
//If rec is a Person extract it to a variable person.
if (rec instanceof Person person) {
System.out.println(person);
System.out.println(person.firstName());
System.out.println(person.lastName());
}
Notice that casting is not required here and Person instance is extracted to person variable. Moreover, the scope of the variable is in the truth block of the if statement.
Flow Scope
Example 1
Record rec = new Person("Juan", "Dela Cruz");
if (!(rec instanceof Person person)) {
System.out.println("In human.");
}
else {
System.out.println(person);
System.out.println(person.firstName());
System.out.println(person.lastName());
}
Notice that person variable usage is on the else block of the if statement.
Example 2
Record rec = new Person("Juan", "Dela Cruz");
if (rec instanceof Person person && "JUAN DELA CRUZ".equals(String.join(person.firstName(), " ", person.lastName().toUpperCase()))) {
System.out.println("You won a price");
}
Notice that the person variable is usable after the AND (&&) operator. This is because the and operator guarantees that the instanceof operator was satisfied before evaluating the following condition. Changing it to OR (||) operator will be an error, since the person variable is out of scope.
Practical Usage
equals implementation
import java.util.Objects;
record Person(String firstName, String lastName) {
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (null == o) return false;
if (o instanceof Person person) {
return Objects.equals(firstName, person.firstName()) && Objects.equals(lastName, person.lastName());
}
return false;
}
}
A record class is a restricted form of classes that models data as data. Thus, also can be thought as data only class. Additionally, this type of class is immutable.
It automatically implements the following methods:
- public boolean equals...
- public int hashCode...
- public String toString() {...}
The class generated by the record is a final class.
The constructor will also be handled and the parameters is matching the arrangement of the record parameter(s).
Use Cases
- Data Transfer Objects (DTO) (i.e. not applicable to JPA entities)
- Compound map keys
- Multiple return values
Syntax
record <IDENTIFIER>([[[<FIELD_TYPE_1> <FIELD_NAME_1>][, <FIELD_TYPE_2> <FIELD_NAME_2>]][,... <FIELD_TYPE_2> <FIELD_NAME_N>]]) {}
Token | Description |
---|---|
IDENTIFIER | A valid Java identifier. |
FIELD_TYPE_1 FIELD_TYPE_2 FIELD_TYPE_N |
The type of the field(s) in the record parameter(s). |
FIELD_NAME_1 FIELD_NAME_2 FIELD_NAME_N |
The name of the field(s) in the record parameter(s). |
The identifier has an equivalent cannonical constructor with parameters equivalent to its parameters.
Each fields has the following:
- private final field of the same name.
- public accessor method of the same name and type.
Example
record Person(String firstName, String lastName) {}
The above example is equivalent to the following class definition:
public final class PersonC {
private final String firstName;
private final String lastName;
public PersonC(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String firstName() {
return this.firstName;
}
public String lastName() {
return this.lastName;
}
public boolean equals...
public int hasCode...
public String toString() {...}
}
Compact Constructor
In the record definition we can use a compact constructor. This constructor is the shorthand form of the generated default constructor. All of the fields indicated on the record parameters are implicitly available in it.
Syntax of the Compact Constructor
pubic <IDENTIFIER> {
// Initilization logic.
}
The IDENTIFIER here is matching the record IDENTIFIER, just like when you are writing a constructor of a class but without parameters even the parentheses.
Example Usage
record Person(String firstName, String lastName) {
public Person {
java.util.Objects.requireNonNull(firstName);
java.util.Objects.requireNonNull(lastName);
}
}
Resolve modules from the root module using the following syntax:
java --show-module-resolution -p <MODULE_PATHS> -m <ROOT_MODULE>
Identifier | Description |
---|---|
MODULE_PATHS | List of modules paths delimited by semi-colon (i.e. ;). |
ROOT_MODULE | The module to start the resolution. |
Error: Unable to acquire token for tenant organization with error DeviceCodeCredential
Solution:
- Run
clear-azcontext
to remove all accounts and subscription - Reconnect using
connect-azaccount
$file = "Path\ZipFile.zip"
$fileBytes = Get-Content $file -Encoding byte
$fileBytesBase64 = [System.Convert]::ToBase64String($filebytes)
$fileBytesBase64 | Out-File '[Path\Textfile.txt]'
- Go to the top of the file
- Hit CTRL-H to open the Replace window
- Enter [\r\n]+ from the Find What field
- In the Replace field, leave it blank
- Select Regular expression from the options
[open] module <MODULE_NAME> {
[[requires [transitive] <MODULE_NAME>;]
[exports <PACKAGE>[ to <MODULE_NAME_1>[,<MODULE_NAME_2>..,<MODULE_NAME_N>];]
[opens <PACKAGE>;]
[provides <SERVICE> with <SERVICE_IMPLEMENTATION_1>[,<SERVICE_IMPLEMENTATION_2>..,<SERVICE_IMPLEMENTATION_N>];]
[uses <SERVICE>;]]
}
Identifier | Description |
---|---|
module | The module keyword that holds the module directives. |
<MODULE_NAME> | The module identier. |
<PACKAGE> | The package identifier. |
requires | The requires directive indicates that this module depends on another module. ^1 |
transitive | The transitive directive indicates that the user of the current module will also requite another module that the current user will also have access into. |
exports | The exports directive indicates which public types of the module's package are accessible to other modules. ^1 |
opens | The opens directive also indicates which public types of the module's package are accessible to other modules. The difference between that and exports is that opens is not for compile time, only during runtime, while exports is for both compile time and runtime. The opens directive can typically be used when you want to allow other modules to use reflection for the types in the specified packages, but not to use them during compile time. Let's make this more clear by means of an example. ^1 |
open | This is like the opens directive but with this it opens the whole module. |
to <MODULE_NAME_1>[, <MODULE_NAME_2>.., <MODULE_NAME_N>] | This indicates to target just specific module(s). |
provides...with | The provides...with directive indicates that the module provides a service implementation.^1 |
uses | The uses directive indicates that the module requires a service implementation. |
<SERVICE> | The interface or abstract class that will be implemented as a service. |
<SERVICE_IMPLEMENTATION_1>[, <SERVICE_IMPLEMENTATION_2>.., <SERVICE_IMPLEMENTATION_N>] | The implementation classes of the SERVICE_INTERFACE. |
Recent Comments