# Frage zu IEditorInput



## Gast2 (27. Mai 2010)

Hallo zusammen,

ich möchte einen Editor nur öffnen wenn ein Editor mit dieser Id noch nicht offen ist. Wie kann ich sowas machen?
Wenn ich sowas hier mache kann ich nur einen Editor öffnen, auch wenn die Ids unterschiedlich sind.


```
public class TeamEditorSite implements IEditorInput{

	private Bean team;
		
	public void setTeam(TeamObjectModel team) {
		this.team = team;
	}

	@Override
	public boolean exists() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public ImageDescriptor getImageDescriptor() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getName() {
		return team == null ? "": team.getPlayername();
	}

	@Override
	public IPersistableElement getPersistable() {
		return null;
	}

	@Override
	public String getToolTipText() {
		return getName();
	}

	@Override
	public Object getAdapter(Class adapter) {
		return Platform.getAdapterManager().getAdapter(this, adapter);
	}
	
    public int hashCode() {
        return team.getId();
    }

    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null || getClass() != obj.getClass())
            return false;
        return team.equals(((TeamEditorSite) obj).team.getId());
    }
}
```


----------



## maki (27. Mai 2010)

Wo wird dein Editor denn geöffnet? 
In einem handler?


----------



## Gast2 (27. Mai 2010)

Ja in einem Handler

```
public class CreateTeamEditor extends AbstractHandler{

	@Override
	public Object execute(ExecutionEvent event) throws ExecutionException {	
		try {
			HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().openEditor(new TeamEditorSite(), TeamEditor.ID);
		} catch (PartInitException e) {
			e.printStackTrace();
		}
		return null;
	}

}
```


----------



## maki (27. Mai 2010)

Entweder ich habe dich falsch verstanden, oder du benutzt den Begriff "id" falsch.
Die "id" ist das, was du in der plugin.xml angibst.
Nun, wenn du jedesmal eine neue TeamEditorSite übergibst, kann die openEditor Methode nur feststellen, dass es keinen geöffneten Editor gibt der bereits diesen IEditorInput (==) geöffnet hat.

Oder willst nur einen speziellen Editor nur ein einziges mal (Singleton) erlauben?


----------



## Gast2 (27. Mai 2010)

maki hat gesagt.:


> Entweder ich habe dich falsch verstanden, oder du benutzt den Begriff "id" falsch.
> Die "id" ist das, was du in der plugin.xml angibst.
> Nun, wenn du jedesmal eine neue TeamEditorSite übergibst, kann die openEditor Methode nur feststellen, dass es keinen geöffneten Editor gibt der bereits diesen IEditorInput (==) geöffnet hat.
> 
> Oder willst nur einen speziellen Editor nur ein einziges mal (Singleton) erlauben?



Ach verdammt sind ja 2 ids, ich meinte nicht die EditorID...

Ich hab zB ein Datenbank Objekt mit einer eindeutigen ID.
Jetzt will ich nicht dass man den Editor 2 mal mit der gleichen ID öffnen kann.
Also das heißt der Editor kann öfters offen sein wenn die DB Id unterschiedlich ist.

Beispiel:

```
public class Tier implements...
{

  public Integer getId(){
     return id;
  }

}
```

Man in dem Dialog mehrer Tiere erfassen/ändern usw., aber es darf nicht 2 mal der Editor Giraffe mit der id 2 offen sein.

Hoffe verständlicher ^^


----------



## maki (27. Mai 2010)

Ach so... jetzt ist der Groschen gefallen 


```
team.equals(((TeamEditorSite) obj).team.getId());
```
Du vergleichst team mit einem Integer


----------



## Gast2 (27. Mai 2010)

maki hat gesagt.:


> Ach so... jetzt ist der Groschen gefallen
> 
> 
> ```
> ...



wuäh das ist ausversehen da reingekommen. habs auch schon mit getId() versucht ändert nichts daran, aber ich teste es nochmal ^^...


----------



## maki (27. Mai 2010)

Verwendest du Spring(DM), Hibernate sonst etwas was einen dyn. Proxy erzeugen würde und diesen Vergleich fehlschlagen lassen würde:

```
getClass() != obj.getClass()
```
Ansosnten mal im Debugger gucken was equals so liefert.


----------



## Gast2 (27. Mai 2010)

maki hat gesagt.:


> Verwendest du Spring(DM), Hibernate sonst etwas was einen dyn. Proxy erzeugen würde und diesen Vergleich fehlschlagen lassen würde:
> 
> ```
> getClass() != obj.getClass()
> ...



Ja muss ich mal machen. Ich wollte mir mal kurz das obj ausgeben lassen, das hat aber irgendwie gar nicht geklappt. 
Nee habs eigentlich mal ganz normal versucht ohne irgendwelche Persistenten Objekte und auch ohne Spring(DM)


