blob: 1818249bb5c94b80e585a040f3f33852ead888f1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License 2.0 which accompanies this distribution,
* and is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.eclipse.wst.json.core.internal.schema.catalog;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Iterator;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.json.provisonnal.com.eclipsesource.json.JsonArray;
import org.eclipse.json.provisonnal.com.eclipsesource.json.JsonObject;
import org.eclipse.json.provisonnal.com.eclipsesource.json.JsonValue;
import org.eclipse.wst.json.core.JSONCorePlugin;
import org.eclipse.wst.json.core.internal.Logger;
import org.eclipse.wst.json.core.internal.download.HttpClientProvider;
import org.eclipse.wst.json.core.schema.catalog.ICatalog;
import org.eclipse.wst.json.core.schema.catalog.ICatalogElement;
import org.eclipse.wst.json.core.schema.catalog.ICatalogEntry;
import org.osgi.framework.Bundle;
public class CatalogSchemastoreReader {
private static final String SCHEMAS = "schemas"; //$NON-NLS-1$
private static final String SCHEMASTORE_CATALOG = "https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/api/json/catalog.json"; //$NON-NLS-1$
protected ICatalog catalog;
protected CatalogSchemastoreReader(ICatalog catalog) {
this.catalog = catalog;
}
protected void readSchemastore() {
File f = getUrl();
if (f != null) {
int type = ICatalogEntry.ENTRY_TYPE_SCHEMA;
JsonValue schemas;
try {
InputStreamReader reader = new InputStreamReader(new FileInputStream(f));
JsonObject json = JsonObject.readFrom(reader);
schemas = json.get(SCHEMAS);
} catch (IOException e) {
Logger.logException(e);
return;
}
if (schemas != null && schemas instanceof JsonArray) {
JsonArray elements = (JsonArray) schemas;
Iterator<JsonValue> iter = elements.iterator();
while (iter.hasNext()) {
JsonValue value = iter.next();
if (value instanceof JsonObject) {
JsonObject jsonObject = (JsonObject) value;
JsonValue urlJson = jsonObject.get("url"); //$NON-NLS-1$
JsonValue fileMatchJson = jsonObject.get("fileMatch"); //$NON-NLS-1$
if (urlJson != null && fileMatchJson != null && urlJson.isString() && fileMatchJson.isArray()) {
String url = urlJson.asString();
JsonArray fileMatchArray = fileMatchJson.asArray();
Iterator<JsonValue> fileIter = fileMatchArray.iterator();
while (fileIter.hasNext()) {
JsonValue fileMatchValue = fileIter.next();
if (fileMatchValue.isString()) {
String fileMatch = fileMatchValue.asString();
ICatalogElement catalogElement = catalog.createCatalogElement(type);
if (catalogElement instanceof ICatalogEntry) {
ICatalogEntry entry = (ICatalogEntry) catalogElement;
entry.setKey(fileMatch);
entry.setURI(url);
entry.setId(fileMatch);
}
catalog.addCatalogElement(catalogElement);
}
}
}
}
}
}
}
}
private static File getUrl() {
try {
File f = HttpClientProvider.getFile(new URL(SCHEMASTORE_CATALOG));
if (f == null || !f.exists()) {
URL url = getUrlFromBundle();
File file;
try {
file = new File(url.toURI());
} catch(URISyntaxException e) {
file = new File(url.getPath());
}
return file;
} else {
return f;
}
} catch (Exception e) {
Logger.logException(e);
}
return null;
}
private static URL getUrlFromBundle() {
Bundle bundle = Platform.getBundle(JSONCorePlugin.PLUGIN_ID);
if (bundle != null) {
URL[] urls = FileLocator.findEntries(bundle, new Path("/schemastore/catalog.json")); //$NON-NLS-1$
if (urls != null && urls.length > 0) {
try {
return FileLocator.resolve(urls[0]);
} catch (IOException e) {
Logger.logException(e);
}
}
}
return null;
}
}