/******************************************************************************* * Copyright (c) 2010 Martin Schnabel <mb0@mb0.org>. * 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 ******************************************************************************/ package org.axdt.asdoc.access; import java.io.IOException; import java.util.Map; import org.axdt.asdoc.AsdocEFactory; import org.axdt.asdoc.AsdocEPackage; import org.axdt.asdoc.model.AsdocRoot; import org.axdt.asdoc.model.ParseType; import org.axdt.asdoc.util.AsdocEXMLProcessor; import org.axdt.asdoc.util.DitaUrlHelper; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import com.google.common.collect.Maps; public abstract class AbstractAsdocRootProvider implements IDocRootProvider { protected final Map<String, AsdocRoot> roots; protected final AsdocEXMLProcessor xmlProcessor; public AbstractAsdocRootProvider() { xmlProcessor = new AsdocEXMLProcessor(); roots = Maps.newHashMap(); } public AsdocRoot getRoot(String url) { return roots.get(url); } public AsdocRoot addRoot(String name, String url) { AsdocRoot root = roots.get(url); if (root == null) { root = createRoot(name, url); if (root != null) { roots.put(url, root); } } return root; } protected abstract URI createDocRootUri(String url); protected Resource loadResource(URI resourceUri) { ResourceSet set = xmlProcessor.createResourceSet(); Resource resource = set.getResource(resourceUri, false); if (resource == null) resource = set.createResource(resourceUri); try { resource.load(null); } catch (IOException e) { } return resource; } protected ParseType getParseType(String url) { return url.endsWith(DitaUrlHelper.PACKAGE_LIST) ? ParseType.DITA : ParseType.HTML; } protected AsdocRoot createRoot(String name, String url) { AsdocRoot root = null; URI docRootUri = createDocRootUri(url); Resource resource = loadResource(docRootUri); if (resource.getContents().size()>0) { EObject eobject = resource.getContents().get(0); if (eobject instanceof AsdocRoot) { root = (AsdocRoot) eobject; if (root.getVersion() < AsdocEPackage.CURRENT_VERSION) root = null; } } if (root == null) { ParseType parseType = getParseType(url); if (parseType.equals(ParseType.DITA)) url = url.substring(0, url.length() - DitaUrlHelper.PACKAGE_LIST.length()); root = AsdocEFactory.eINSTANCE.createAsdocRoot(url); root.setParseType(parseType); root.setVersion(AsdocEPackage.CURRENT_VERSION); resource.getContents().clear(); resource.getContents().add(root); resource.setModified(true); } return root; } }