----------



## Gast2 (28. Mai 2010)

Okay habs jetzt mal zu probiert

```
@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		TeamEditorInput other = (TeamEditorInput) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}
```

Das klappt =)...


----------



## maki (28. Mai 2010)

Nebenbei bemerkt, es ist nur in ausnahmefällen ok equals auf der DB id (technischer schlüssel) basieren zu lassen, meistens ist es nicht was man möchte.
Collections und Maps reagieren nicht so gut im allgemeinen wenn man zB. versucht 2 transiente Objekte ohne ID abzulegen, zu vergleichen, etc. pp.


----------



## Gast2 (28. Mai 2010)

Har grad ga rnichts mit DB zu tun. Ich hatte einfach ein Objekt mit einer eindeutigen ID und ich wollte dass es dafür keine 2 Editoren gibt zum bearbeiten. Sonst muss ich ja immer alle offenen Editoren miteinander synchronisieren. Weißt wie ich mein?


----------



## maki (29. Mai 2010)

Ok, jetzt hab ich verstanden


----------



## Gast2 (29. Mai 2010)

maki hat gesagt.:


> Ok, jetzt hab ich verstanden



haha um 3.49 uhr beantwortest du fragen...respekt!!! 

Aber irgendwie weiß ich noch nicht so recht, wo ich mein neues Objekt erzeugen soll? Also wenn ein neuer Editor aufgeht gibts es auch ein neues Objet, darum hab ich mit Spring(DM) und @Autowired im Editor selber drin, damit jedes wenn ein neuer Editor aufgeht ein neues Objekt erstellt wird. Aber irgendwie ist das mit der Id dann dumm, weil die bekomm ich ja eigentlich aus dem Objekt... Weißt du vielleicht wie man sowas am saubersten löst?


----------



## maki (29. Mai 2010)

Bin mir nicht sicher ob ich dich richtig verstehe 

Prinzipiell ist das ja kein Eclispe RCP oder SpringDM Problem, sondern eher ein Problem deines Modells.
Hast du denn keine Factory oder ähnliches die deine Objekte erzeugt?

Nebenbei, als Hinweis zu Eclipse RCP & SpringDM, falls du das noch nicht kanntest: Tutorial: Spring OSGi + Eclipse RCP


----------



## Gast2 (29. Mai 2010)

maki hat gesagt.:


> Bin mir nicht sicher ob ich dich richtig verstehe
> 
> Prinzipiell ist das ja kein Eclispe RCP oder SpringDM Problem, sondern eher ein Problem deines Modells.
> Hast du denn keine Factory oder ähnliches die deine Objekte erzeugt?
> ...



Doch kenn ich schon =)...
Ja ne Factory hab ich mir auch überlegt,weiß aber  nicht wie ich die gescheit mit Spring mach dazu hab ich einen Thread bei Spring aufgemacht... Ja eigentlich schon ein eclipseRCP Problem find ich. 
Also wie kann ich so einen Handler mit SpringDM initalisieren damit ich die Facorty injezieren lassen kann?? Mit Views und Editoren habe ich es wie in dem Link gemacht. Aber mit nem Handler weiß ich es nicht.
Also würdemir sowas dann vorstellen.

```
public class CreateTeamEditor extends AbstractHandler{
 
@Autowired
    Factory factory;

    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException { 
        try {
            HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().openEditor(new TeamEditorSite(factory.createFoo()), TeamEditor.ID);
        } catch (PartInitException e) {
            e.printStackTrace();
        }
        return null;
    }
```

Boah nur ab und zu mal privat was mit den Themen zu machen ist echt zu wenig ... Muss mal schauen ich eine Firma finde die sowas professionell macht, weil das Themengebiet echt interessant ist =)...


----------



## maki (29. Mai 2010)

> Also wie kann ich so einen Handler mit SpringDM initalisieren damit ich die Facorty injezieren lassen kann?? Mit Views und Editoren habe ich es wie in dem Link gemacht. Aber mit nem Handler weiß ich es nicht.


Würde sagen genauso wie mit Views & Editoren.



> Boah nur ab und zu mal privat was mit den Themen zu machen ist echt zu wenig ... Muss mal schauen ich eine Firma finde die sowas professionell macht, weil das Themengebiet echt interessant ist =)...


Ja, das Thema ist wirklich interessant 
Spring ist ja mehr oder weniger universell, man könnte anstatt SpringDM auch Declarative Services einsetzen.
Eclipse RCP finde ich sehr gut, wenn man sich mal auskennt kommt man sehr schnell voran, weil vieles schon fertig geliefert wird.
Die Lernkurve ist natürlich steil, sollten sich aber genug Firmen geben die sich dafür interessieren


