| /******************************************************************************* |
| * Copyright (c) 2001, 2005 IBM Corporation and others. |
| * 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.wst.dtd.core.internal.emf.util; |
| |
| import java.io.OutputStream; |
| import java.util.Iterator; |
| import java.util.Map; |
| import java.util.zip.ZipOutputStream; |
| |
| import org.eclipse.emf.common.util.EList; |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.resource.impl.ResourceImpl; |
| import org.eclipse.wst.dtd.core.internal.DTDCoreMessages; |
| import org.eclipse.wst.dtd.core.internal.emf.DTDFile; |
| import org.eclipse.wst.dtd.core.internal.emf.DTDObject; |
| |
| |
| public class DTDResourceImpl extends ResourceImpl { |
| |
| public DTDResourceImpl() { |
| super(); |
| } |
| |
| public DTDResourceImpl(String filename) { |
| super(URI.createURI(filename)); |
| // System.out.println(">>>> DTDResourceImpl ctor 1"); |
| } |
| |
| public DTDResourceImpl(URI uri) { |
| super(uri); |
| // System.out.println(">>>> DTDResourceImpl ctor 2"); |
| } |
| |
| /** |
| * Returns the resolved object for the given URI |
| * {@link URI#fragment fragment}. |
| * <p> |
| * The fragment encoding will typically be that produced by |
| * {@link #getURIFragment getURIFragment}. |
| * </p> |
| * |
| * @param uriFragment |
| * the fragment to resolve. |
| * @return the resolved object for the given fragment. |
| * @see #getURIFragment(EObject) |
| * @see org.eclipse.emf.ecore.resource.ResourceSet#getEObject(URI, boolean) |
| * @see org.eclipse.emf.ecore.util.EcoreUtil#resolve(EObject, org.eclipse.emf.ecore.resource.ResourceSet) |
| * @see org.eclipse.emf.ecore.InternalEObject#eObjectForURIFragmentSegment(String) |
| * @throws org.eclipse.emf.common.util.WrappedException |
| * if a problem occurs navigating the fragment. |
| */ |
| public EObject getEObject(java.lang.String uriFragment) { |
| EList contents = getContents(); |
| if (contents != null) { |
| Iterator i = contents.iterator(); |
| while (i.hasNext()) { |
| Object obj = i.next(); |
| if (obj instanceof DTDFile) { |
| // there should only be one DTDFile in a DTD extent |
| EObject result = ((DTDFile) obj).findObject(uriFragment); |
| return result; |
| } |
| } |
| } |
| System.out.println(">>> DTDKey Error: cannot find object " + uriFragment); //$NON-NLS-1$ |
| return super.getEObject(uriFragment); |
| } |
| |
| /** |
| * Returns the URI {@link URI#fragment fragment} that, when passed to |
| * {@link #getEObject getEObject} will return the given object. |
| * <p> |
| * In other words, the following is <code>true</code> for any object |
| * contained by a resource: |
| * |
| * <pre> |
| * |
| * Resource resource = eObject.eResource(); |
| * eObject == resource.getEObject(resource.getURIFragment(eObject)) |
| * |
| * </pre> |
| * |
| * An implementation may choose to use IDs or to use structured URI |
| * fragments, as supported by |
| * {@link org.eclipse.emf.ecore.InternalEObject#eURIFragmentSegment eURIFragmentSegment}. |
| * </p> |
| * |
| * @param eObject |
| * the object to identify. |
| * @return the URI {@link URI#fragment fragment} for the object. |
| * @see #getEObject(String) |
| * @see org.eclipse.emf.ecore.InternalEObject#eURIFragmentSegment(org.eclipse.emf.core.EStructuralFeature, |
| * EObject) |
| */ |
| public java.lang.String getURIFragment(EObject eObject) { |
| if (eObject instanceof DTDObject) { |
| return ((DTDObject) eObject).getPathname(); |
| } |
| return super.getURIFragment(eObject); |
| } |
| |
| private DTDUtil dtdUtil; |
| |
| public DTDUtil getDTDUtil() { |
| return dtdUtil; |
| } |
| |
| public void setDTDUtil(DTDUtil dtdUtil) { |
| this.dtdUtil = dtdUtil; |
| } |
| |
| public void load(Map options) { |
| |
| String uriString = getURI().toString(); |
| try { |
| DTDUtil dtdUtil = new DTDUtil(); |
| dtdUtil.parse(getResourceSet(), uriString); |
| dtdUtil.setResource(this); |
| setDTDUtil(dtdUtil); |
| getContents().add(dtdUtil.getDTDFile()); |
| |
| // Reset the dirty flag after the resource is loaded |
| setModified(false); |
| } |
| catch (Exception exc) { |
| exc.printStackTrace(); |
| } |
| } |
| |
| public void save(OutputStream os, Object options) throws Exception { |
| if (contents != null) { |
| Iterator i = contents.iterator(); |
| while (i.hasNext()) { |
| Object obj = i.next(); |
| if (obj instanceof DTDFile) { |
| try { |
| DTDPrinter printer = new DTDPrinter(true); |
| printer.visitDTDFile((DTDFile) obj); |
| |
| String s = printer.getBuffer().toString(); |
| os.write(s.getBytes()); |
| // Reset the dirty flag after the resource is saved |
| setModified(false); |
| } |
| catch (Exception e) { |
| } |
| break; |
| } |
| } |
| } |
| } |
| |
| public void save(ZipOutputStream zos, String entry, String metaModelName) throws Exception { |
| throw new Exception(DTDCoreMessages._EXC_OPERATION_NOT_SUPPORTED); //$NON-NLS-1$ |
| } |
| } |