blob: 266a306b407683b1b09f0db5f75cb8876240a3a4 [file] [log] [blame]
/**
* Copyright (c) 2013-2016 Angelo ZERR.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
*/
package org.eclipse.wst.json.core.util;
import java.util.Enumeration;
import java.util.Iterator;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.wst.json.core.document.IJSONNode;
import org.eclipse.wst.json.core.internal.Logger;
import org.eclipse.wst.json.core.regions.JSONRegionContexts;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegionList;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
public class JSONUtil {
public static final String QUOTE = "\""; //$NON-NLS-1$
public static void debugOut(String str) {
Logger.log(Logger.WARNING, "json warning: " + str); //$NON-NLS-1$
}
/**
*
*/
public static String extractStringContents(String text) {
return stripQuotes(text);
}
/**
*
*/
public static IStructuredDocumentRegion findNextSignificantNode(
IStructuredDocumentRegion startNode) {
if (startNode == null) {
return null;
}
IStructuredDocumentRegion node = startNode.getNext();
while (node != null) {
String type = getStructuredDocumentRegionType(node);
/*
* if (type != JSONRegionContexts.JSON_S && type !=
* JSONRegionContexts.JSON_COMMENT && type !=
* JSONRegionContexts.JSON_CDO && type !=
* JSONRegionContexts.JSON_CDC) { return node; }
*/
node = node.getNext();
}
return null;
}
/**
*
*/
public static IStructuredDocumentRegion findNodeBackward(
IStructuredDocumentRegion startNode,
IStructuredDocumentRegion endNode, String type) {
IStructuredDocumentRegion node;
for (node = startNode; node != null; node = node.getPrevious()) {
if (node.getStartOffset() < endNode.getStartOffset()) {
node = null;
break;
} else if (getStructuredDocumentRegionType(node) == type) {
break;
}
}
return node;
}
/**
*
*/
public static IStructuredDocumentRegion findNodeForward(
IStructuredDocumentRegion startNode,
IStructuredDocumentRegion endNode, String type) {
IStructuredDocumentRegion node;
for (node = startNode; node != null; node = node.getNext()) {
if (endNode.getStartOffset() < node.getStartOffset()) {
node = null;
break;
} else if (getStructuredDocumentRegionType(node) == type) {
break;
}
}
return node;
}
/**
*
*/
public static IStructuredDocumentRegion findPreviousSignificantNode(
IStructuredDocumentRegion startNode) {
if (startNode == null) {
return null;
}
IStructuredDocumentRegion node = startNode.getPrevious();
while (node != null) {
String type = getStructuredDocumentRegionType(node);
/*
* if (type != JSONRegionContexts.JSON_S && type !=
* JSONRegionContexts.JSON_COMMENT && type !=
* JSONRegionContexts.JSON_CDO && type !=
* JSONRegionContexts.JSON_CDC) { return node; }
*/
node = node.getPrevious();
}
return null;
}
/**
*
*/
public static String getClassString(Object object) {
if (object == null) {
return "null"; //$NON-NLS-1$
} else {
String name = object.getClass().toString();
int lastPeriod = name.lastIndexOf('.');
return name.substring(lastPeriod + 1);
}
}
/**
*
*/
public static String getStructuredDocumentRegionType(
IStructuredDocumentRegion flatNode) {
if (flatNode == null) {
return JSONRegionContexts.JSON_UNKNOWN;
}
ITextRegionList regions = flatNode.getRegions();
if (regions == null || regions.size() == 0) {
return JSONRegionContexts.JSON_UNKNOWN;
}
ITextRegion region = regions.get(0);
return region.getType();
}
/**
*
*/
public static int getLengthDifference(
IStructuredDocumentRegionList newNodes,
IStructuredDocumentRegionList oldNodes) {
int newLen = getTextLength(newNodes);
int oldLen = getTextLength(oldNodes);
return newLen - oldLen;
}
/**
*
*/
public static String getRegionText(IStructuredDocumentRegion flatNode,
ITextRegionList regions) {
StringBuffer buf = new StringBuffer();
if (regions != null) {
for (Iterator i = regions.iterator(); i.hasNext();) {
ITextRegion region = (ITextRegion) i.next();
if (region == null) {
continue;
}
buf.append(flatNode.getText(region));
}
}
return buf.toString();
}
/**
*
*/
public static int getTextLength(IStructuredDocumentRegionList nodes) {
int length = 0;
if (nodes != null) {
for (Enumeration e = nodes.elements(); e.hasMoreElements();) {
IStructuredDocumentRegion flatNode = (IStructuredDocumentRegion) e
.nextElement();
if (flatNode != null) {
length += flatNode.getText().length();
}
}
}
return length;
}
/**
*
*/
public static String stripQuotes(String text) {
if (text == null)
return null;
String contents = text.trim();
if (2 <= contents.length()) {
char first = contents.charAt(0);
char last = contents.charAt(contents.length() - 1);
if ((first == '\"' && last == '\"')
|| (first == '\'' && last == '\'')) {
contents = contents.substring(1, contents.length() - 1);
}
}
return contents;
}
public static String detectQuote(String source, String defaultQuote) {
if (source == null)
return defaultQuote;
final String D_QUOTE = "\""; //$NON-NLS-1$
final String S_QUOTE = "\'"; //$NON-NLS-1$
int dIndex = source.indexOf(D_QUOTE);
int sIndex = source.indexOf(S_QUOTE);
if (dIndex < 0 && sIndex < 0) {
return defaultQuote;
} else if (dIndex < 0) {
return D_QUOTE;
} else if (sIndex < 0) {
return S_QUOTE;
} else if (dIndex < sIndex) {
return S_QUOTE;
} else {
return D_QUOTE;
}
}
/**
*
*/
public static void stripSurroundingSpace(ITextRegionList regions) {
if (regions == null) {
return;
}
while (!regions.isEmpty()) {
ITextRegion region = regions.get(0);
String type = region.getType();
// if (type == JSONRegionContexts.JSON_S
// || type == JSONRegionContexts.JSON_COMMENT) {
// regions.remove(0);
// } else {
break;
// }
}
while (!regions.isEmpty()) {
ITextRegion region = regions.get(regions.size() - 1);
String type = region.getType();
// if (type == JSONRegionContexts.JSON_S
// || type == JSONRegionContexts.JSON_COMMENT) {
// regions.remove(region);
// } else {
break;
// }
}
}
public static boolean isJSONSimpleValue(String regionType) {
return (regionType == JSONRegionContexts.JSON_VALUE_BOOLEAN
|| regionType == JSONRegionContexts.JSON_VALUE_NULL
|| regionType == JSONRegionContexts.JSON_VALUE_NUMBER || regionType == JSONRegionContexts.JSON_VALUE_STRING);
}
public static boolean isStartJSONStructure(String regionType) {
return (regionType == JSONRegionContexts.JSON_ARRAY_OPEN || regionType == JSONRegionContexts.JSON_OBJECT_OPEN);
}
public static boolean isEndJSONStructure(String regionType) {
return (regionType == JSONRegionContexts.JSON_ARRAY_CLOSE || regionType == JSONRegionContexts.JSON_OBJECT_CLOSE);
}
public static String getString(IJSONNode node) {
String value;
try {
value = node.getModel().getStructuredDocument().get(node.getStartOffset(), node.getEndOffset()-node.getStartOffset());
} catch (BadLocationException e) {
// ignore
return null;
}
value = removeQuote(value);
return value;
}
public static String removeQuote(String value) {
if (value != null) {
value = value.trim();
if (value.startsWith(QUOTE)) {
value = value.substring(1);
}
if (value.endsWith(QUOTE)) {
value = value.substring(0, value.length() - 1);
}
}
return value;
}
}