package co.codewizards.cloudstore.core.version;
import static co.codewizards.cloudstore.core.io.StreamUtil.*;
import static co.codewizards.cloudstore.core.objectfactory.ObjectFactoryUtil.*;
import static co.codewizards.cloudstore.core.util.UrlUtil.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import co.codewizards.cloudstore.core.oio.File;
public class LocalVersionInIdeHelper {
protected URL resource;
protected LocalVersionInIdeHelper() {
}
public static LocalVersionInIdeHelper getInstance() {
return createObject(LocalVersionInIdeHelper.class);
}
public Version getLocalVersionInIde() {
resource = this.getClass().getResource("");
if (resource.getProtocol().equalsIgnoreCase(PROTOCOL_JAR)) {
return getLocalVersionInIde_jar();
} else if (resource.getProtocol().equalsIgnoreCase(PROTOCOL_FILE)) {
return getLocalVersionInIde_file();
} else
throw new IllegalStateException("LocalVersionInIdeHelper was not loaded from a local JAR or class file!");
}
protected Version getLocalVersionInIde_jar() {
final String pomXmlResourceName = "META-INF/maven/co.codewizards.cloudstore/co.codewizards.cloudstore.core/pom.xml";
resource = this.getClass().getClassLoader().getResource(pomXmlResourceName);
if (resource == null)
throw new IllegalStateException("Resource not found in JAR: " + pomXmlResourceName);
try {
try (InputStream pomXmlIn = resource.openStream()) {
return readVersionFromPomXml(pomXmlIn);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
protected Version getLocalVersionInIde_file() {
try {
File dir = getFile(resource).getCanonicalFile();
File pomXmlFile;
do {
pomXmlFile = null;
dir = dir.getParentFile();
if (dir == null)
break;
pomXmlFile = dir.createFile("pom.xml");
} while (! pomXmlFile.exists());
if (pomXmlFile != null) {
try (InputStream pomXmlIn = castStream(pomXmlFile.createInputStream())) {
return readVersionFromPomXml(pomXmlIn);
}
}
throw new IllegalStateException("Could not determine local version!");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
protected Version readVersionFromPomXml(InputStream pomXmlIn) throws IOException {
// quick'n'dirty implementation
final Pattern pattern = Pattern.compile("<version>([^<]*)</version>");
BufferedReader reader = new BufferedReader(new InputStreamReader(pomXmlIn, StandardCharsets.UTF_8));
Matcher matcher = null;
String line;
while (null != (line = reader.readLine())) {
if (matcher == null)
matcher = pattern.matcher(line);
else
matcher.reset(line);
if (matcher.find()) {
String versionString = matcher.group(1);
return new Version(versionString);
}
}
throw new IllegalStateException("Could not find version inside pom.xml!");
}
}