private static void parseResourceRoot( final File root, final XMLStreamReader reader, final ModuleSpec.Builder specBuilder) throws XMLStreamException { final ModuleIdentifier identifier = specBuilder.getIdentifier(); String name = null; String path = null; final Set<Attribute> required = EnumSet.of(Attribute.PATH); final int count = reader.getAttributeCount(); for (int i = 0; i < count; i++) { final Attribute attribute = Attribute.of(reader.getAttributeName(i)); required.remove(attribute); switch (attribute) { case NAME: name = reader.getAttributeValue(i); break; case PATH: path = reader.getAttributeValue(i); break; default: throw unexpectedContent(reader); } } if (!required.isEmpty()) { throw missingAttributes(reader.getLocation(), required); } if (name == null) name = path; // todo add to spec final File file = new File(root, path); final ResourceLoader resourceLoader; final MultiplePathFilterBuilder builder = PathFilters.multiplePathFilterBuilder(true); while (reader.hasNext()) { switch (reader.nextTag()) { case XMLStreamConstants.END_ELEMENT: { final PathFilter exportFilter = builder.create(); if (file.isDirectory()) { resourceLoader = new FileResourceLoader(identifier, file, name, exportFilter); } else { try { resourceLoader = new JarFileResourceLoader(identifier, new JarFile(file), name, exportFilter); } catch (IOException e) { throw new XMLStreamException("Invalid JAR file specified", reader.getLocation(), e); } } specBuilder.addResourceRoot(resourceLoader); return; } case XMLStreamConstants.START_ELEMENT: { switch (Element.of(reader.getName())) { case EXPORTS: parseFilterList(reader, builder); break; default: throw unexpectedContent(reader); } break; } default: { throw unexpectedContent(reader); } } } }
private static void parseModuleDependency( final XMLStreamReader reader, final ModuleSpec.Builder specBuilder) throws XMLStreamException { String name = null; String slot = null; boolean export = false; boolean optional = false; final Set<Attribute> required = EnumSet.of(Attribute.NAME); final int count = reader.getAttributeCount(); for (int i = 0; i < count; i++) { final Attribute attribute = Attribute.of(reader.getAttributeName(i)); required.remove(attribute); switch (attribute) { case NAME: name = reader.getAttributeValue(i); break; case SLOT: slot = reader.getAttributeValue(i); break; case EXPORT: export = Boolean.parseBoolean(reader.getAttributeValue(i)); break; case OPTIONAL: optional = Boolean.parseBoolean(reader.getAttributeValue(i)); break; default: throw unexpectedContent(reader); } } if (!required.isEmpty()) { throw missingAttributes(reader.getLocation(), required); } final MultiplePathFilterBuilder importBuilder = PathFilters.multiplePathFilterBuilder(true); final MultiplePathFilterBuilder exportBuilder = PathFilters.multiplePathFilterBuilder(true); while (reader.hasNext()) { switch (reader.nextTag()) { case XMLStreamConstants.END_ELEMENT: { final PathFilter exportFilter = export ? exportBuilder.create() : PathFilters.rejectAll(); final PathFilter importFilter = importBuilder.create(); specBuilder.addDependency( DependencySpec.createModuleDependencySpec( importFilter, exportFilter, null, ModuleIdentifier.create(name, slot), optional)); return; } case XMLStreamConstants.START_ELEMENT: { switch (Element.of(reader.getName())) { case EXPORTS: parseFilterList(reader, exportBuilder); break; case IMPORTS: parseFilterList(reader, importBuilder); break; default: throw unexpectedContent(reader); } break; } default: { throw unexpectedContent(reader); } } } }