/** * 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 tern.metadata; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.Map; import com.eclipsesource.json.Json; import com.eclipsesource.json.JsonObject; import tern.repository.ITernRepository; /** * Tern module metadata manager. * */ public class TernModuleMetadataManager { private static final String METADATA_DIR = "metadata"; private static final String METADATA_JSON_EXT = ".metadata.json"; private final Map<String, TernModuleMetadata> metadatas; private final File baseDir; public TernModuleMetadataManager(ITernRepository repository) { this(repository.getBaseDir()); } public TernModuleMetadataManager(File baseDir) { this.metadatas = new HashMap<String, TernModuleMetadata>(); this.baseDir = baseDir; } /** * Return the module metadata of the given module name and null otherwise. * * @param moduleName * the module name. * @return the module metadata of the given module name and null otherwise. */ public TernModuleMetadata getMetadata(String moduleName) { initializeIfNeeded(); return metadatas.get(moduleName); } private void initializeIfNeeded() { if (metadatas.size() == 0) { synchronized (metadatas) { if (metadatas.size() == 0) { File metadataDir = new File(baseDir, METADATA_DIR); if (metadataDir.exists() && metadataDir.isDirectory()) { File[] files = metadataDir.listFiles(); File file = null; TernModuleMetadata metadata = null; for (int i = 0; i < files.length; i++) { file = files[i]; try { metadata = loadMetadata(file); if (metadata != null) { metadatas.put(metadata.getName(), metadata); } } catch (Exception e) { e.printStackTrace(); } } } } } } } public static TernModuleMetadata loadMetadata(File moduleDir, String moduleName) throws IOException { if (moduleDir.exists() && moduleDir.isDirectory()) { String metadaFilename = new StringBuilder(moduleName).append(METADATA_JSON_EXT).toString(); File metadaFile = new File(moduleDir, metadaFilename); if (!metadaFile.exists()) { File metadataDir = new File(moduleDir, METADATA_DIR); if (metadataDir.exists() && metadataDir.isDirectory()) { metadaFile = new File(metadataDir, metadaFilename); } } try { return loadMetadata(metadaFile); } catch (Exception e) { e.printStackTrace(); } } return null; } private static TernModuleMetadata loadMetadata(File file) throws IOException { if (file.isFile() && file.getName().endsWith(METADATA_JSON_EXT)) { JsonObject json = Json.parse(new FileReader(file)).asObject(); return new TernModuleMetadata(json, file); } return null; } }