----------



## Gast2 (29. Mai 2010)

maki hat gesagt.:


> Würde sagen genauso wie mit Views & Editoren.



Mhm muss ich mal testen, glaub zwar net wirklich so dran. Weil bei Views und Editoren man immer eine eindeutige ID mitgeben muss. Und die SpringExtensionFactory ja eine externe lib ist. Darum ka ob des so einfach klappt.

Aber leider weiß ich immer noch nicht wie man mit Spring so ne Factory gescheit aufbaut...



maki hat gesagt.:


> Die Lernkurve ist natürlich steil, sollten sich aber genug Firmen geben die sich dafür interessieren



Ja muss ich mal schauen  denke lohnen würde sich sowas auf jeden Fall ... Bin jetzt erstmal auf dem javaforum in Stuttgart da gibt es auch 3 Beiträge zu dem Thema, bin ich auch mal gespannt =).


----------



## maki (30. Mai 2010)

> Mhm muss ich mal testen, glaub zwar net wirklich so dran. Weil bei Views und Editoren man immer eine eindeutige ID mitgeben muss. Und die SpringExtensionFactory ja eine externe lib ist. Darum ka ob des so einfach klappt.


Die id die du meinst ist die Comand ID, da steht ja auch der (Default-)Handler.

Könnte es morgen mal in der Arbeit testen, wüsste aber spontan keinen Grund, warum das nciht gehen sollte.


----------



## Gast2 (30. Mai 2010)

maki hat gesagt.:


> Die id die du meinst ist die Comand ID, da steht ja auch der (Default-)Handler.
> 
> Könnte es morgen mal in der Arbeit testen, wüsste aber spontan keinen Grund, warum das nciht gehen sollte.



Habs hinbekommen, im plugin.xml im command wo die die klasse angibst macht man einfach genau das gleiche wie mit views und editoren. Die id kann man ja selber wählen hatte ich ganz vergessen, ist ja nur das mapping zu spring.xml.
org.eclipse.springframework.util.SpringExtensionFactoryid in der spring.xml)

Okay jetzt hab ich einen Handler mit einer Factory. Aber da der Handler nur einmal erzeugt wird hat die facorty immer die gleiche Instanz. Wie muss dann die Factory aussehen, damit ich immer neue Instanzen bekomme. Hab mir gedacht ich kann in der Factory immer meine EditorInputs erzeugen lassen. Aber ich weiß noch nicht wie ich dann immer eine neue Instanz bekomme?

Handler

```
public class EditorHandler extends AbstractHandler{

	@Autowired
	private Factory factory;
	
	@Override
	public Object execute(ExecutionEvent event) throws ExecutionException {	
		System.out.println(factory);
		try {
			HandlerUtil.getActiveWorkbenchWindow(event).
			getActivePage().openEditor();
		} catch (PartInitException e) {
			e.printStackTrace();
		}
		return null;
	}

}
```


```
public class Factory {

	@Autowired
	private MyEditorInput editorInput;

	public MyEditorInput getMyEditorInput() {
		return editorInput;
	}
	
}
```


----------



## maki (30. Mai 2010)

> Okay jetzt hab ich einen Handler mit einer Factory. Aber da der Handler nur einmal erzeugt wird hat die facorty immer die gleiche Instanz. Wie muss dann die Factory aussehen, damit ich immer neue Instanzen bekomme. Hab mir gedacht ich kann in der Factory immer meine EditorInputs erzeugen lassen. Aber ich weiß noch nicht wie ich dann immer eine neue Instanz bekomme?


Eigentlich ist es ja egal, ob der Handler & die Factory Singletons sind (hat aber vorteile ), die Factory braucht doch nur eine createBlaBlubbObject Methode, und liefert dann eine neue Instanz inkl. ID zurück.
Mit Spring muss diese Methode nicht statisch sein, kann aber, denn klassische Factoriy Methoden sind statisch.


----------



## Gast2 (30. Mai 2010)

maki hat gesagt.:


> Eigentlich ist es ja egal, ob der Handler & die Factory Singletons sind (hat aber vorteile ), die Factory braucht doch nur eine createBlaBlubbObject Methode, und liefert dann eine neue Instanz inkl. ID zurück.
> Mit Spring muss diese Methode nicht statisch sein, kann aber, denn klassische Factoriy Methoden sind statisch.



Joa das ist mir soweit klar =)...

Aber sowas hier ist doch nicht sauber? 

```
public class Factory {

	public static X getX() {
		return new XImpl();
	}
	
}
```

Wie mach ich so eine Factory mit Spring ohne den Applicationcontext zu benutzen??? Geht sowas überhaupt?


----------

