| /******************************************************************************* |
| * Copyright (c) 2010-2014 SAP AG 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: |
| * SAP AG - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.skalli.model; |
| |
| import java.util.Arrays; |
| import java.util.Collection; |
| import java.util.Comparator; |
| import java.util.List; |
| import java.util.SortedSet; |
| import java.util.TreeSet; |
| |
| import org.apache.commons.lang.CharUtils; |
| import org.apache.commons.lang.StringUtils; |
| |
| @Historized |
| public class Project extends ExtensibleEntityBase { |
| |
| public static final String MODEL_VERSION = "1.0"; //$NON-NLS-1$ |
| public static final String NAMESPACE = "http://www.eclipse.org/skalli/2010/Model"; //$NON-NLS-1$ |
| |
| @PropertyName(position = 0) |
| public static final String PROPERTY_PROJECTID = "projectId"; //$NON-NLS-1$ |
| |
| @PropertyName(position = 1) |
| public static final String PROPERTY_NAME = "name"; //$NON-NLS-1$ |
| |
| @PropertyName(position = 2) |
| public static final String PROPERTY_SHORT_NAME = "shortName"; //$NON-NLS-1$ |
| |
| @PropertyName(position = 3) |
| public static final String PROPERTY_DESCRIPTION_FORMAT = "descriptionFormat"; //$NON-NLS-1$ |
| |
| @PropertyName(position = 4) |
| public static final String PROPERTY_DESCRIPTION = "description"; //$NON-NLS-1$ |
| |
| @PropertyName(position = 5) |
| public static final String PROPERTY_TEMPLATEID = "projectTemplateId"; //$NON-NLS-1$ |
| |
| @Derived |
| @PropertyName(position = 6) |
| public static final String PROPERTY_PARENT_PROJECT = "parentProject"; //$NON-NLS-1$ |
| |
| @PropertyName |
| public static final String PROPERTY_LOGO_URL = "logoUrl"; //$NON-NLS-1$ |
| |
| @PropertyName |
| public static final String PROPERTY_PHASE = "phase"; //$NON-NLS-1$ |
| |
| @PropertyName |
| public static final String PROPERTY_REGISTERED = "registered"; //$NON-NLS-1$ |
| |
| private static final String DEFAULT_TEMPLATE_ID = "default"; //$NON-NLS-1$ |
| |
| public static final String DEFAULT_FORMAT = "text"; //$NON-NLS-1$ |
| public static final String FORMAT_HTML = "html"; //$NON-NLS-1$ |
| public static final List<String> TEXT_FORMATS = Arrays.asList(DEFAULT_FORMAT, FORMAT_HTML); |
| |
| private static final String INITIAL_PHASE = "initial"; //$NON-NLS-1$ |
| |
| private String projectId = ""; //$NON-NLS-1$ |
| private String projectTemplateId = DEFAULT_TEMPLATE_ID; |
| private String name = ""; //$NON-NLS-1$ |
| private String shortName = ""; //$NON-NLS-1$ |
| private String descriptionFormat = TEXT_FORMATS.get(0); |
| private String description = ""; //$NON-NLS-1$ |
| private String logoUrl = ""; //$NON-NLS-1$ |
| private String phase = INITIAL_PHASE; |
| private long registered = 0; |
| |
| // do not remove: required by xstream |
| public Project() { |
| } |
| |
| public Project(String projectTemplateId) { |
| this.projectTemplateId = projectTemplateId; |
| } |
| |
| public Project(String projectid, String description, String name) { |
| this.name = name; |
| this.description = description; |
| this.projectId = projectid; |
| } |
| |
| public String getDescriptionFormat() { |
| if (StringUtils.isBlank(descriptionFormat)) { |
| descriptionFormat = DEFAULT_FORMAT; |
| } |
| return descriptionFormat; |
| } |
| |
| public void setDescriptionFormat(String descriptionFormat) { |
| this.descriptionFormat = descriptionFormat; |
| } |
| |
| public String getDescription() { |
| return description; |
| } |
| |
| public void setDescription(String description) { |
| this.description = description; |
| } |
| |
| public String getName() { |
| return name; |
| } |
| |
| public void setName(String name) { |
| this.name = name; |
| } |
| |
| public String getShortName() { |
| return shortName; |
| } |
| |
| public void setShortName(String shortName) { |
| this.shortName = shortName; |
| } |
| |
| /** |
| * Returns the short name if it exists or constructs one from the project name otherwise. |
| * |
| * <p> |
| * The constructed name is guaranteed to contain only alpha-numeric letters and to be 2 to 10 characters long. |
| * It will consist of the first letters of each word, if the project name includes multiple words. |
| * Otherwise the project name shortened to max. 10 characters will be returned. |
| * </p> |
| * |
| * @return |
| */ |
| public String getOrConstructShortName() { |
| if (!StringUtils.isBlank(shortName)) { |
| return shortName; |
| } else { |
| if (name.contains(" ")) { //$NON-NLS-1$ |
| // use first characters of each word, if they are alpha-numeric and the resulting length exceeds 1 char. |
| StringBuilder retAbbrev = new StringBuilder(); |
| for (String n : name.split(" ")) { //$NON-NLS-1$ |
| if (n.length() > 0) { |
| char ch = n.charAt(0); |
| if (CharUtils.isAsciiAlphanumeric(ch) && retAbbrev.length() < 10) { |
| retAbbrev.append(ch); |
| } |
| } |
| } |
| // if the first-char abbreviation is long enough, use it |
| if (retAbbrev.length() > 1) { |
| return retAbbrev.toString(); |
| } |
| } |
| |
| // Otherwise use the first 10 alpha-numeric characters of the project name, if they exceed 1 char. |
| StringBuilder retShortenedName = new StringBuilder(); |
| for (int i = 0; i < name.length() && retShortenedName.length() < 10; i++) { |
| char ch = name.charAt(i); |
| if (CharUtils.isAsciiAlphanumeric(ch)) { |
| retShortenedName.append(ch); |
| } |
| } |
| if (retShortenedName.length() > 1) { |
| return retShortenedName.toString(); |
| } |
| |
| // If still no valid short name was found, then return the last 10 alpha-numeric characters of the project id |
| StringBuilder retProjectId = new StringBuilder(); |
| for (int i = projectId.length() - 1; i >= 0 && retProjectId.length() < 10; i--) { |
| char ch = projectId.charAt(i); |
| if (CharUtils.isAsciiAlphanumeric(ch)) { |
| retProjectId.append(ch); |
| } |
| } |
| return retProjectId.reverse().toString(); |
| } |
| } |
| |
| public String getProjectId() { |
| return projectId; |
| } |
| |
| public void setProjectId(String projectid) { |
| this.projectId = projectid; |
| } |
| |
| public String getLogoUrl() { |
| return logoUrl; |
| } |
| |
| public void setLogoUrl(String logoUrl) { |
| this.logoUrl = logoUrl; |
| } |
| |
| public String getProjectTemplateId() { |
| if (StringUtils.isBlank(projectTemplateId)) { |
| projectTemplateId = DEFAULT_TEMPLATE_ID; |
| } |
| return projectTemplateId; |
| } |
| |
| public void setProjectTemplateId(String projectTemplateId) { |
| if (StringUtils.isBlank(projectTemplateId)) { |
| projectTemplateId = DEFAULT_TEMPLATE_ID; |
| } |
| this.projectTemplateId = projectTemplateId; |
| } |
| |
| public long getRegistered() { |
| return registered; |
| } |
| |
| public void setRegistered(long registered) { |
| if (registered <= 0) { |
| registered = System.currentTimeMillis(); |
| } |
| this.registered = registered; |
| } |
| |
| public String getPhase() { |
| if (StringUtils.isBlank(phase)) { |
| phase = INITIAL_PHASE; |
| } |
| return phase; |
| } |
| |
| public void setPhase(String phase) { |
| if (StringUtils.isBlank(phase)) { |
| phase = INITIAL_PHASE; |
| } |
| this.phase = phase; |
| } |
| |
| /** |
| * Returns the parent project of this project. |
| * |
| * @return the parent project, or <code>null</code> if this |
| * project has no parent. |
| * |
| * @throws ClassCastException if the parent entity is not |
| * assignable to the type <code>Project</code>. |
| */ |
| public Project getParentProject() { |
| return Project.class.cast(getParentEntity()); |
| } |
| |
| /** |
| * Returns the subprojects of this project sorted by their |
| * {@link #getProjectId() symbolic names}. |
| * |
| * @return the subprojects of this project, or an empty set if this |
| * project has no subprojects. |
| */ |
| public SortedSet<Project> getSubProjects() { |
| return addSubProjects(new TreeSet<Project>(new ByProjectIdComparator())); |
| } |
| |
| /** |
| * Returns the subprojects of this project sorted with the |
| * given comparator. If no compartor is specified the result is |
| * the same as for {@link #getSubProjects()}. |
| * |
| * @param c the comparator to use fir sorting of the result. |
| * @return the subprojects of this project, or an empty set if this |
| * project has no subprojects. |
| */ |
| public SortedSet<Project> getSubProjects(Comparator<Project> c) { |
| if (c == null) { |
| return getSubProjects(); |
| } |
| return addSubProjects(new TreeSet<Project>(c)); |
| } |
| |
| private <T extends Collection<Project>> T addSubProjects(T c) { |
| EntityBase next = getFirstChild(); |
| while (next != null) { |
| c.add((Project)next); |
| next = next.getNextSibling(); |
| } |
| return c; |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| if (StringUtils.isNotBlank(projectId)) { |
| sb.append(projectId); |
| } |
| if (StringUtils.isNotBlank(name)) { |
| if (sb.length() > 0) { |
| sb.append('/'); |
| } |
| sb.append(name); |
| } |
| String uuid = super.toString(); |
| if (sb.length() > 0) { |
| if (sb.length() > 0) { |
| sb.append('/'); |
| } |
| sb.append(uuid); |
| } |
| return sb.toString(); |
| } |
| } |