как правилно да преместите един или повече пакети в друг пакет в java с помощта на код

Разработвам приложение [приложение за десктоп суинг], което изисква от мен да направя рефакторинг чрез код. [Знам, че интерфейсът и функцията вече са предоставени от IDE на eclipse но трябва да направя това чрез код

първата фаза на рефакторинг, която трябва да направя, е да преместя избрания пакет [опцията за избор се дава чрез квадратчета за отметка, които показват всички налични пакети в работното пространство, използвайки идеята за JDT. Използвах урок на това място: http://www.vogella.de/articles/EclipseJDT/article.html ]

След като избрах пакетите, които искам да преместя в друг пакет,

Използвах тази част от кода

233.   for (IPackageFragment mypackage : packages) {
234.                    if ((mypackage.getKind() == IPackageFragmentRoot.K_SOURCE) && (searchifSelected(mypackage.getElementName())==true) ){
235.                        IJavaElement container = newModule.getPrimaryElement();
236.                        mypackage.move(container, null, null, true, null);
                }
     }

searchifSelected(mypackage.getElementName())==true ми казва дали съм избрал този конкретен пакет да бъде преместен

IJavaElement container = newModule.getPrimaryElement(); е контейнерът [нов пакет], който ще съдържа избраните пакети

mypackage.move(container, null, null, true, null); доколкото прочетох, тази команда трябва да премести "mypackage" в "container" като "дете".

обаче се сблъсквам с този проблем:

 Java Model Exception: Java Model Status [Invalid destination: 'devFromSupplier [in src [in test]]']
at org.eclipse.jdt.internal.core.MultiOperation.processElements(MultiOperation.java:175)
at org.eclipse.jdt.internal.core.CopyResourceElementsOperation.processElements(CopyResourceElementsOperation.java:417)
at org.eclipse.jdt.internal.core.MultiOperation.executeOperation(MultiOperation.java:90)
at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:728)
at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1800)
at org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:793)
at org.eclipse.jdt.internal.core.JavaModel.runOperation(JavaModel.java:297)
at org.eclipse.jdt.internal.core.JavaModel.move(JavaModel.java:258)
at org.eclipse.jdt.internal.core.PackageFragment.move(PackageFragment.java:420)
at newmodulewizrd.ui.Integrate.printPackageInfos(Integrate.java:236)
at newmodulewizrd.ui.Integrate.printProjectInfo(Integrate.java:177)
at newmodulewizrd.ui.Integrate.getWorkSpace(Integrate.java:149)
at newmodulewizrd.ui.Integrate.moveToOneModule(Integrate.java:120)
at newmodulewizrd.ui.Integrate$1.actionPerformed(Integrate.java:79)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

което според мен означава, че давам грешни аргументи.

може ли някой да помогне какво трябва да направя по въпроса?


person user    schedule 29.11.2011    source източник
comment
можете ли да включите номерата на редовете към вашия кодов сегмент..   -  person rana    schedule 29.11.2011
comment
съжалявам, не разбрах мисълта ти?   -  person user    schedule 29.11.2011
comment
@ rana, добавих номера на редове   -  person user    schedule 29.11.2011
comment
@carl: споменах го по-рано, трябва да направя това чрез код, без да използвам функцията от IDE   -  person user    schedule 29.11.2011


Отговори (2)


Публикувах проблема във форума на eclipse [IDE, който използвам] и след това открих, че проблемът/бъгът с метода няма да работи в цикъла. Ще трябва изрично да извикате тази функция една по една. Подобен бъг е докладван и в тази връзка:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=240286 [w.r.t метод за изтриване]

person user    schedule 30.11.2011

За тези, които са изправени пред същия проблем, намерих друг начин да го направя, т.е. използвам метода за преименуване и го накарам да работи като функция за преместване. въпреки че може/може да не е най-добрият вариант.

замествам горния код с този код

     for (IPackageFragment mypackage : packages) {
                if ((mypackage.getKind() == IPackageFragmentRoot.K_SOURCE) && (searchifSelected(mypackage.getElementName())==true) ){
                    mypackage.rename(textfield.getText()+"."+mypackage.getElementName(), true, null);
                }
            }
person user    schedule 30.11.2011