/* * Copyright 2003-2011 JetBrains s.r.o. * * 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 jetbrains.mps.library; import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import jetbrains.mps.util.*; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; /** * TODO reuse it to read our libraries (core, workbench) from the generated xml file */ public class BuiltInLibrariesIO { private static final Logger LOG = LogManager.getLogger(BuiltInLibrariesIO.class); public static final String CONFIG_FILE_NAME = "CustomBuiltInLibraries"; private static final String CONFIG_FILE_WHOLE_NAME = CONFIG_FILE_NAME + ".xml"; public static final String ROOT_TAG = "libraries"; public static final String LIBRARY_TAG = "library"; public static final String LIBRARY_NAME_TAG = "name"; public static final String LIBRARY_PATH_TAG = "path"; public static Map<String, Library> readBuiltInLibraries() { Map<String, Library> result = new HashMap<String, Library>(); URL resource = BuiltInLibrariesIO.class.getResource(CONFIG_FILE_WHOLE_NAME); if (resource == null) return result; InputStream in = null; try { in = resource.openStream(); Document document = JDOMUtil.loadDocument(in); Element element = document.getRootElement(); List children = element.getChildren(LIBRARY_TAG); for (Object childObj : children) { Element child = (Element) childObj; String name = child.getAttribute(LIBRARY_NAME_TAG).getValue(); String path = child.getAttribute(LIBRARY_PATH_TAG).getValue(); final String realPath = MacrosFactory.getGlobal().expandPath(path); Library predefinedLibrary = new Library(name) { @NotNull @Override public String getPath() { return realPath; } }; result.put(name, predefinedLibrary); } } catch (JDOMException e) { LOG.error(null, e); } catch (IOException e) { LOG.error(null, e); } finally { if (in != null) { try { in.close(); } catch (IOException e) { LOG.error(null, e); } } } return result; } public static void addLibraryToConfigurationFile(String name, String path, String sourceHome) { try { File sourceFile = new File(sourceHome + File.separator + BuiltInLibrariesIO.class.getName().replace(".", File.separator) + ".class"); if (sourceFile.exists()) { File configFile = new File(sourceHome + File.separator + getModifiedConfigurationFile()); configFile.createNewFile(); write(configFile, name, path); } } catch (JDOMException e) { LOG.error(null, e); } catch (IOException e) { LOG.error(null, e); } } private static void write(File configFile, String name, String path) throws JDOMException, IOException { Document document; try { document = JDOMUtil.loadDocument(configFile); } catch (JDOMException e) { document = new Document(); Element rootElement = new Element(ROOT_TAG); document.setRootElement(rootElement); } Element element = document.getRootElement(); assert element.getName().equals(ROOT_TAG); write(element, name, path); JDOMUtil.writeDocument(document, configFile); } private static void write(Element element, String name, String path) { Element libraryElement = new Element(LIBRARY_TAG); libraryElement.setAttribute(LIBRARY_NAME_TAG, name); libraryElement.setAttribute(LIBRARY_PATH_TAG, path); element.addContent(libraryElement); } public static String getModifiedConfigurationFile() { return BuiltInLibrariesIO.class.getPackage().getName().replace(".", File.separator) + File.separator + CONFIG_FILE_WHOLE_NAME; } public static void main(String[] args) { String mpsHome = args[0]; for (int i = 1; i < args.length; i++) { String param = args[i]; String[] strings = param.split("="); String name = strings[0]; String path = MacrosFactory.MPS_HOME + File.separator + strings[1]; BuiltInLibrariesIO.addLibraryToConfigurationFile(name, path, mpsHome); } } }