/*************************************************************************************************** * Copyright (c) 2005, 2006 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.jst.jsf.facesconfig.util; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin; import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType; import org.eclipse.wst.common.componentcore.ArtifactEdit; import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel; import org.eclipse.wst.common.componentcore.resources.IVirtualFile; import org.eclipse.wst.common.componentcore.resources.IVirtualResource; import org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSERenderer; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; /** * The artifact edit for the JSF Application Configuration (faces-config) model - may be used but not extended by clients. * * This class maybe refactored to a different package in the future. */ public final class FacesConfigArtifactEdit extends ArtifactEdit { private static final String EDIT_MODEL_ID = "jsf.facesconfig"; //$NON-NLS-1$ private String sFileName = null; private FacesConfigType facesConfig = null; private URI facesConfigURI = URI.createURI(IFacesConfigConstants.FACES_CONFIG_URI); private boolean bRegistered = false; /** * @param aProject * @param toAccessAsReadOnly * @throws IllegalArgumentException */ public FacesConfigArtifactEdit(IProject aProject, boolean toAccessAsReadOnly) throws IllegalArgumentException { super(aProject, toAccessAsReadOnly, false, EDIT_MODEL_ID); } /** * @param aProject * @param sConfigFile * @return the faces config artifact for the file config file sConfig in project aProject. * Opened only for read access (no write) */ public static FacesConfigArtifactEdit getFacesConfigArtifactEditForRead(IProject aProject, String sConfigFile) { FacesConfigArtifactEdit artifactEdit = null; try { artifactEdit = new FacesConfigArtifactEdit(aProject, true); if (artifactEdit != null) { artifactEdit.setFilename(sConfigFile); } } catch (IllegalArgumentException iae) { // suppress illegal argument exception FacesConfigPlugin.write(iae); } return artifactEdit; } /** * @param aProject * @return the default artifact edit * @deprecated Use getFacesConfigArtifactEditForRead(IProject, String) instead. This * method is dangerous because the caller is assuming that the "default" * model exists and knows nothing about where it is coming from. */ public static FacesConfigArtifactEdit getFacesConfigArtifactEditForRead(IProject aProject) { return getFacesConfigArtifactEditForRead(aProject, null); } /** * @param aProject * @param sConfigFile * @return the faces config artifact for the file config file sConfig in project aProject. * Opened for both write and read access */ public static FacesConfigArtifactEdit getFacesConfigArtifactEditForWrite(IProject aProject, String sConfigFile) { FacesConfigArtifactEdit artifactEdit = null; try { artifactEdit = new FacesConfigArtifactEdit(aProject, false); if (artifactEdit != null) { artifactEdit.setFilename(sConfigFile); } } catch (IllegalArgumentException iae) { // suppress illegal argument exception FacesConfigPlugin.write(iae); } return artifactEdit; } /** * @param aProject * @return the default artifact edit for read * @deprecated Use getFacesConfigArtifactEditForWrite(IProject, String) * instead. This method is dangerous because the caller is assuming that * the "default" model exists and knows nothing about where it is coming * from. */ public static FacesConfigArtifactEdit getFacesConfigArtifactEditForWrite(IProject aProject) { return getFacesConfigArtifactEditForWrite(aProject, null); } /** * @return the root model object for this artifact edit model */ public FacesConfigType getFacesConfig() { if (facesConfig == null) { // TODO: XN - does not seem a good way to check whether the resource has been registered each time. // The following comment is from StrutsArchfactEdit: // This is a hack to ensure that our Resource.Factory is used to // create // the Resource. It's the same hack used by JaxRPCMapArtifactEdit. // The problem is that there is no way to register a Resource.Factory // by, say, content type. // The best we can do is register by last file segment, which isn't // strictly correct. // Plus, there's no way to deregister. if (sFileName != null) { if (!bRegistered) { //if (FacesConfigResourceFactory.getRegisteredFactory(URI.createURI(sFileName)) == null) { FacesConfigResourceFactory.register(sFileName); bRegistered = true; } } facesConfig = (FacesConfigType)getDeploymentDescriptorRoot(); } return facesConfig; } /** * @return the uri pointing to the source of this faces config artifact */ public URI getFacesConfigURI() { return facesConfigURI; } /** * @return the model root */ public EObject getDeploymentDescriptorRoot() { Resource deploymentDescriptorResource = getDeploymentDescriptorResource(); if (deploymentDescriptorResource != null) { List contents = deploymentDescriptorResource.getContents(); if (contents.size() > 0) { return (EObject) contents.get(0); } } return null; // TODO: XN // addFacesConfigIfNecessary((IFacesConfigResource)getDeploymentDescriptorResource()); // return (EObject) contents.get(0); } /** * @return the EMF resource retrieved for this artifact's uri or null if * this descriptor has not resource. */ public Resource getDeploymentDescriptorResource() { if (sFileName != null) { facesConfigURI = URI.createURI(sFileName); } else {// default is "WEB-INF/faces-config.xml" facesConfigURI = URI.createURI(IFacesConfigConstants.FACES_CONFIG_URI); } final ArtifactEditModel artifactEditModel = getArtifactEditModel(); if (artifactEditModel != null) { return artifactEditModel.getResource(facesConfigURI); } return null; } /** * Sets an instance's filename, used to create a URI and load a model. * * @param filename This instance's filename. */ public void setFilename(String filename) { sFileName = filename; if (filename != null && filename.length() > 0) { facesConfigURI = URI.createURI(filename); } } // TODO: appears to be dead // protected void addFacesConfigIfNecessary(TranslatorResource aResource) { // //TO: XN - See how to create one if the config file does not exist // /*if (aResource != null) { // if(aResource.getContents() == null || aResource.getContents().isEmpty()) { // FacesConfigType facesConfigNew = WebapplicationFactory.eINSTANCE.createWebApp(); // aResource.getContents().add(facesConfigNew); // aResource.setModified(true); // } // FacesConfigType facesConfig = (FacesConfigType)aResource.getContents().get(0); // URI moduleURI = getArtifactEditModel().getModuleURI(); // try { // facesConfig.setDisplayName(StructureEdit.getDeployedName(moduleURI)); // } catch (UnresolveableURIException e) { // //Ignore // } // aResource.setID(facesConfig, J2EEConstants.WEBAPP_ID); // // try{ // aResource.saveIfNecessary(); // }catch(Exception e){ // e.printStackTrace(); // } // }*/ // } /** * @return the DOM model for the Struts config. file. */ public IDOMModel getIDOMModel() { // Modeled after SourceNestedEditorPage.getXMLModelFromResource(). // TODO - XN This is a little hackish because it depends on the resource's // renderer being an EMF2DOMSedRenderer (which it is, but that could // change). Resource resource = getDeploymentDescriptorResource(); if (resource instanceof IFacesConfigResource) { EMF2DOMSSERenderer renderer = (EMF2DOMSSERenderer) ((IFacesConfigResource)resource).getRenderer(); return renderer.getXMLModel(); } return null; } /** * @return the IFile used to load the model or null if none. */ public IFile getFile() { IVirtualResource resource = getComponent().getRootFolder().findMember(facesConfigURI.toString()); if ((resource != null) && (resource.getType() == IVirtualResource.FILE)) return ((IVirtualFile) resource).getUnderlyingFile(); return null; } /** * @return true if the underlying model has been disposed */ public boolean isDisposed() { return getArtifactEditModel().isDisposed(); } }