| /******************************************************************************* |
| * Copyright (c) 2004, 2005 Sybase, Inc. 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: |
| * Sybase, Inc. - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util; |
| |
| import java.io.IOException; |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.Map; |
| |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.emf.common.util.EList; |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.ecore.EPackage; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.ecore.resource.ResourceSet; |
| import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; |
| import org.eclipse.emf.ecore.xmi.XMLResource; |
| import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage; |
| import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow; |
| import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory; |
| import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode; |
| import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage; |
| import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl; |
| |
| /** |
| * Drives the model. Acts as the model entry point, including create, load, save |
| * operations. |
| * |
| * @author Xiao-guang Zhang |
| */ |
| public class PageflowModelManager { |
| /** |
| * In EMF, a resource provides the way to have access to the model content. |
| */ |
| private Resource resourcePageflow = null; |
| |
| /** |
| * the path of current pageflow model resource provides the way to have |
| * access to the model content. |
| */ |
| private IPath pathPageflow = null; |
| |
| /** |
| * Contains the factory associated with the model. |
| */ |
| private static PageflowFactory pageflowFactory = null; |
| |
| /** |
| * Gives access to the top level pageflow contained in the resource. |
| */ |
| private Pageflow pageflow = null; |
| |
| /** |
| * resource set |
| */ |
| private ResourceSet resourceSet = null; |
| |
| /** unicode encoding UTF-8 support */ |
| private static HashMap defaultSaveOptions = new HashMap(); |
| |
| static { |
| defaultSaveOptions.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Uses lazy initialization. |
| * |
| * @param path - |
| * pageflow file name |
| * @return the resource containing the pageflow |
| */ |
| public Resource getResource(IPath path) { |
| if (resourcePageflow == null) { |
| pathPageflow = path; |
| ResourceSet resSet = getResourceSet(); |
| resourcePageflow = resSet.getResource(URI.createPlatformResourceURI(path |
| .toString(), false), true); |
| } |
| |
| return resourcePageflow; |
| } |
| |
| /** |
| * |
| * @return the top level pageflow model |
| */ |
| public Pageflow getModel() { |
| if (null == pageflow) { |
| EList l = resourcePageflow.getContents(); |
| Iterator i = l.iterator(); |
| while (i.hasNext()) { |
| Object o = i.next(); |
| if (o instanceof Pageflow) { |
| pageflow = (Pageflow) o; |
| } |
| } |
| } |
| return pageflow; |
| } |
| |
| /** |
| * Creates a resource to contain the network. The resource file does not |
| * exist yet. |
| * |
| * @param path |
| * @return |
| */ |
| private Resource createResource(IPath path) { |
| if (resourcePageflow == null) { |
| pathPageflow = path; |
| ResourceSet resSet = getResourceSet(); |
| resourcePageflow = resSet.createResource(URI.createPlatformResourceURI(path |
| .toString(), false)); |
| } |
| return resourcePageflow; |
| } |
| |
| /** |
| * Returns the resource set. |
| * |
| * @param |
| * @return |
| */ |
| private ResourceSet getResourceSet() { |
| if (null == resourceSet) { |
| // Initialize the pageflow package, this line can not be removed. |
| PageflowPackageImpl.init(); |
| // Register the XML resource factory for the .pageflow extension |
| Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE; |
| Map regMap = reg.getExtensionToFactoryMap(); |
| // m.put("pageflow", new XMIResourceFactoryImpl()); |
| regMap.put("pageflow", new PageflowResourceFactoryImpl()); |
| |
| resourceSet = new ResourceSetImpl(); |
| } |
| |
| return resourceSet; |
| } |
| |
| /** |
| * Returns the factory associated with the model. Object creation are made |
| * through that factory. |
| * |
| * @return - pageflow factory |
| */ |
| static public PageflowFactory getFactory() { |
| if (pageflowFactory == null) { |
| // Access the factory (needed to create instances) |
| Map registry = EPackage.Registry.INSTANCE; |
| String pageflowURI = PageflowPackage.eNS_URI; |
| PageflowPackage pageflowPackage = (PageflowPackage) registry |
| .get(pageflowURI); |
| pageflowFactory = pageflowPackage.getPageflowFactory(); |
| } |
| return pageflowFactory; |
| } |
| |
| /** |
| * Creates a new pageflow model with begin and end nodes. |
| * |
| * @param path - |
| * the new pageflow file name |
| * @return - new pageflow model |
| */ |
| public Pageflow createPageflow(IPath path) { |
| createResource(path); |
| // Create a new pageflow model |
| Map registry = EPackage.Registry.INSTANCE; |
| String pageflowURI = PageflowPackage.eNS_URI; |
| PageflowPackage nPackage = (PageflowPackage) registry.get(pageflowURI); |
| PageflowFactory nFactory = nPackage.getPageflowFactory(); |
| pageflow = nFactory.createPageflow(); |
| |
| resourcePageflow.getContents().add(pageflow); |
| return pageflow; |
| } |
| |
| /** |
| * Loads the content of the model from the file. |
| * |
| * @param path |
| */ |
| public void load(IPath path) { |
| getResource(path); |
| } |
| |
| /** |
| * reloads the content of the model from the file. |
| * |
| * @param path |
| */ |
| public void reload(IPath path) { |
| getResource(path).unload(); |
| load(path); |
| } |
| |
| /** |
| * Saves the content of the model to the file. |
| * |
| * @param path |
| * @throws IOException |
| */ |
| public void save(final IPath path) throws IOException { |
| if (!pathPageflow.toString().equalsIgnoreCase(path.toString())) { |
| pathPageflow = path; |
| URI fileURI = URI.createPlatformResourceURI(path.toString(), false); |
| resourcePageflow.setURI(fileURI); |
| } |
| resourcePageflow.save(defaultSaveOptions); |
| } |
| |
| /** |
| * get the file path of current pageflow resource |
| * |
| * @return - the file path |
| */ |
| public IPath getPath() { |
| return pathPageflow; |
| } |
| |
| /** |
| * @param webPath |
| * @return found page node according the web path. |
| */ |
| public PageflowPage foundPage(String webPath) { |
| PageflowPage page = null; |
| |
| if (getModel() != null) { |
| Iterator iterNodes = getModel().getNodes().iterator(); |
| while (iterNodes.hasNext()) { |
| PageflowNode node = (PageflowNode) iterNodes.next(); |
| if (node instanceof PageflowPage) { |
| if (((PageflowPage) node).getPath().equalsIgnoreCase(webPath)) { |
| page = (PageflowPage) node; |
| break; |
| } |
| } |
| } |
| } |
| |
| return page; |
| } |
| |
| /** |
| * |
| * Build a path for the resource in the .metadata directory given the path |
| * of the model resource. For example, given a model resource path of |
| * \test\folder\filename.ext the resulting Pageflow path name will be |
| * \test\.metadata\folder\filename.pageflow |
| * |
| * @param pathFacesConfig - |
| * faces-config file path. |
| * |
| * @return the ipath |
| */ |
| public static IPath makePageflowPath(IPath pathFacesConfig) { |
| IPath pageflowPath; |
| String[] segs = pathFacesConfig.removeFileExtension().segments(); |
| pageflowPath = new Path(segs[0]).makeAbsolute(); |
| pageflowPath = pageflowPath.append(".metadata"); |
| for (int i = 1; i < segs.length; i++) { |
| pageflowPath = pageflowPath.append(segs[i]); |
| } |
| // pageflowPath.removeFileExtension(); |
| pageflowPath = pageflowPath.addFileExtension("pageflow"); |
| return pageflowPath; |
| } |
| } |