/******************************************************************************* * Copyright (c) 2009 SpringSource, a divison of VMware, Inc. * 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: * SpringSource, a division of VMware, Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.virgo.ide.runtime.internal.core.provisioning; import java.io.File; import java.io.IOException; import java.text.ParseException; import java.util.HashMap; import java.util.Map; import org.eclipse.virgo.ide.bundlerepository.domain.ArtefactRepository; import org.eclipse.virgo.ide.bundlerepository.domain.BundleArtefact; import org.eclipse.virgo.ide.bundlerepository.domain.BundleImport; import org.eclipse.virgo.ide.bundlerepository.domain.LibraryArtefact; import org.eclipse.virgo.ide.bundlerepository.domain.OsgiVersion; import org.eclipse.virgo.ide.bundlerepository.domain.PackageExport; import org.eclipse.virgo.ide.bundlerepository.domain.PackageImport; import org.eclipse.virgo.ide.bundlerepository.domain.PackageMemberType; import org.eclipse.virgo.ide.bundlerepository.domain.VersionRange; import org.eclipse.virgo.ide.runtime.core.ServerCorePlugin; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import com.springsource.json.parser.AntlrJSONParser; import com.springsource.json.parser.JSONParser; import com.springsource.json.parser.MapNode; import com.springsource.json.parser.Node; import com.springsource.json.parser.internal.StandardBooleanNode; import com.springsource.json.parser.internal.StandardListNode; import com.springsource.json.parser.internal.StandardStringNode; /** * @author Christian Dupuis * @since 1.0.0 */ public class JsonArtefactRepositoryLoader implements IArtefactRepositoryLoader { private Map<String, OsgiVersion> versions = new HashMap<String, OsgiVersion>(); private Map<String, VersionRange> versionRanges = new HashMap<String, VersionRange>(); private Map<String, PackageImport> imports = new HashMap<String, PackageImport>(); private boolean loadClasses = ServerCorePlugin.getDefault().getPreferenceStore().getBoolean( ServerCorePlugin.PREF_LOAD_CLASSES_KEY); // private static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); public ArtefactRepository loadArtefactRepository(File rootFolder) { ArtefactRepository newArtefactRepository = new ArtefactRepository(); try { Resource[] resources = new PathMatchingResourcePatternResolver().getResources("file:" + rootFolder.toString() + "/**/*-*"); for (Resource resource : resources) { JSONParser parser = new AntlrJSONParser(); try { MapNode node = (MapNode) parser.parse(resource.getURL()); MapNode nb = (MapNode) node.getNode("bundle"); MapNode nl = (MapNode) node.getNode("library"); if (nb != null) { newArtefactRepository.addBundle(createBundleArtefact(nb)); } if (nl != null) { newArtefactRepository.addLibrary(createLibraryArtefact(nl)); } } catch (Exception e) { e.printStackTrace(); } } } catch (IOException e) { e.printStackTrace(); } return newArtefactRepository; } private OsgiVersion getVersion(String versionString) { if (versions.containsKey(versionString)) { return versions.get(versionString); } OsgiVersion version = new OsgiVersion(versionString); versions.put(versionString, version); return version; } private VersionRange getVersionRange(String versionRangeString) { if (versionRanges.containsKey(versionRangeString)) { return versionRanges.get(versionRangeString); } VersionRange version = new VersionRange(versionRangeString); versionRanges.put(versionRangeString, version); return version; } private PackageImport getPackageImport(String packageName, String versionRangeString, boolean isOptional) { String key = packageName + "." + versionRangeString + "." + isOptional; if (imports.containsKey(key)) { return imports.get(key); } PackageImport packageImport = new PackageImport(packageName, isOptional, getVersionRange(versionRangeString)); imports.put(key, packageImport); return packageImport; } private BundleArtefact createBundleArtefact(MapNode nb) throws ParseException { StandardStringNode name = (StandardStringNode) nb.getNode("name"); StandardStringNode version = (StandardStringNode) nb.getNode("version"); StandardStringNode symbolicName = (StandardStringNode) nb.getNode("symbolicName"); StandardStringNode organistationName = (StandardStringNode) nb.getNode("organisationName"); StandardStringNode moduleName = (StandardStringNode) nb.getNode("moduleName"); // StandardStringNode notes = (StandardStringNode) nb.getNode("notes"); StandardBooleanNode sourceAvailable = (StandardBooleanNode) nb.getNode("sourceAvailable"); // StandardStringNode dateAdded = (StandardStringNode) nb.getNode("dateAdded"); BundleArtefact artefact = new BundleArtefact(name.getValue(), symbolicName.getValue(), getVersion(version .getValue()), organistationName.getValue(), moduleName.getValue()); // artefact.setNotes(notes.getValue()); artefact.setSourceAvailable(sourceAvailable.getValue()); // artefact.setDateAdded(FORMAT.parse(dateAdded.getValue())); Node exports = nb.getNode("packageExports"); if (exports != null) { if (exports instanceof StandardListNode) { for (Node en : ((StandardListNode) exports).getNodes()) { MapNode e = (MapNode) en; createPackageExport(artefact, e); } } else { MapNode e = (MapNode) exports; createPackageExport(artefact, e); } } Node imports = nb.getNode("packageImports"); if (imports != null) { if (imports instanceof StandardListNode) { for (Node en : ((StandardListNode) imports).getNodes()) { MapNode e = (MapNode) en; createPackageImport(artefact, e); } } else { MapNode e = (MapNode) imports; createPackageImport(artefact, e); } } return artefact; } private void createPackageImport(BundleArtefact artefact, MapNode e) { StandardStringNode name; StandardStringNode version; name = (StandardStringNode) e.getNode("name"); version = (StandardStringNode) e.getNode("versionRange"); StandardBooleanNode optional = (StandardBooleanNode) e.getNode("optional"); PackageImport npi = getPackageImport(name.getValue(), version.getValue(), optional.getValue()); artefact.addImport(npi); } private void createPackageExport(BundleArtefact artefact, MapNode e) { StandardStringNode name; StandardStringNode version; name = (StandardStringNode) e.getNode("name"); version = (StandardStringNode) e.getNode("version"); PackageExport npe = new PackageExport(artefact, name.getValue(), getVersion(version.getValue())); if (loadClasses) { Node exportMembers = (Node) e.getNode("packageMembers"); if (exportMembers != null) { if (exportMembers instanceof StandardListNode) { for (Node em : ((StandardListNode) exportMembers).getNodes()) { MapNode m = (MapNode) em; createPackageMember(npe, m); } } else { MapNode m = (MapNode) exportMembers; createPackageMember(npe, m); } } } artefact.addExport(npe); } private void createPackageMember(PackageExport npe, MapNode m) { StandardStringNode name = (StandardStringNode) m.getNode("name"); PackageMemberType type = PackageMemberType.valueOf(((StandardStringNode) m.getNode("type")).getValue()); if (type == PackageMemberType.CLASS) { npe.addClassExport(name.getValue()); } else { npe.addResourceExport(name.getValue()); } } private LibraryArtefact createLibraryArtefact(MapNode nl) throws ParseException { StandardStringNode name = (StandardStringNode) nl.getNode("name"); StandardStringNode version = (StandardStringNode) nl.getNode("version"); StandardStringNode symbolicName = (StandardStringNode) nl.getNode("symbolicName"); StandardStringNode organistationName = (StandardStringNode) nl.getNode("organisationName"); StandardStringNode moduleName = (StandardStringNode) nl.getNode("moduleName"); // StandardStringNode notes = (StandardStringNode) nl.getNode("notes"); StandardBooleanNode sourceAvailable = (StandardBooleanNode) nl.getNode("sourceAvailable"); // StandardStringNode dateAdded = (StandardStringNode) nl.getNode("dateAdded"); LibraryArtefact artefact = new LibraryArtefact(name.getValue(), symbolicName.getValue(), getVersion(version .getValue()), organistationName.getValue(), moduleName.getValue()); // artefact.setNotes(notes.getValue()); artefact.setSourceAvailable(sourceAvailable.getValue()); // artefact.setDateAdded(FORMAT.parse(dateAdded.getValue())); StandardListNode exports = (StandardListNode) nl.getNode("bundleImports"); if (exports != null) { for (Node en : exports.getNodes()) { MapNode e = (MapNode) en; name = (StandardStringNode) e.getNode("name"); version = (StandardStringNode) e.getNode("versionRange"); BundleImport npe = new BundleImport(artefact, name.getValue(), getVersionRange(version.getValue())); artefact.addBundleImport(npe); } } return artefact; } }