| /******************************************************************************* |
| * <copyright> |
| * |
| * Copyright (c) 2005, 2010 SAP AG. |
| * 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: |
| * Stefan Dimov - initial API, implementation and documentation |
| * |
| * </copyright> |
| * |
| *******************************************************************************/ |
| package org.eclipse.jpt.jpadiagrameditor.ui.internal.feature; |
| |
| import java.text.MessageFormat; |
| import java.util.Iterator; |
| import java.util.Properties; |
| import java.util.Set; |
| |
| import org.eclipse.emf.transaction.RecordingCommand; |
| import org.eclipse.emf.transaction.TransactionalEditingDomain; |
| import org.eclipse.emf.transaction.util.TransactionUtil; |
| import org.eclipse.graphiti.features.IFeatureProvider; |
| import org.eclipse.graphiti.features.context.IDirectEditingContext; |
| import org.eclipse.graphiti.features.impl.AbstractDirectEditingFeature; |
| import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm; |
| import org.eclipse.graphiti.mm.algorithms.Text; |
| import org.eclipse.graphiti.mm.pictograms.ContainerShape; |
| import org.eclipse.graphiti.mm.pictograms.PictogramElement; |
| import org.eclipse.graphiti.mm.pictograms.Shape; |
| import org.eclipse.jdt.core.Signature; |
| import org.eclipse.jpt.jpa.core.context.java.JavaPersistentAttribute; |
| import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType; |
| import org.eclipse.jpt.jpa.core.context.persistence.ClassRef; |
| import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit; |
| import org.eclipse.jpt.jpadiagrameditor.ui.internal.i18n.JPAEditorMessages; |
| import org.eclipse.jpt.jpadiagrameditor.ui.internal.propertypage.JPADiagramPropertyPage; |
| import org.eclipse.jpt.jpadiagrameditor.ui.internal.provider.IJPAEditorFeatureProvider; |
| import org.eclipse.jpt.jpadiagrameditor.ui.internal.util.JPAEditorUtil; |
| import org.eclipse.jpt.jpadiagrameditor.ui.internal.util.JpaArtifactFactory; |
| |
| |
| |
| public class DirectEditJPAEntityFeature extends AbstractDirectEditingFeature { |
| |
| private static String allowed = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"; //$NON-NLS-1$ |
| |
| public DirectEditJPAEntityFeature(IFeatureProvider fp) { |
| super(fp); |
| } |
| |
| public int getEditingType() { |
| return TYPE_TEXT; |
| } |
| |
| @Override |
| public boolean canDirectEdit(IDirectEditingContext context) { |
| return true; |
| } |
| |
| public String getInitialValue(IDirectEditingContext context) { |
| Shape sh = (Shape)context.getPictogramElement(); |
| ContainerShape csh = sh.getContainer(); |
| JavaPersistentType jpt = (JavaPersistentType)getBusinessObjectForPictogramElement(csh); |
| return JPAEditorUtil.returnSimpleName(JpaArtifactFactory.instance().getEntityName(jpt)); |
| } |
| |
| @Override |
| public String checkValueValid(String value, IDirectEditingContext context) { |
| //CSN #1305664 2010 |
| PictogramElement pe = context.getPictogramElement(); |
| ContainerShape csh = ((Shape)pe).getContainer(); |
| JavaPersistentType jpt = (JavaPersistentType) getFeatureProvider().getBusinessObjectForPictogramElement(csh); |
| String packageName = Signature.getQualifier(jpt.getName()); |
| PersistenceUnit unit = jpt.getPersistenceUnit(); |
| |
| for(Iterator<ClassRef> classRefs = unit.classRefs(); classRefs.hasNext();){ |
| ClassRef classRef = classRefs.next(); |
| if(classRef.getClassName().equals(packageName + Signature.C_DOT + value) && !(JPAEditorUtil.getText(jpt).equals(value))){ |
| return MessageFormat.format(JPAEditorMessages.DirectEditJPAEntityFeature_duplicateEntityName, packageName+value); |
| |
| } |
| } |
| |
| if (value.length() < 1) |
| return JPAEditorMessages.DirectEditJPAEntityFeature_classNameMsg; |
| if (value.contains(" ")) //$NON-NLS-1$ |
| return JPAEditorMessages.DirectEditJPAEntityFeature_scpacesNotAllowedMsg; |
| if (value.contains("\n")) //$NON-NLS-1$ |
| return JPAEditorMessages.DirectEditJPAEntityFeature_lineBreaksNotAllowedMsg; |
| if(value.contains("{") || value.contains("}")) //$NON-NLS-1$ //$NON-NLS-2$ |
| return JPAEditorMessages.DirectEditJPAEntityFeature_bracesNotAllowedMsg; |
| for (int i = 0; i < value.length(); i++) { |
| if (allowed.indexOf(value.charAt(i)) < 0) |
| return MessageFormat.format(JPAEditorMessages.DirectEditJPAEntityFeature_invalidSymbolsMsg, value); |
| } |
| return null; |
| } |
| |
| public void setValue(final String value, IDirectEditingContext context) { |
| PictogramElement pe = context.getPictogramElement(); |
| ContainerShape csh = ((Shape)pe).getContainer(); |
| JavaPersistentType jpt = (JavaPersistentType)getBusinessObjectForPictogramElement(csh); |
| Properties props = JPADiagramPropertyPage.loadProperties(jpt.getJpaProject().getProject()); |
| |
| String specifiedEntityMappingName = JpaArtifactFactory.instance().getSpecifiedEntityName(jpt); |
| if(specifiedEntityMappingName == null){ |
| RenameEntityWithoutUIFeature ft = new RenameEntityWithoutUIFeature(getFeatureProvider(), value); |
| ft.execute(jpt); |
| return; |
| } else { |
| |
| JpaArtifactFactory.instance().renameEntity(jpt, value); |
| // Properties props = JPADiagramPropertyPage.loadProperties(jpt.getJpaProject().getProject()); |
| if (JPADiagramPropertyPage.doesDirecteEditingAffectClassNameByDefault(jpt.getJpaProject().getProject(), props)) { |
| RenameEntityWithoutUIFeature ft = new RenameEntityWithoutUIFeature(getFeatureProvider(), value); |
| ft.execute(jpt); |
| return; |
| } |
| } |
| |
| final GraphicsAlgorithm alg = pe.getGraphicsAlgorithm().getGraphicsAlgorithmChildren().get(0); |
| |
| TransactionalEditingDomain ted = TransactionUtil.getEditingDomain(alg); |
| ted.getCommandStack().execute(new RecordingCommand(ted) { |
| protected void doExecute() { |
| ((Text) alg).setValue(value); |
| } |
| }); |
| |
| Set<JavaPersistentAttribute> ats = JpaArtifactFactory.instance().getRelatedAttributes(jpt); |
| Iterator<JavaPersistentAttribute> it = ats.iterator(); |
| while (it.hasNext()) { |
| JavaPersistentAttribute at = it.next(); |
| PictogramElement pel = getFeatureProvider().getPictogramElementForBusinessObject(at); |
| String newAtName = JPAEditorUtil.decapitalizeFirstLetter(value); |
| if (JpaArtifactFactory.instance().isMethodAnnotated(at)) |
| newAtName = JPAEditorUtil.produceValidAttributeName(newAtName); |
| newAtName = JpaArtifactFactory.instance().renameAttribute(at, newAtName, jpt.getName(), getFeatureProvider()).getName(); |
| |
| final GraphicsAlgorithm algo = pel.getGraphicsAlgorithm().getGraphicsAlgorithmChildren().get(0); |
| final String attName = newAtName; |
| TransactionalEditingDomain tedit = TransactionUtil.getEditingDomain(algo); |
| tedit.getCommandStack().execute(new RecordingCommand(tedit) { |
| protected void doExecute() { |
| ((Text) algo).setValue(attName); |
| } |
| }); |
| } |
| } |
| |
| public IJPAEditorFeatureProvider getFeatureProvider() { |
| return (IJPAEditorFeatureProvider)super.getFeatureProvider(); |
| } |
| |
| } |