All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.igormaznitsa.mindmap.model.MMapURI Maven / Gradle / Ivy
/*
* Copyright 2015 Igor Maznitsa.
*
* 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.igormaznitsa.mindmap.model;
import com.igormaznitsa.mindmap.model.nio.Path;
import com.igormaznitsa.mindmap.model.nio.Paths;
import java.io.File;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLDecoder;
//import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import com.igormaznitsa.meta.common.utils.Assertions;
public class MMapURI implements Serializable {
public static final long serialVersionUID = 27896411234L;
private static final Properties EMPTY = new Properties();
private final URI uri;
private final Properties parameters;
private final boolean fileUriFlag;
@Nullable
private static String extractHost(@Nonnull final URI uri) {
String host = uri.getHost();
if (host == null) {
final String schemeSpecific = uri.getSchemeSpecificPart();
if (schemeSpecific != null && schemeSpecific.startsWith("//")) {
host = "";
}
}
return host;
}
public MMapURI(@Nonnull final String uri) throws URISyntaxException {
this(new URI(uri));
}
public MMapURI(@Nonnull final URI uri) {
this.fileUriFlag = Assertions.assertNotNull(uri).getScheme() == null ? true : uri.getScheme().equalsIgnoreCase("file"); //NOI18N
final URI preparedURI;
final String queryString = uri.getRawQuery();
if (queryString != null) {
this.parameters = ModelUtils.extractQueryPropertiesFromURI(uri);
if (this.fileUriFlag) {
try {
final String uriAsString = uri.toString();
final int queryStart = uriAsString.lastIndexOf('?');
preparedURI = new URI(queryStart >= 0 ? uriAsString.substring(0,queryStart) : uriAsString);
}
catch (URISyntaxException ex) {
throw new Error("Unexpected error", ex);
}
}
else {
preparedURI = uri;
}
}
else {
this.parameters = EMPTY;
preparedURI = uri;
}
this.uri = preparedURI;
}
private MMapURI(@Nonnull final URI uri, final boolean isFile, @Nullable final Properties properties) {
this.uri = uri;
this.fileUriFlag = isFile;
this.parameters = properties == null ? new Properties() : (Properties) properties.clone();
}
public MMapURI(@Nullable final File nullableBase, @Nonnull final File file, @Nullable final Properties nullableParameters) {
this.fileUriFlag = true;
this.parameters = new Properties();
if (nullableParameters != null && !nullableParameters.isEmpty()) {
this.parameters.putAll(nullableParameters);
}
final Path filePath = Paths.toPath(file);
if (nullableBase == null) {
this.uri = ModelUtils.toURI(filePath);
}
else {
final Path basePath = Paths.toPath(nullableBase);
if (basePath.isAbsolute()) {
final Path path = filePath.startsWith(basePath) ? basePath.relativize(filePath) : filePath;
this.uri = ModelUtils.toURI(path);
}
else {
this.uri = ModelUtils.toURI(filePath);
}
}
}
@Nonnull
public static MMapURI makeFromFilePath(@Nullable final File base, @Nonnull final String filePath, @Nullable final Properties properties) {
return new MMapURI(base, ModelUtils.makeFileForPath(filePath), properties);
}
@Nonnull
public MMapURI replaceBaseInPath(final boolean replaceHost, @Nonnull final URI newBase, int currentNumberOfResourceItemsTheLasIsZero) throws URISyntaxException {
final String newURIPath = newBase.getPath();
final String[] splittedNewPath = newURIPath.split("\\/");
final String[] splittedOldPath = this.uri.getPath().split("\\/");
final List resultPath = new ArrayList();
for (final String s : splittedNewPath) {
resultPath.add(s);
}
currentNumberOfResourceItemsTheLasIsZero = currentNumberOfResourceItemsTheLasIsZero + 1;
int oldPathIndex = splittedOldPath.length - currentNumberOfResourceItemsTheLasIsZero;
while (oldPathIndex < splittedOldPath.length) {
if (oldPathIndex>=0){
resultPath.add(splittedOldPath[oldPathIndex]);
}
oldPathIndex ++;
}
final StringBuilder buffer = new StringBuilder();
for (int i = 0; i < resultPath.size(); i++) {
if (i > 0) {
buffer.append('/');
}
buffer.append(resultPath.get(i));
}
final URI newURI = new URI(replaceHost ? newBase.getScheme() : this.uri.getScheme(),
replaceHost ? newBase.getUserInfo() : this.uri.getUserInfo(),
replaceHost ? extractHost(newBase) : extractHost(this.uri),
replaceHost ? newBase.getPort() : this.uri.getPort(),
buffer.toString(),
this.uri.getQuery(),
this.uri.getFragment()
);
return new MMapURI(newURI, this.fileUriFlag, this.parameters);
}
@Nonnull
public MMapURI replaceName(@Nonnull final String newName) throws URISyntaxException {
final MMapURI result;
final String normalizedName = ModelUtils.escapeURIPath(newName).replace('\\', '/');
final String [] parsedNormalized = normalizedName.split("\\/");
final String [] parsedCurrentPath = this.uri.getPath().split("\\/");
final int baseLength = Math.max(0, parsedCurrentPath.length - parsedNormalized.length);
final StringBuilder buffer = new StringBuilder();
for(int i=0;i0){
buffer.append('/');
}
buffer.append(parsedCurrentPath[i]);
}
for(int i=0;i0) || i>0){
buffer.append('/');
}
buffer.append(parsedNormalized[i]);
}
result = new MMapURI(new URI(
this.uri.getScheme(),
this.uri.getUserInfo(),
extractHost(this.uri),
this.uri.getPort(),
buffer.toString(),
this.uri.getQuery(),
this.uri.getFragment()), this.fileUriFlag, parameters);
return result;
}
@Nonnull
public URI asURI() {
if (this.fileUriFlag) {
try {
return new URI(this.uri.toASCIIString() + (this.parameters.isEmpty() ? "" : '?' + ModelUtils.makeQueryStringForURI(this.parameters)));
}
catch (URISyntaxException ex) {
throw new Error("Unexpected error during URI convertation"); //NOI18N
}
}
else {
return this.uri;
}
}
@Nonnull
public String getExtension() {
String text = this.uri.getPath();
final int lastSlash = text.lastIndexOf('/');
if (lastSlash >= 0) {
text = text.substring(lastSlash + 1);
}
String result = ""; //NOI18N
if (!text.isEmpty()) {
final int dotIndex = text.lastIndexOf('.');
if (dotIndex >= 0) {
result = text.substring(dotIndex + 1);
}
}
return result;
}
@Nonnull
public String asString(final boolean ascII, final boolean addPropertiesAsQuery) {
if (this.fileUriFlag) {
return (ascII ? this.uri.toASCIIString() : this.uri.toString()) + (!addPropertiesAsQuery || this.parameters.isEmpty() ? "" : '?' + ModelUtils.makeQueryStringForURI(this.parameters)); //NOI18N
}
else {
return ascII ? this.uri.toASCIIString() : this.uri.toString();
}
}
@Nonnull
public File asFile(@Nullable final File base) {
final File result;
if (this.uri.isAbsolute()) {
result = ModelUtils.toFile(this.uri);
}
else {
try {
result = new File(base, URLDecoder.decode(this.uri.getPath(), "UTF-8")); //NOI18N
}
catch (UnsupportedEncodingException ex) {
throw new Error("Unexpected error", ex); //NOI18N
}
}
return result;
}
@Nonnull
public Properties getParameters() {
return (Properties) this.parameters.clone();
}
public boolean isAbsolute() {
return this.uri.isAbsolute();
}
@Override
@Nonnull
public String toString() {
return asString(true, true);
}
}