blob: 5cc620d1da8ef2e10899733ac11dbb9030be0b42 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.publishing.services;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
import org.eclipse.epf.common.serviceability.DebugTrace;
import org.eclipse.epf.common.utils.FileUtil;
import org.eclipse.epf.common.utils.StrUtil;
import org.eclipse.epf.common.utils.Timer;
import org.eclipse.epf.library.configuration.ConfigurationFilter;
import org.eclipse.epf.library.configuration.ConfigurationHelper;
import org.eclipse.epf.library.edit.IFilter;
import org.eclipse.epf.library.edit.TngAdapterFactory;
import org.eclipse.epf.library.edit.configuration.PracticeSubgroupItemProvider;
import org.eclipse.epf.library.edit.process.IBSItemProvider;
import org.eclipse.epf.library.edit.util.ProcessUtil;
import org.eclipse.epf.library.edit.util.Suppression;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.library.layout.Bookmark;
import org.eclipse.epf.library.layout.IElementLayout;
import org.eclipse.epf.library.layout.elements.ActivityLayout;
import org.eclipse.epf.library.layout.elements.ProcessElementItem;
import org.eclipse.epf.library.layout.elements.ProcessLayoutData;
import org.eclipse.epf.library.layout.elements.SummaryPageLayout;
import org.eclipse.epf.library.layout.util.XmlElement;
import org.eclipse.epf.library.util.LibraryUtil;
import org.eclipse.epf.publishing.PublishingPlugin;
import org.eclipse.epf.publishing.PublishingResources;
import org.eclipse.epf.publishing.util.PublishingUtil;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.Artifact;
import org.eclipse.epf.uma.ContentCategory;
import org.eclipse.epf.uma.DeliveryProcess;
import org.eclipse.epf.uma.Descriptor;
import org.eclipse.epf.uma.Discipline;
import org.eclipse.epf.uma.Guidance;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.MethodPackage;
import org.eclipse.epf.uma.MethodPlugin;
import org.eclipse.epf.uma.Practice;
import org.eclipse.epf.uma.Process;
import org.eclipse.epf.uma.ProcessElement;
import org.eclipse.epf.uma.Role;
import org.eclipse.epf.uma.SupportingMaterial;
import org.eclipse.epf.uma.Task;
import org.eclipse.epf.uma.Tool;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.uma.WorkProduct;
import org.eclipse.epf.uma.util.AssociationHelper;
/**
* Builds the views defined for a method configuration.
*
* @author Shilpa Toraskar
* @author Jinhua Xi
* @author Kelvin Low
* @since 1.0
*/
public class ConfigurationViewBuilder extends AbstractViewBuilder {
private static final String PREFIX_Reference_Workflows = "Reference_Workflows"; //$NON-NLS-1$
private static final String PREFIX_Tasks = "Tasks"; //$NON-NLS-1$
private static final String PREFIX_ResponsibleFor_Tasks = "Primarily_Performs"; //$NON-NLS-1$
private static final String PREFIX_ParticipatesIn_Tasks = "Additionally_Performs"; //$NON-NLS-1$
private static final String PREFIX_Performing_Roles = "Performing_Roles"; //$NON-NLS-1$
private static final String PREFIX_Input_Work_Products = "Input_Work_Products"; //$NON-NLS-1$
private static final String PREFIX_Output_Work_Products = "Output_Work_Products"; //$NON-NLS-1$
private static final String PREFIX_Work_Products_Created = "Responsible_For"; //$NON-NLS-1$
private static final String PREFIX_Work_Products_Modified = "Modifies"; //$NON-NLS-1$
private static final String PREFIX_Responsible_Role = "Responsible_Role"; //$NON-NLS-1$
private static final String PREFIX_Containing_Work_Product = "Containing_Work_Product"; //$NON-NLS-1$
private static final String PREFIX_Contained_Work_Products = "Contained_Work_Products"; //$NON-NLS-1$
private static final String PREFIX_Guidances = "Guidance"; //$NON-NLS-1$
private static final String PREFIX_InputTo_Task = "Input_to"; //$NON-NLS-1$
private static final String PREFIX_OutputOf_Task = "Output_from"; //$NON-NLS-1$
private static final String ICON_FOLDER = DefaultNodeIconResources
.getIconName("folder"); //$NON-NLS-1$
private static final String NODE_Reference_Workflows = PublishingResources.referenceWorkflowsNode_text; //$NON-NLS-1$
private static final String NODE_Tasks = PublishingResources.taskNode_text; //$NON-NLS-1$
private static final String NODE_ResponsibleFor_Tasks = PublishingResources.primarilyPerformsNode_text; //$NON-NLS-1$
private static final String NODE_ParticipatesIn_Tasks = PublishingResources.additionallyPerformsNode_text; //$NON-NLS-1$
private static final String NODE_Performing_Roles = PublishingResources.performingRolesNode_text; //$NON-NLS-1$
private static final String NODE_Input_Work_Products = PublishingResources.inputWorkProductsNode_text; //$NON-NLS-1$
private static final String NODE_Output_Work_Products = PublishingResources.outputWorkProductsNode_text; //$NON-NLS-1$
private static final String NODE_Work_Products_Created = PublishingResources.responsibleForNode_text; //$NON-NLS-1$
private static final String NODE_Work_Products_Modified = PublishingResources.modifiesNode_text; //$NON-NLS-1$
private static final String NODE_Responsible_Role = PublishingResources.responsibleRoleNode_text; //$NON-NLS-1$
private static final String NODE_Containing_Work_Product = PublishingResources.containingWorkProductNode_text; //$NON-NLS-1$
private static final String NODE_Contained_Work_Products = PublishingResources.containedWorkProductsNode_text; //$NON-NLS-1$
private static final String NODE_Guidances = PublishingResources.guidanceNode_text; //$NON-NLS-1$
private static final String NODE_InputTo_Task = PublishingResources.inputToNode_text; //$NON-NLS-1$
private static final String NODE_OutputOf_Task = PublishingResources.outputFromNode_text; //$NON-NLS-1$
private static final String PROCESS_LAYOUT_DATA_FILE = "/scripts/processElementData.js"; //$NON-NLS-1$
private static final Class ITreeItemContentProviderClass = ITreeItemContentProvider.class;
protected static boolean debug = PublishingPlugin.getDefault()
.isDebugging();
protected List<Bookmark> bookmarks = new ArrayList<Bookmark>();
protected AdapterFactory adapterFactory;
protected IProgressMonitor monitor = null;
protected EObjectComparator nameComparator = new EObjectComparator();
/**
* Creates a new instance.
*/
public ConfigurationViewBuilder(ISiteGenerator siteGenerator) {
super(siteGenerator);
}
/**
* Build the views defined in the configuration and publish the related
* contents.
*
* @param monitor
* IProgressMonitor
* @return List a list of Bookmarks for the views
*/
public List<Bookmark> buildViews(IProgressMonitor monitor) {
this.monitor = monitor;
// System.out.println("Building views..."); //$NON-NLS-1$
long startTime = 0L;
if (config != null) {
// already done in PublishManager
// // first of all, we need to load the library,
// // otherwise, some relationships and opposite features are not
// // established
// monitor.subTask(PublishingResources.loadLibraryTask_name);
// if (profiling) {
// startTime = System.currentTimeMillis();
// }
// LibraryUtil.loadAll((MethodLibrary) config.eContainer());
// if (profiling) {
// DebugTrace.print(this, "buildViews", "LibraryUtil.loadAll: " //$NON-NLS-1$ //$NON-NLS-2$
// + (System.currentTimeMillis() - startTime)
// + " ms"); //$NON-NLS-1$
// }
// create a filter that does not discard the contributors.
// so we get the contributors in to show in the navigation tree
IFilter configFilter = new ConfigurationFilter(config, false);
adapterFactory = TngAdapterFactory.INSTANCE
.getConfigurationView_AdapterFactory(configFilter);
if (options != null && options.isPublishProcess()) {
makeProcessClosure();
}
// publish all the views in the configuration
if (profiling) {
startTime = System.currentTimeMillis();
}
List views = LibraryUtil.getValidViews(config);
for (Iterator it = views.iterator(); it.hasNext();) {
if (monitor.isCanceled()) {
return null;
}
ContentCategory v = (ContentCategory) it.next();
if (!ConfigurationHelper.canShow(v, config)) {
continue;
}
Object element = LibraryUtil.unwrap(v);
Bookmark b = createBookmark(this.monitor, element);
if (v == config.getDefaultView()) {
super.defaultView = b;
}
// iterate thru configuration to build the view
iterate(v, b);
if (b.getChildCount() > 0) {
bookmarks.add(b);
}
}
if (profiling) {
System.out.println("Time taken to publish bookmarks: " //$NON-NLS-1$
+ (System.currentTimeMillis() - startTime) + " ms"); //$NON-NLS-1$
}
if (monitor.isCanceled()) {
return null;
}
}
if (profiling) {
startTime = System.currentTimeMillis();
}
publishReferenceElements();
if (profiling) {
DebugTrace.print(this, "publishReferenceElements", //$NON-NLS-1$
(System.currentTimeMillis() - startTime) + " ms"); //$NON-NLS-1$
}
// copyIconsForNonApplet();
if (monitor.isCanceled()) {
return null;
}
// save published element urls
if (profiling) {
startTime = System.currentTimeMillis();
}
saveElementUrls();
if (profiling) {
DebugTrace.print(this, "saveElementUrls", //$NON-NLS-1$
(System.currentTimeMillis() - startTime) + " ms"); //$NON-NLS-1$
}
return bookmarks;
}
/**
* The process element closure is generated as follows:
* <p>
* 1. publish the selected processses, which brings in all the related
* process elements
* <p>
* 2. publish all the referenced process elements from step 1, this brings
* in all the directly referenced content elements. make a first level
* closure to include the published elements and the referenced elements.
* Any direct references to any type of guidances are also in this closure.
* <p>
* 3. publish all the referened non-ContentCategory content elements from
* step 2. based on the first level closure. The purpose of the first level
* closure is to allow bring in guidances with valid element link and any
* other references such as a Task or Role, being linked with a missing
* element link. This again brings in all the direct references
* <p>
* 4.Make the final closure by including the following elements:
* <p>
* a. all published elements from step 1,2,3.
* <p>
* b. all referenced Guidances from step 3
* <p>
* c. all Guidances of type Practice, RoadMap, Suporting Material, and Term
* Definition, in the configuration
* <p>
* d. all Content Categories that contains at least one element of type a,
* b, or c. and their parent categories
* <p>
* The selected view is published based on the element closure defined
* above.
*/
private void makeProcessClosure() {
monitor.subTask(PublishingResources.buildingProcessClosureTask_name);
// publish the selected processes
// need to build a closure of all the elements involved in the
// processes
List<Process> processes = options.getProcesses();
if (processes != null && processes.size() > 0) {
for (Iterator<Process> it = processes.iterator(); it.hasNext();) {
makeProcessClosure(it.next());
if (monitor.isCanceled()) {
return;
}
}
}
// make the first level closure to include all the process elements and
// it's referenced elements
// any thing except Guidances and ContentCategories outside the closure
// is filtered
getValidator()
.addClosureElements(getValidator().getPublishedElements());
getValidator().addClosureElements(
getValidator().getReferencedElements());
// now publish all referenced elements, any direct references in the
// process elements are
// part of the closure
// don't publish content categories for now since they might be empty
// and discarded later
List refs = new ArrayList(getValidator().getReferencedElements());
for (Iterator it = refs.iterator(); it.hasNext();) {
MethodElement e = (MethodElement) it.next();
if (!(e instanceof ContentCategory)) {
super.publish(monitor, e);
// collect process specific layout info with suppression status
// this will incldue the diagrams and the supression states of
// each item under the current procee
if (LibraryUtil.isProcess(e)) {
publishProcessLayout((org.eclipse.epf.uma.Process) e);
}
}
}
// now, any referenced guidance should be in the closure,
// so include them and make the final closure
refs.clear();
for (Iterator it = getValidator().getReferencedElements().iterator(); it
.hasNext();) {
MethodElement e = (MethodElement) it.next();
if (e instanceof Guidance) {
refs.add(e);
}
}
if (refs.size() > 0) {
getValidator().addClosureElements(refs);
}
// now all the published elements are the element closure, make the
// final closure
getValidator().makeElementClosure(config);
}
private void makeProcessClosure(org.eclipse.epf.uma.Process proc) {
if (proc == null) {
return;
}
if (ConfigurationHelper.canShow(proc, config)) {
ActivityLayout l = new ActivityLayout();
l.init(getLayoutMgr(), proc, proc, null);
l.findAllLinkedElements();
}
if (monitor.isCanceled()) {
return;
}
if (ConfigurationHelper.isExtender(proc)) {
org.eclipse.epf.uma.Process baseProc = (org.eclipse.epf.uma.Process) proc
.getVariabilityBasedOnElement();
if (ConfigurationHelper.inConfig(baseProc, config)) {
makeProcessClosure(baseProc);
}
}
}
private void publishReferenceElements() {
// now process the referenced elements and publish the contents
while (getValidator().getReferencedElements().size() > 0) {
MethodElement e = (MethodElement) getValidator()
.getReferencedElements().remove(0);
try {
if (monitor.isCanceled()) {
return;
}
// references to method plugins and method packages can be
// ignored
if (e instanceof MethodPlugin || e instanceof MethodPackage) {
continue;
}
long startTime = System.currentTimeMillis();
super.publish(monitor, e);
// collect process specific layout info with suppression status
// this will incldue the diagrams and the supression states of
// each item under the current procee
if (LibraryUtil.isProcess(e)) {
// long startTime1 = System.currentTimeMillis();
publishProcessLayout((org.eclipse.epf.uma.Process) e);
// long endTime1 = System.currentTimeMillis();
// System.out.println("Published process " + e.getName() +
// ": " + (endTime1 - startTime1) + " ms");
}
long endTime = System.currentTimeMillis();
long timeTaken = endTime - startTime;
if (timeTaken >= 5000) {
System.out.println("Published " + e.getName() + ": " //$NON-NLS-1$ //$NON-NLS-2$
+ timeTaken + " ms"); //$NON-NLS-1$
}
} catch (Exception ex) {
ex.printStackTrace();
getValidator().logError(e, "Error publishing element", ex); //$NON-NLS-1$
}
}
}
private void publishProcessLayout(final org.eclipse.epf.uma.Process e) {
Runnable runnable = new Runnable() {
public void run() {
try {
ActivityLayout layout = new ActivityLayout();
layout.init(getLayoutMgr(),
(org.eclipse.epf.uma.Process) e, null, null);
ProcessLayoutData pd = new ProcessLayoutData(e.getGuid());
layout.loadLayoutData(pd, true, true, true);
printLayoutScript(pd);
pd.clear();
} catch (Exception e1) {
getValidator()
.logError(
e,
"Error publishing process specific layout data", e1); //$NON-NLS-1$
}
}
};
Timer timer = new Timer();
try {
// run the publishing and check the time, if timeout, terminate it
Thread t = new Thread(runnable);
t.start();
t.join(TIMEOUT_INTERVAL);
if (t.isAlive()) {
// wait for the thread to die and log an error
timer.stop();
getValidator()
.logInfo(
e,
"publishing process specific layout data takes " + timer.getTime() + " mini seconds already and is still not done yet ..."); //$NON-NLS-1$ //$NON-NLS-2$
timer.start();
t.join();
}
} catch (InterruptedException e1) {
e1.printStackTrace();
} finally {
timer.stop();
getValidator()
.logInfo(
e,
timer.getTotalTime()
+ " mini seconds publishing process specific layout data"); //$NON-NLS-1$
}
}
private void printLayoutScript(ProcessLayoutData data) {
File outputFile = new File(getLayoutMgr().getPublishDir(),
PROCESS_LAYOUT_DATA_FILE); //$NON-NLS-1$
PrintWriter pw = null;
try {
// create a stream with append enabled
FileOutputStream os = new FileOutputStream(outputFile, true);
// create a write with utf-8 encoding
OutputStreamWriter writer = new OutputStreamWriter(os, "utf-8"); //$NON-NLS-1$
// create a print writer with auto flush
pw = new PrintWriter(writer, true);
data.print(pw);
} catch (Exception e) {
getValidator().logError("unable to save process layout data", e); //$NON-NLS-1$
} finally {
if (pw != null) {
pw.flush();
pw.close();
}
}
}
/**
* Iterate thru tuee
*
* @param obj
* @param parent
*/
private void iterate(Object obj, Bookmark parent) {
try {
if (monitor.isCanceled()) {
return;
}
// Get the adapter from the factory.
ITreeItemContentProvider treeItemContentProvider = null;
if (obj instanceof ITreeItemContentProvider) {
treeItemContentProvider = (ITreeItemContentProvider) obj;
} else {
treeItemContentProvider = (ITreeItemContentProvider) adapterFactory
.adapt(obj, ITreeItemContentProvider.class);
}
// Either delegate the call or return nothing.
if (treeItemContentProvider != null) {
Collection items = treeItemContentProvider.getChildren(obj);
for (Iterator it = items.iterator(); it.hasNext();) {
if (monitor.isCanceled()) {
return;
}
// create bookmark
Object itorObj = it.next();
Object element = LibraryUtil.unwrap(itorObj);
if ((element instanceof MethodElement)) {
MethodElement me = (MethodElement) element;
try {
if (ConfigurationHelper.canShow(me, config)) {
me = ConfigurationHelper
.getCalculatedElement(me,
getLayoutMgr()
.getElementRealizer());
if (me != null) {
if (me instanceof Tool) {
buildToolSubTree((Tool) me, parent);
} else if (me instanceof Discipline) {
buildDisciplineSubTree((Discipline) me,
parent);
}
// else if (me instanceof DisciplineGrouping
// || me instanceof Domain || me instanceof
// WorkProductType
// || me instanceof RoleSetGrouping || me
// instanceof RoleSet )
else if (me instanceof ContentCategory) {
ContentCategory cc = (ContentCategory) me;
// if the content category is empty,
// don't add to the parent
Bookmark b = createBookmark(
this.monitor, cc);
iterate(itorObj, b);
if (options.isPublishEmptyCategories()
|| b.getChildCount() > 0) {
parent.addChild(b);
discardEmptyCategory(cc, false);
} else {
discardEmptyCategory(cc, true);
}
} else {
if (itorObj instanceof PracticeSubgroupItemProvider) {
buildPracticeSubgroupTree(obj, parent,
(PracticeSubgroupItemProvider) itorObj);
} else {
Bookmark b = createBookmark(me, parent);
if (!buildSubTree(itorObj, me, b)) {
iterate(itorObj, b);
}
}
}
}
}
} catch (Exception e) {
String message = "Error building navigation tree for " + LibraryUtil.getTypeName(me); //$NON-NLS-1$
getHtmlBuilder().getValidator()
.logError(message, e);
e.printStackTrace();
}
} else {
if (itorObj instanceof PracticeSubgroupItemProvider) {
buildPracticeSubgroupTree(obj, parent, (PracticeSubgroupItemProvider) itorObj);
} else {
iterate(itorObj, parent);
}
}
}
}
} catch (Exception e) {
String message = "Error building navigation tree"; //$NON-NLS-1$
getHtmlBuilder().getValidator().logError(message, e);
e.printStackTrace();
}
}
/**
* create a bookmark under the specified parent. If no parent is specified,
*
* @param monitor
* @param element
* @param parent
* @return
*/
protected Bookmark createBookmark(Object element, Bookmark parent) {
Bookmark b = createBookmark(this.monitor, element);
if (parent == null) {
bookmarks.add(b);
} else {
parent.addChild(b);
}
return b;
}
/**
* build the sub tree for the given element. return true if the element is
* handled, false otherwise
*
* @param element
* @param bm
* @return boolean
*/
private boolean buildSubTree(Object obj, MethodElement element, Bookmark bm) {
boolean isShowRelatedLinks = options.isShowRelatedLinks();
if (element instanceof Task) {
if(isShowRelatedLinks) {
buildTaskSubTree((Task) element, bm);
} else {
return true;
}
} else if (element instanceof Role) {
if(isShowRelatedLinks) {
buildRoleSubTree((Role) element, bm);
} else {
return true;
}
} else if (element instanceof WorkProduct) {
if(isShowRelatedLinks) {
buildWorkProductSubTree((WorkProduct) element, bm);
} else {
return true;
}
} else if (LibraryUtil.isProcess(element)) {
buildProcessSubTree(obj, (org.eclipse.epf.uma.Process) element, bm);
} else {
// System.out.println("Not handled: " + element);
return false;
}
return true;
}
private void buildItems(List elements, Bookmark bm) {
buildItems(elements, bm, false);
}
private void buildItems(List elements, Bookmark bm, boolean buildSubTree) {
for (Iterator it = elements.iterator(); it.hasNext();) {
if (monitor.isCanceled()) {
return;
}
MethodElement element = (MethodElement) it.next();
// filter away the containment child-element if any of the parent(s)
// are in the list
// 00384619 - Published site: Display of WPs under responsible role
// if the container of the element is in the list, ignore it
if (ConfigurationHelper.isContainmentElement(element)
&& ConfigurationHelper.isContainerInList(element, elements,
config)) {
continue;
}
buildItem(element, bm, buildSubTree);
}
}
private Bookmark buildItem(MethodElement element, Bookmark parent,
boolean buildSubTree) {
if (monitor.isCanceled()) {
return null;
}
Bookmark b = null;
// make sure the element is showable
MethodElement e = ConfigurationHelper.getCalculatedElement(element,
getLayoutMgr().getElementRealizer());
if (isVisible(e)) {
b = createBookmark(this.monitor, e);
if (b == null) {
return b;
}
parent.addChild(b);
if (buildSubTree) {
if (e instanceof Artifact) {
buildContainedArtifactsSubTree((Artifact) e, b, true);
}
}
}
return b;
}
// /**
// * create the folder bookmark and it's children. generate the folder summary
// * page
// *
// * @param element
// * @param bm
// * @param nodeName
// * @param items
// */
//
// private Bookmark createFolderBookmark(MethodElement element, Bookmark bm,
// String nodeName, List items, boolean createChildren) {
// Bookmark b = null;
// if (items.size() > 0) {
// IElementLayout l = new SummaryPageLayout(getHtmlBuilder()
// .getLayoutManager(), element, nodeName, items);
// String url = l.getUrl();
// getHtmlBuilder().generateHtml(l);
// b = createBookmark(nodeName, EcoreUtil.generateUUID(), url,
// ICON_FOLDER, ICON_FOLDER, null);
// bm.addChild(b);
// if (createChildren) {
// buildItems(items, b);
// }
// }
//
// return b;
// }
Set<String> summaryPagesGenerated = new HashSet<String>();
private Bookmark createFolderBookmark(MethodElement element, Bookmark bm,
String prefixName, String nodeName, List items,
boolean createChildren) {
Bookmark b = null;
if (items.size() > 0) {
IElementLayout l = new SummaryPageLayout(getHtmlBuilder()
.getLayoutManager(), element, prefixName, nodeName, items);
String url = l.getUrl();
// don't regenerate the page
// 200619 - Summary page html was generated multiple times when publishing
if ( !summaryPagesGenerated.contains(url) ) {
getHtmlBuilder().generateHtml(l);
summaryPagesGenerated.add(url);
}
b = createBookmark(nodeName, EcoreUtil.generateUUID(), url,
ICON_FOLDER, ICON_FOLDER, null);
bm.addChild(b);
if (createChildren) {
buildItems(items, b);
}
}
return b;
}
private void buildPracticeSubgroupTree(Object providerParent,
Bookmark parent, PracticeSubgroupItemProvider provider) {
Collection children = provider.getChildren(null);
List items = children instanceof List ? (List) children
: new ArrayList(children);
if (items != null && items.size() > 0) {
Practice practice = provider.getPractice();
if (practice == null) {
return;
}
IElementLayout l = new SummaryPageLayout(getHtmlBuilder()
.getLayoutManager(), practice, provider.getPrefix(),
provider.getText(null), items, provider.getText(null));
String url = l.getUrl();
String imageString = this.getNodeIconName(provider);
Bookmark b = createBookmark(provider.getText(null), EcoreUtil
.generateUUID(), url, imageString, imageString, null);
parent.addChild(b);
this.iterate(provider, b);
if (!summaryPagesGenerated.contains(url)) {
getHtmlBuilder().generateHtml(l);
summaryPagesGenerated.add(url);
}
}
}
private Bookmark buildDisciplineSubTree(Discipline element, Bookmark parent) {
String url = ""; //$NON-NLS-1$
Bookmark b;
// need to calculate the realized value of the feature
List items_workflow = calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getDiscipline_ReferenceWorkflows());
// Tasks in published site under Disciplines are in
// random order
// use the adaptor factory to get the childrens
// List items_task = ConfigurationHelper.calc0nFeatureValue(element,
// UmaPackage.eINSTANCE.getDiscipline_Tasks(), config);
List items_task = new ArrayList();
List item_subDisciplies = new ArrayList();
ITreeItemContentProvider treeItemContentProvider = (ITreeItemContentProvider) adapterFactory
.adapt(element, ITreeItemContentProvider.class);
if (treeItemContentProvider != null) {
Collection items = treeItemContentProvider.getChildren(element);
for (Iterator it = items.iterator(); it.hasNext();) {
if (monitor.isCanceled()) {
return null;
}
// create bookmark
Object itorObj = it.next();
Object e = LibraryUtil.unwrap(itorObj);
if ((e instanceof Task)) {
MethodElement t = ConfigurationHelper.getCalculatedElement(
(MethodElement) e, getLayoutMgr()
.getElementRealizer());
if (t != null) {
items_task.add(t);
}
} else if (e instanceof Discipline) {
MethodElement d = ConfigurationHelper.getCalculatedElement(
(MethodElement) e, getLayoutMgr()
.getElementRealizer());
if (d != null) {
item_subDisciplies.add(d);
}
}
}
}
if (monitor.isCanceled()) {
return null;
}
// all guidances
List items_guidance = new ArrayList();
items_guidance.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Assets()));
items_guidance.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Checklists()));
items_guidance.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_ConceptsAndPapers()));
items_guidance.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Examples()));
items_guidance.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Guidelines()));
items_guidance.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_SupportingMaterials()));
if (!options.isPublishEmptyCategories()
&& items_workflow.size() + items_task.size()
+ items_guidance.size() + item_subDisciplies.size() == 0) {
// do nothing, don't show the folder
discardEmptyCategory(element, true);
return null;
}
if (monitor.isCanceled()) {
return null;
}
// create the item bookmark
// don't set to the parent yet. make sure it's not empty
// need to check the sub-disciplines
// 150984 - Publishing: Nested discipline is not display in the publish
// page
// Bookmark bm = createBookmark(element, parent);
Bookmark bm = createBookmark(this.monitor, element);
// sub-disciplines come first
if (item_subDisciplies.size() > 0) {
for (Iterator it = item_subDisciplies.iterator(); it.hasNext();) {
Discipline d = (Discipline) it.next();
buildDisciplineSubTree(d, bm);
}
}
if (options.isPublishLightWeightTree()) {
Collections.sort(items_workflow, nameComparator);
//Collections.sort(items_task, nameComparator);
Collections.sort(items_guidance, nameComparator);
buildItems(items_workflow, bm);
buildItems(items_task, bm);
buildItems(items_guidance, bm);
} else {
if (items_workflow.size() > 0) {
Bookmark wfFolder = createFolderBookmark(element, bm,
PREFIX_Reference_Workflows, NODE_Reference_Workflows,
items_workflow, false);
// Capability Patterns in treebrowser under
// disciplines-reference workflows cannot be expanded
for (Iterator it = items_workflow.iterator(); it.hasNext();) {
if (monitor.isCanceled()) {
return null;
}
// 179609 - Exception when assign activity as discipline's
// referenced workflow
// this is a model change, referenced workflow can be
// Activity,
// old model references Process
Activity act = (Activity) it.next();
Bookmark bmWorkflow = buildItem(act, wfFolder, false);
buildActivitySubTree(act, act, bmWorkflow);
}
}
if (monitor.isCanceled()) {
return null;
}
if (items_task.size() > 0) {
createFolderBookmark(element, bm, PREFIX_Tasks, NODE_Tasks,
items_task, true);
}
if (monitor.isCanceled()) {
return null;
}
if (items_guidance.size() > 0) {
createFolderBookmark(element, bm, PREFIX_Guidances,
NODE_Guidances, items_guidance, true);
}
}
if (options.isPublishEmptyCategories() || bm.getChildCount() > 0) {
parent.addChild(bm);
discardEmptyCategory(element, false);
} else {
discardEmptyCategory(element, true);
}
return bm;
}
private void buildActivitySubTree(Object obj, Activity element, Bookmark bm) {
if (monitor.isCanceled()) {
return;
}
List items = new ArrayList();
org.eclipse.epf.uma.Process proc = TngUtil.getOwningProcess(element);
ProcessElementItem procItem = new ProcessElementItem(obj, element,
element.getGuid());
ComposedAdapterFactory adapterFactory = super.getLayoutMgr()
.getWBSAdapterFactory();
Suppression sup = new Suppression(proc);
iterateActivity(procItem, bm, adapterFactory, sup);
}
private void buildToolSubTree(Tool element, Bookmark parent) {
if (monitor.isCanceled()) {
return;
}
List items = calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getTool_ToolMentors());
if (options.isPublishEmptyCategories() || items.size() > 0) {
Bookmark b = createBookmark(element, parent);
buildItems(items, b);
discardEmptyCategory(element, false);
} else {
discardEmptyCategory(element, true);
}
}
private void buildTaskSubTree(Task element, Bookmark bm) {
String url;
Bookmark b;
List allItems = new ArrayList();
// performing roles
List items = new ArrayList();
List rList = (List) calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getTask_PerformedBy());
if (rList != null) {
items.addAll(rList);
}
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getTask_AdditionallyPerformedBy()));
if (items.size() > 0) {
if (options.isPublishLightWeightTree()) {
Collections.sort(items, nameComparator);
allItems.addAll(items);
} else {
createFolderBookmark(element, bm, PREFIX_Performing_Roles,
NODE_Performing_Roles, items, true);
}
}
if (monitor.isCanceled()) {
return;
}
if (!options.isPublishLightWeightTree()) {
// input work products, need a summary page,
items = new ArrayList();
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getTask_MandatoryInput()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getTask_OptionalInput()));
if (items.size() > 0) {
createFolderBookmark(element, bm, PREFIX_Input_Work_Products,
NODE_Input_Work_Products, items, true);
}
if (monitor.isCanceled()) {
return;
}
}
// output work products, need a summary page, TODO
items = calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getTask_Output());
if (items.size() > 0) {
if (options.isPublishLightWeightTree()) {
Collections.sort(items, nameComparator);
allItems.addAll(items);
} else {
createFolderBookmark(element, bm, PREFIX_Output_Work_Products,
NODE_Output_Work_Products, items, true);
}
}
if (monitor.isCanceled()) {
return;
}
// all guidances
items.clear();
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Assets()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Checklists()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_ConceptsAndPapers()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Examples()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Guidelines()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_SupportingMaterials()));
// Object e = calc01FeatureValue(element, UmaPackage.eINSTANCE
// .getTask_Estimate());
// if (e != null) {
// items.add(e);
// }
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getTask_ToolMentors()));
if (items.size() > 0) {
if (options.isPublishLightWeightTree()) {
Collections.sort(items, nameComparator);
allItems.addAll(items);
} else {
createFolderBookmark(element, bm, PREFIX_Guidances,
NODE_Guidances, items, true);
}
}
if (options.isPublishLightWeightTree()) {
buildItems(allItems, bm);
}
}
private void buildRoleSubTree(Role element, Bookmark bm) {
String url;
Bookmark b;
if (monitor.isCanceled()) {
return;
}
List allItems = new ArrayList();
// tasks, // need a general overview page, TODO
// List items = AssociationHelper.getPrimaryTasks(element);
List items = calc0nFeatureValue(element,
AssociationHelper.Role_Primary_Tasks);
if (items.size() > 0) {
if (options.isPublishLightWeightTree()) {
Collections.sort(items, nameComparator);
allItems.addAll(items);
} else {
createFolderBookmark(element, bm, PREFIX_ResponsibleFor_Tasks,
NODE_ResponsibleFor_Tasks, items, true);
}
}
if (monitor.isCanceled()) {
return;
}
if (!options.isPublishLightWeightTree()) {
// secondary tasks
items = calc0nFeatureValue(element,
AssociationHelper.Role_Secondary_Tasks);
if (items.size() > 0) {
createFolderBookmark(element, bm, PREFIX_ParticipatesIn_Tasks,
NODE_ParticipatesIn_Tasks, items, true);
}
}
if (monitor.isCanceled()) {
return;
}
// responsible for work products,
items = calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getRole_ResponsibleFor());
if (items.size() > 0) {
if (options.isPublishLightWeightTree()) {
Collections.sort(items, nameComparator);
allItems.addAll(items);
} else {
b = createFolderBookmark(element, bm,
PREFIX_Work_Products_Created,
NODE_Work_Products_Created, items, false);
buildItems(items, b, true);
}
}
if (monitor.isCanceled()) {
return;
}
if (!options.isPublishLightWeightTree()) {
// modifies work products, need a summary page, TODO
items = calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getRole_Modifies());
if (items.size() > 0) {
b = createFolderBookmark(element, bm,
PREFIX_Work_Products_Modified,
NODE_Work_Products_Modified, items, false);
buildItems(items, b, true);
}
if (monitor.isCanceled()) {
return;
}
}
// all guidances
items.clear();
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Assets()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Checklists()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_ConceptsAndPapers()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Examples()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Guidelines()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_SupportingMaterials()));
if (items.size() > 0) {
if (options.isPublishLightWeightTree()) {
Collections.sort(items, nameComparator);
allItems.addAll(items);
} else {
createFolderBookmark(element, bm, PREFIX_Guidances, NODE_Guidances, items, true);
}
}
if (options.isPublishLightWeightTree()) {
// light weight tree, no sub folders
buildItems(allItems, bm);
}
}
private void buildWorkProductSubTree(WorkProduct element, Bookmark bm) {
List items;
String url = ""; //$NON-NLS-1$
// Bookmark b;
if (monitor.isCanceled()) {
return;
}
List allItems = new ArrayList();
// performing roles, 0.1 reference element will be realized in buildItem
// multiplicity change for opposite features
// Role r = AssociationHelper.getResponsibleRole(element);
items = calc0nFeatureValue(element,
AssociationHelper.WorkProduct_ResponsibleRoles);
if (items.size() > 0) {
if (options.isPublishLightWeightTree()) {
Collections.sort(items, nameComparator);
allItems.addAll(items);
} else {
createFolderBookmark(element, bm, PREFIX_Responsible_Role,
NODE_Responsible_Role, items, true);
}
}
if (monitor.isCanceled()) {
return;
}
// containing work products, need a summary page, TODO
if (element instanceof Artifact) {
if (!options.isPublishLightWeightTree()) {
WorkProduct wp = ((Artifact) element).getContainerArtifact();
// createBookmark(NODE_Containing_Work_Product,
// NODE_Containing_Work_Product, url, "", ""); //$NON-NLS-1$
// //$NON-NLS-2$
if (wp != null) {
items = new ArrayList();
items.add(wp);
createFolderBookmark(element, bm,
PREFIX_Containing_Work_Product,
NODE_Containing_Work_Product, items, true);
}
if (monitor.isCanceled()) {
return;
}
}
// contained work products, need a summary page, TODO
// items = ((Artifact)element).getContainedArtifacts();
items = calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getArtifact_ContainedArtifacts());
// make sure the contained elements does not contain the container,
// this is possible due to realization, say, the containing element
// contribute to the container
items.remove(element);
if (items.size() > 0) {
if (options.isPublishLightWeightTree()) {
Collections.sort(items, nameComparator);
allItems.addAll(items);
} else {
Bookmark b = createFolderBookmark(element, bm,
PREFIX_Contained_Work_Products,
NODE_Contained_Work_Products, items, false);
// for each contained work product, create the nested sub
// tree
buildItems(items, b, true);
}
}
}
if (monitor.isCanceled()) {
return;
}
if (!options.isPublishLightWeightTree()) {
// input to tasks
items = new ArrayList();
items.addAll(calc0nFeatureValue(element,
AssociationHelper.WorkProduct_MandatoryInputTo_Tasks));
items.addAll(calc0nFeatureValue(element,
AssociationHelper.WorkProduct_OptionalInputTo_Tasks));
if (items.size() > 0) {
createFolderBookmark(element, bm, PREFIX_InputTo_Task,
NODE_InputTo_Task, items, true);
}
if (monitor.isCanceled()) {
return;
}
// output from tasks
items = calc0nFeatureValue(element,
AssociationHelper.WorkProduct_OutputFrom_Tasks);
if (items.size() > 0) {
createFolderBookmark(element, bm, PREFIX_OutputOf_Task,
NODE_OutputOf_Task, items, true);
}
if (monitor.isCanceled()) {
return;
}
}
// all guidances
items = new ArrayList();
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Assets()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Checklists()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_ConceptsAndPapers()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Examples()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Guidelines()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_SupportingMaterials()));
// Object e = calc01FeatureValue(element, UmaPackage.eINSTANCE
// .getWorkProduct_Estimate());
// if (e != null) {
// items.add(e);
// }
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getWorkProduct_Reports()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getWorkProduct_Templates()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getWorkProduct_ToolMentors()));
if (items.size() > 0) {
if (options.isPublishLightWeightTree()) {
Collections.sort(items, nameComparator);
allItems.addAll(items);
} else {
createFolderBookmark(element, bm, PREFIX_Guidances,
NODE_Guidances, items, true);
}
}
if (options.isPublishLightWeightTree()) {
buildItems(allItems, bm);
}
}
private void buildContainedArtifactsSubTree(Artifact element, Bookmark bm,
boolean showGuidances) {
if (monitor.isCanceled()) {
return;
}
List items;
String url = ""; //$NON-NLS-1$
// contained work products, need a summary page, TODO
// items = ((Artifact)element).getContainedArtifacts();
items = calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getArtifact_ContainedArtifacts());
// make sure the contained elements does not contain the container,
// this is possible due to realization, say, the containing element
// contribute to the container
items.remove(element);
if (monitor.isCanceled()) {
return;
}
if (items.size() > 0) {
// Bookmark b = createFolderBookmark(element, bm,
// NODE_Contained_Work_Products, items, false);
// for each contained work product, create the nested sub tree
for (Iterator it = items.iterator(); it.hasNext();) {
if (monitor.isCanceled()) {
return;
}
Artifact e = (Artifact) it.next();
buildItem(e, bm, true);
}
}
if (!showGuidances) {
return;
}
if (monitor.isCanceled()) {
return;
}
// all guidances
items = new ArrayList();
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Assets()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Checklists()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_ConceptsAndPapers()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Examples()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_Guidelines()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getContentElement_SupportingMaterials()));
// Object e = calc01FeatureValue(element, UmaPackage.eINSTANCE
// .getWorkProduct_Estimate());
// if (e != null) {
// items.add(e);
// }
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getWorkProduct_Reports()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getWorkProduct_Templates()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getWorkProduct_ToolMentors()));
if (items.size() > 0) {
// createFolderBookmark(element, bm, NODE_Guidances, items, true);
buildItems(items, bm);
}
}
/**
* iterate the break down structure and build the xml document
*
* @param parentObj
* The object to iterate. It can be a breakdown element, or it's
* adaptor
* @param parentXml
* @param adapterFactory
*/
private void iterateActivity(ProcessElementItem parentItem,
Bookmark parentBm, ComposedAdapterFactory adapterFactory,
Suppression sup) {
if (monitor.isCanceled()) {
return;
}
ITreeItemContentProvider provider = null;
Object parentObj = parentItem.rawItem;
if (parentObj instanceof ITreeItemContentProvider) {
provider = (ITreeItemContentProvider) parentObj;
} else {
provider = (ITreeItemContentProvider) adapterFactory.adapt(
parentObj, ITreeItemContentProvider.class);
}
if (provider != null) {
// String displayName = ProcessUtil.getAttribute(parentObj,
// IBSItemProvider.COL_PRESENTATION_NAME, provider);
// parentXml.setAttribute("DisplayName", displayName);
Collection children = provider.getChildren(parentObj);
for (Iterator it = children.iterator(); it.hasNext();) {
if (monitor.isCanceled()) {
return;
}
Object rawitem = it.next();
if (sup.isSuppressed(rawitem)) {
continue;
}
MethodElement item = (MethodElement) LibraryUtil
.unwrap(rawitem);
if (!options.showDescriptorsInNavigationTree
&& (item instanceof Descriptor)) {
continue;
}
ProcessElementItem elementItem = new ProcessElementItem(
rawitem, item, parentItem);
Bookmark child = buildItem(elementItem.element, parentBm, false);
if (child != null) {
// set the query string
child.setQueryString(elementItem.getQueryString());
IBSItemProvider adapter = null;
if (rawitem instanceof IBSItemProvider) {
adapter = (IBSItemProvider) rawitem;
} else {
adapter = (IBSItemProvider) adapterFactory.adapt(item,
ITreeItemContentProvider.class);
;
}
String displayName = ProcessUtil.getAttribute(item,
IBSItemProvider.COL_PRESENTATION_NAME, adapter);
child.setPresentationName(displayName);
if (item instanceof Activity) {
iterateActivity(elementItem, child, adapterFactory, sup);
}
}
}
}
}
private void buildProcessSubTree(Object obj,
org.eclipse.epf.uma.Process element, Bookmark bm) {
if (monitor.isCanceled()) {
return;
}
List items = new ArrayList();
ProcessElementItem procItem = new ProcessElementItem(obj, element,
element.getGuid());
ComposedAdapterFactory adapterFactory = super.getLayoutMgr()
.getWBSAdapterFactory();
Suppression sup = new Suppression(element);
iterateActivity(procItem, bm, adapterFactory, sup);
String url;
Bookmark b;
if (monitor.isCanceled()) {
return;
}
// all guidances
items = new ArrayList();
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getBreakdownElement_Checklists()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getBreakdownElement_Concepts()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getBreakdownElement_Examples()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getBreakdownElement_Guidelines()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getBreakdownElement_ReusableAssets()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getActivity_Roadmaps()));
// need to include supporting materials as well
// fix bug: supporting material served as user defined diagram should not
// show up in the navigation tree of a published process.
org.eclipse.epf.diagram.model.util.DiagramInfo userDiagramInfo =
new org.eclipse.epf.diagram.model.util.DiagramInfo(element);
List v = calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getBreakdownElement_SupportingMaterials());
for ( Iterator it = v.iterator(); it.hasNext(); ) {
SupportingMaterial s = (SupportingMaterial)it.next();
if ( !userDiagramInfo.isDiagram( (SupportingMaterial)s ) ) {
items.add(s);
}
}
if (element instanceof DeliveryProcess) {
DeliveryProcess dp = (DeliveryProcess) element;
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getDeliveryProcess_CommunicationsMaterials()));
items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
.getDeliveryProcess_EducationMaterials()));
}
if (items.size() > 0) {
createFolderBookmark(element, bm, PREFIX_Guidances, NODE_Guidances,
items, true);
}
}
/**
* dispose the object
*/
public void dispose() {
super.dispose();
adapterFactory = null;
nameComparator = null;
bookmarks.clear();
elementUrls.clear();
summaryPagesGenerated.clear();
}
protected Set elementUrls = new HashSet();
protected void elementPublished(IElementLayout layout, String htmlfile) {
// only for process element for now
// may cover all method elements later
if (layout.getElement() instanceof ProcessElement) {
ElementUrl url = new ElementUrl(layout.getElement().getGuid(),
layout.getUrl(), layout.getDisplayName());
elementUrls.add(url);
}
}
private void saveElementUrls() {
// save published element urls
// need to escape the url and text since it will be assigned to a
// javascript variable as literal
XmlElement xml = new XmlElement("ElementUrls"); //$NON-NLS-1$
for (Iterator it = elementUrls.iterator(); it.hasNext();) {
ElementUrl url = (ElementUrl) it.next();
xml.newChild("elementUrl", url.guid) //$NON-NLS-1$
.setAttribute("text", StrUtil.escape(url.text)) //$NON-NLS-1$
.setAttribute("url", StrUtil.escape(url.url)); //$NON-NLS-1$
}
// StringBuffer buffer = new StringBuffer();
// buffer.append(XmlHelper.XML_HEADER).append(xml.toXml());
// File f = new File(getLayoutMgr().getPublishDir(), "ElementUrls.xml");
// //$NON-NLS-1$
// FileUtil.writeUTF8File(f.getAbsolutePath(), buffer.toString());
String html = PublishingUtil.getHtml(xml, "xsl/elementUrls.xsl"); //$NON-NLS-1$
File f = new File(getLayoutMgr().getPublishDir(),
PROCESS_LAYOUT_DATA_FILE); //$NON-NLS-1$
FileUtil.writeUTF8File(f.getAbsolutePath(), html, true);
}
/**
* data structure to define url of an element
*
* @author Jinhua Xi
*
*/
public class ElementUrl {
String guid;
String url;
String text;
/**
* constructor
*
* @param guid
* String the guid of the element
* @param url
* String the url of the element
* @param text
* String the text alone with the url
*/
public ElementUrl(String guid, String url, String text) {
this.guid = guid;
this.url = url;
this.text = text;
}
}
class EObjectComparator implements Comparator {
private EStructuralFeature pName = UmaPackage.eINSTANCE
.getMethodElement_PresentationName();
private EStructuralFeature name = UmaPackage.eINSTANCE
.getNamedElement_Name();
public EObjectComparator() {
}
public int compare(Object e1, Object e2) {
if (e1 instanceof EObject && e2 instanceof EObject) {
Object v1 = getValue(e1);
Object v2 = getValue(e2);
if (v1 == null && v2 == null) {
return e1.toString().compareTo(e2.toString());
} else if (v1 == null) {
return -1;
} else if (v2 == null) {
return 1;
} else {
return v1.toString().compareTo(v2.toString());
}
} else {
return e1.toString().compareTo(e2.toString());
}
}
private Object getValue(Object e) {
Object v = null;
try {
v = ((EObject) e).eGet(pName);
} catch (Exception ex) {
}
;
if (v == null || v.toString().length() == 0) {
try {
v = ((EObject) e).eGet(name);
} catch (Exception ex) {
}
;
}
return v;
}
}
}