/* $Id: AssociationRoleNotationUml.java 17828 2010-01-12 18:55:12Z linus $
*****************************************************************************
* Copyright (c) 2009 Contributors - see below
* 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:
* mvw
*****************************************************************************
*
* Some portions of this file was previously release using the BSD License:
*/
// Copyright (c) 2006-2009 The Regents of the University of California. All
// Rights Reserved. Permission to use, copy, modify, and distribute this
// software and its documentation without fee, and without a written
// agreement is hereby granted, provided that the above copyright notice
// and this paragraph appear in all copies. This software program and
// documentation are copyrighted by The Regents of the University of
// California. The software program and documentation are supplied "AS
// IS", without any accompanying services from The Regents. The Regents
// does not warrant that the operation of the program will be
// uninterrupted or error-free. The end-user understands that the program
// was developed for research purposes and is advised not to rely
// exclusively on the program for any reason. IN NO EVENT SHALL THE
// UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
// SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
// ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
// THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
// SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
// PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
// CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
// UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
package org.argouml.notation.providers.uml;
import java.text.ParseException;
import java.util.Collection;
import java.util.Iterator;
import org.argouml.application.events.ArgoEventPump;
import org.argouml.application.events.ArgoEventTypes;
import org.argouml.application.events.ArgoHelpEvent;
import org.argouml.i18n.Translator;
import org.argouml.model.Model;
import org.argouml.notation.NotationSettings;
import org.argouml.notation.providers.AssociationRoleNotation;
import org.argouml.util.MyTokenizer;
/**
* The UML notation for an AssociationRole.
*
* @author michiel
*/
public class AssociationRoleNotationUml extends AssociationRoleNotation {
/**
* The constructor.
*
* @param role the given association-role
*/
public AssociationRoleNotationUml(Object role) {
super(role);
}
/*
* @see org.argouml.notation.providers.NotationProvider#getParsingHelp()
*/
public String getParsingHelp() {
return "parsing.help.fig-association-role";
}
/*
* @see org.argouml.notation.providers.NotationProvider#parse(java.lang.Object, java.lang.String)
*/
public void parse(Object modelElement, String text) {
try {
parseRole(modelElement, text);
} catch (ParseException pe) {
String msg = "statusmsg.bar.error.parsing.association-role";
Object[] args = {
pe.getLocalizedMessage(),
Integer.valueOf(pe.getErrorOffset()),
};
ArgoEventPump.fireEvent(new ArgoHelpEvent(
ArgoEventTypes.HELP_CHANGED, this,
Translator.messageFormat(msg, args)));
}
}
/**
* Parse the string that represents an AssociationRole: <pre>
* ["/" name] [":" name_of_the_base_association]
* </pre>
*
* @param role The AssociationRole <em>text</em> describes.
* @param text A String on the above format.
* @throws ParseException
* when it detects an error in the role string. See also
* ParseError.getErrorOffset().
*/
protected void parseRole(Object role, String text)
throws ParseException {
String token;
boolean hasColon = false;
boolean hasSlash = false;
String rolestr = null;
String basestr = null;
MyTokenizer st = new MyTokenizer(text, " ,\t,/,:");
while (st.hasMoreTokens()) {
token = st.nextToken();
if (" ".equals(token) || "\t".equals(token)) {
/* Do nothing. */
} else if ("/".equals(token)) {
hasSlash = true;
hasColon = false;
} else if (":".equals(token)) {
hasColon = true;
hasSlash = false;
} else if (hasColon) {
if (basestr != null) {
String msg =
"parsing.error.association-role.association-extra-text";
throw new ParseException(Translator.localize(msg), st
.getTokenIndex());
}
basestr = token;
} else if (hasSlash) {
if (rolestr != null) {
String msg =
"parsing.error.association-role.association-extra-text";
throw new ParseException(Translator.localize(msg), st
.getTokenIndex());
}
rolestr = token;
} else {
String msg =
"parsing.error.association-role.association-extra-text";
throw new ParseException(Translator.localize(msg),
st.getTokenIndex());
}
}
if (basestr == null) {
/* If no base was typed, then only set the name: */
if (rolestr != null) {
Model.getCoreHelper().setName(role, rolestr.trim());
}
return;
}
/* If the base was not changed, then only set the name: */
Object currentBase = Model.getFacade().getBase(role);
if (currentBase != null) {
String currentBaseStr = Model.getFacade().getName(currentBase);
if (currentBaseStr == null) {
/* TODO: Is this needed? */
currentBaseStr = "";
}
if (currentBaseStr.equals(basestr)) {
if (rolestr != null) {
Model.getCoreHelper().setName(role, rolestr.trim());
}
return;
}
}
Collection c =
Model.getCollaborationsHelper().getAllPossibleBases(role);
Iterator i = c.iterator();
while (i.hasNext()) {
Object candidate = i.next();
if (basestr.equals(Model.getFacade().getName(candidate))) {
if (Model.getFacade().getBase(role) != candidate) {
/* If the base is already set to this assoc,
* then do not set it again.
* This check is needed, otherwise the setbase()
* below gives an exception.*/
Model.getCollaborationsHelper().setBase(role, candidate);
}
/* Only set the name if the base was found: */
if (rolestr != null) {
Model.getCoreHelper().setName(role, rolestr.trim());
}
return;
}
}
String msg = "parsing.error.association-role.base-not-found";
throw new ParseException(Translator.localize(msg), 0);
}
private String toString(final Object modelElement) {
//get the associationRole name
String name = Model.getFacade().getName(modelElement);
if (name == null) {
name = "";
}
if (name.length() > 0) {
name = "/" + name;
}
//get the base association name
Object assoc = Model.getFacade().getBase(modelElement);
if (assoc != null) {
String baseName = Model.getFacade().getName(assoc);
if (baseName != null && baseName.length() > 0) {
name = name + ":" + baseName;
}
}
return name;
}
/*
* Generate the name of an association role of the form:
* ["/" name] [":" name_of_the_base_association]
* <p>
* Remark:
* So, if both names are empty, then nothing is shown!
* See issue 2712.
*/
@Override
public String toString(final Object modelElement,
final NotationSettings settings) {
return toString(modelElement);
}
}