Java tutorial
/* * Copyright (C) 2017 CenturyLink, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.centurylink.mdw.plugin.designer.model; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Vector; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.graphics.Image; import com.centurylink.mdw.model.value.attribute.AttributeVO; import com.centurylink.mdw.model.value.attribute.RuleSetVO; import com.centurylink.mdw.model.value.process.PackageVO; import com.centurylink.mdw.model.value.user.UserRoleVO; import com.centurylink.mdw.model.value.user.UserActionVO.Entity; import com.centurylink.mdw.plugin.MdwPlugin; import com.centurylink.mdw.plugin.designer.DirtyStateListener; import com.centurylink.mdw.plugin.designer.model.ElementChangeEvent.ChangeType; import com.centurylink.mdw.plugin.project.model.WorkflowProject; public abstract class WorkflowElement implements IStructuredSelection, IAdaptable { public abstract String getTitle(); public abstract Long getId(); public abstract String getName(); public abstract String getIcon(); public abstract boolean isReadOnly(); public abstract boolean hasInstanceInfo(); public abstract Entity getActionEntity(); private WorkflowProject project; public WorkflowProject getProject() { return project; } public void setProject(WorkflowProject project) { this.project = project; } private WorkflowPackage workflowPackage; public WorkflowPackage getPackage() { if (workflowPackage == null) return project == null || project.isFilePersist() ? null : project.getDefaultPackage(); return workflowPackage; } public void setPackage(WorkflowPackage workflowPackage) { this.workflowPackage = workflowPackage; } public boolean isInDefaultPackage() { return getPackage() == null || getPackage().isDefaultPackage(); } public String getLabel() { return getName(); // override to include version if applicable } public String getHexId() { return Long.toHexString(getId()); } public String getProjectPrefix() { String prefix = ""; if (getProject() != null) prefix += getProject().getName() + ": "; return prefix; } public String getPath() { String path = getProjectPrefix(); if (getProject() != null && !isInDefaultPackage()) path += getPackage().getName() + "/"; return path; } public String getLabelWithPackage() { if (isInDefaultPackage()) return getLabel(); else return getPackage().getName() + "/" + getLabel(); } public String getFullPathLabel() { return getPath() + getLabel(); } private Map<String, Image> icons = new HashMap<String, Image>(); public Map<String, Image> getIcons() { return icons; } public Image getIconImage() { return getIconImage(getIcon()); } public Image getIconImage(String icon) { if (icons.get(icon) == null) { ImageDescriptor imageDescriptor = MdwPlugin.getImageDescriptor("icons/" + icon); Image iconImage = imageDescriptor.createImage(); icons.put(icon, iconImage); } return icons.get(icon); } public Image getPackageIconImage() { if (getPackage() == null) return getIconImage("package.gif"); else return getPackage().getIconImage(); } public String getPackageLabel() { if (getPackage() == null) return PackageVO.DEFAULT_PACKAGE_NAME; else return getPackage().getName() + " " + getPackage().getVersionLabel(); } // any element may be contained in a folder private Folder folder; public Folder getArchivedFolder() { return folder; } public void setArchivedFolder(Folder f) { this.folder = f; } public boolean isEmpty() { return false; } public boolean isArchived() { return false; } public boolean isHomogeneous(WorkflowElement other) { if (other == null || !other.getClass().getName().equals(this.getClass().getName())) return false; return true; } public Object getFirstElement() { return this; } public List<AttributeVO> getAttributes() { return null; // currently overridden by Activity, ActivityImpl, // Transition, WorkflowProcess and EmbeddedSubProcess } /** * Gets the specified attribute * * @param attrName * @return the string value, null if not found */ public String getAttribute(String attrName) { if (getAttributes() != null) { for (AttributeVO attribute : getAttributes()) { if (attribute.getAttributeName().equals(attrName)) return attribute.getAttributeValue(); } } return null; // not found } public void setAttribute(String name, String value) { if (!(this instanceof AttributeHolder)) throw new UnsupportedOperationException( "WorkflowElement does not implement AttributeHolder: " + this.getClass().getName()); ((AttributeHolder) this).setAttribute(name, value); } public String getVersionLabel() { return null; // overridden by versionable elements } @SuppressWarnings("rawtypes") public Iterator iterator() { return new Iterator() { boolean retrieved = false; public boolean hasNext() { return !retrieved; } public Object next() { retrieved = true; return WorkflowElement.this; } public void remove() { } }; } public int size() { return 1; } public Object[] toArray() { Object[] ret = new Object[1]; ret[0] = this; return ret; } @SuppressWarnings({ "rawtypes", "unchecked" }) public List toList() { List list = new ArrayList(); list.add(this); return list; } private List<DirtyStateListener> dirtyStateListeners = new Vector<DirtyStateListener>(); public List<DirtyStateListener> getDirtyStateListeners() { return dirtyStateListeners; } public void addDirtyStateListener(DirtyStateListener listener) { dirtyStateListeners.add(listener); } public void removeDirtyStateListener(DirtyStateListener listener) { dirtyStateListeners.remove(listener); } public void fireDirtyStateChanged(boolean dirty) { for (DirtyStateListener listener : dirtyStateListeners) listener.dirtyStateChanged(dirty); } private List<ElementChangeListener> elementChangeListeners = new Vector<ElementChangeListener>(); public List<ElementChangeListener> getElementChangeListeners() { return elementChangeListeners; } public void addElementChangeListener(ElementChangeListener listener) { elementChangeListeners.add(listener); } public void removeElementChangeListener(ElementChangeListener listener) { elementChangeListeners.remove(listener); } public void fireElementChangeEvent(ChangeType changeType, Object newValue) { fireElementChangeEvent(this, changeType, newValue); } public void fireElementChangeEvent(WorkflowElement workflowElement, ChangeType changeType, Object newValue) { for (ElementChangeListener listener : getElementChangeListeners()) { ElementChangeEvent ece = new ElementChangeEvent(changeType, workflowElement); ece.setNewValue(newValue); listener.elementChanged(ece); } } public boolean equals(Object o) { if (!(o instanceof WorkflowElement) || o == null) return false; WorkflowElement other = (WorkflowElement) o; if (this.getProject() == null || !this.getProject().equals(other.getProject())) return false; if (!this.getClass().equals(other.getClass())) return false; if (this.getId() == null) return other.getId() == null; return this.getId().equals(other.getId()); } @SuppressWarnings({ "rawtypes", "unchecked" }) public Object getAdapter(Class adapter) { if (adapter.equals(IProject.class) && getProject() != null) return getProject().getSourceProject(); else return null; } protected Long convertToLong(String string) { if (string == null) return null; String converted = ""; for (int i = 0; i < string.length() && converted.length() < 16; i++) { converted += (int) string.charAt(i); } return new Long(converted); } public static Map<String, String> getArtifactFileExtensions() { return RuleSetVO.getLanguageToExtension(); } private static List<String> resourceTypes; public static List<String> getResourceTypes() { if (resourceTypes == null) { resourceTypes = new Vector<String>(); for (String type : getArtifactFileExtensions().keySet()) { boolean alreadyPresent = false; for (String resourceType : resourceTypes) { if (resourceType.equalsIgnoreCase(type)) { alreadyPresent = true; break; } } if (!alreadyPresent) resourceTypes.add(type); } Collections.sort(resourceTypes); } return resourceTypes; } public void dispose() { for (Image iconImage : icons.values()) iconImage.dispose(); } /** * Only relevant for file-based asset persistence. */ private IResource resource; public IResource getResource() { return resource; } public void setResource(IResource resource) { this.resource = resource; } /** * Convenience method for checking package level auth for an asset. */ public boolean isUserAuthorized(String role) { if (getProject().isFilePersist() && UserRoleVO.ASSET_DESIGN.equals(role)) { if (getProject().isRemote()) { return false; // only unlocked remote projects can be edited } else { return true; } } return getPackage() == null ? false : getPackage().isUserAuthorized(role); } /** * Override for elements related to a process. */ public Long getProcessId() { return null; } /** * Override for elements that support override attributes. */ public boolean overrideAttributesApplied() { return false; } private List<String> dirtyOverrideAttrPrefixes; public boolean isOverrideAttributeDirty(String prefix) { if (prefix == null || dirtyOverrideAttrPrefixes == null) return false; else return dirtyOverrideAttrPrefixes.contains(prefix); } public void setOverrideAttributeDirty(String prefix, boolean dirty) { if (prefix == null) return; if (dirty) { if (dirtyOverrideAttrPrefixes == null) dirtyOverrideAttrPrefixes = new ArrayList<String>(); if (!dirtyOverrideAttrPrefixes.contains(prefix)) dirtyOverrideAttrPrefixes.add(prefix); } else { if (dirtyOverrideAttrPrefixes != null) dirtyOverrideAttrPrefixes.remove(prefix); } } public boolean isAnyOverrideAttributeDirty() { return dirtyOverrideAttrPrefixes != null && !dirtyOverrideAttrPrefixes.isEmpty(); } public void clearOverrideAttributesDirty() { dirtyOverrideAttrPrefixes = null; } /** * Offline refresh */ protected void scheduleRefresh(final IResource resource) { WorkspaceJob job = new WorkspaceJob("Refreshing " + resource.getName()) { @Override public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { resource.refreshLocal(IResource.DEPTH_INFINITE, monitor); return Status.OK_STATUS; } }; job.setRule(resource.getProject()); job.schedule(); } }