- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Content Transport Feature per API erstellen
Hallo Community, ich versuche per API im FS ein ContentTransport-Feature zu erstellen, mein code dazu sieht wie
folgt aus...
public static void main(String[] args) {
project = connection.getProjectByName("Mithras Energy");
TemplateStoreRoot templateStore = project.getUserService().getTemplateStore();
try {
InputStream featureStream = createFeature(templateStore.getStoreElement(2485));
File f = new File("feature.zip");
OutputStream out = new FileOutputStream(f);
byte buf[] = new byte[1024];
int len;
while ((len = featureStream.read(buf)) > 0) {
out.write(buf, 0, len);
out.close();
featureStream.close();
}
} catch (IOException ex) {
ConnectionManager.closeInstance();
System.out.println(ex.toString());
} catch (Exception ex) {
ConnectionManager.closeInstance();
System.out.println(ex.toString());
}
}
public static InputStream createFeature(IDProvider idProvider) throws IOException {
SpecialistsBroker broker = connection.getBroker().requireSpecialist(BrokerAgent.TYPE).getBrokerByProjectName(project.getName());
FeatureAgent agent = broker.requireSpecialist(FeatureAgent.TYPE);
Revision revision = project.getRevision(20281);
FeatureDescriptor featureDescriptor = agent.createFeature(idProvider.getUid(), revision, false);
FeatureModel featureModel = agent.createFeatureModel(featureDescriptor);
featureModel.add(idProvider);//returns true
agent.saveFeature(featureModel);
ServerActionHandle<? extends FeatureProgress, Boolean> featureProgress = agent.createFeatureTransportFile(featureDescriptor);
FeatureProgress progress = featureProgress.getProgress(true);
return agent.downloadFeatureFile(progress.getFeatureFile());
}
Als Ergebnis bekomme ich zwar eine Feature-Datei, die aber nur die Dateien info.txt, feature.xml und entries.xml beinhaltet, also sozusagen leer ist. Beim Debuggen habe ich festgestellt, dass nach
...
featureModel.add(idProvider);//returns true
agent.saveFeature(featureModel);
...
der FeatureDescriptor immernoch keine _elementIdentifiers besitzt, also habe ich den Code dahingehend abgewandelt...
...
featureModel.add(idProvider);
agent.saveFeature(featureModel);
List<FeatureDescriptor> featureDescriptors = agent.getFeatureDescriptors();
for (FeatureDescriptor fd : featureDescriptors){
if(fd.getFeatureName().equals(idProvider.getUid())){
featureDescriptor = fd;
}
}
ServerActionHandle<? extends FeatureProgress, Boolean> featureProgress = agent.createFeatureTransportFile(featureDescriptor);
FeatureProgress progress = featureProgress.getProgress(true);
return agent.downloadFeatureFile(progress.getFeatureFile());
...
_elementIdentifiers waren ab da nicht mehr leer, aber die generierte Datei war unvollstรคndig und lieร sich nicht mehr รถffnen.
- Labels:
-
Developers
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Artem,
ich habe gerade versucht das Problem nachzustellen, bei mir funktionierte das Erstellen des Features mit anschlieรendem Importieren allerdings, wenn ich die Version mit hinzugefรผgtem FeatureDescriptor verwende. (mit den folgenden Anpassungen)
while ((len = featureStream.read(buf)) > 0) {
out.write(buf, 0, len);
out.close();
featureStream.close();
}
Die beiden close() Anweisungen ergeben in der Schleife keinen Sinn, ich habe sie hinter die Schleife verschoben.
ConnectionManager.closeInstance();
Woher kommt diese Methode? Ich kann diese weder in der FS4.2 noch in der FS5.0 API finden und der Code kompiliert bei mir nicht, wenn ich diese Zeile drin lasse....
Welche FirstSpirit Version wird รผberhaupt eingesetzt?
Viele Grรผรe
Rouven
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Artem,
ich habe gerade versucht das Problem nachzustellen, bei mir funktionierte das Erstellen des Features mit anschlieรendem Importieren allerdings, wenn ich die Version mit hinzugefรผgtem FeatureDescriptor verwende. (mit den folgenden Anpassungen)
while ((len = featureStream.read(buf)) > 0) {
out.write(buf, 0, len);
out.close();
featureStream.close();
}
Die beiden close() Anweisungen ergeben in der Schleife keinen Sinn, ich habe sie hinter die Schleife verschoben.
ConnectionManager.closeInstance();
Woher kommt diese Methode? Ich kann diese weder in der FS4.2 noch in der FS5.0 API finden und der Code kompiliert bei mir nicht, wenn ich diese Zeile drin lasse....
Welche FirstSpirit Version wird รผberhaupt eingesetzt?
Viele Grรผรe
Rouven
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Das Feature ist noch nicht fertig, deswegen kommst du nicht dran.
Nach dem:
ServerActionHandle<? extends FeatureProgress, Boolean> featureProgress = agent.createFeatureTransportFile(featureDescriptor);
musst du erst warten bis der Prozess durch ist. das machst du mit
featureProgress.getResult(false)
siehe dazu: http://www.e-spirit.com/odfs42/access/de/espirit/firstspirit/access/ServerActionHandle.html
und dann kann dein Code weiter laufen...
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Danke, mit den รnderungen hat es funktioniert. Jedoch wie bereits erwรคhnt nur nachdem ich รผber alle FeatureDescriptoren iteriert und meinen rausgesucht habe. Die ConnectionManager.closeInstance() Methode ist von einer eigenen Klasse, deshalb hier nicht weiter wichtig (schlieรt im Grunde nur die Verbindung usw.). Benutzt wird die Version 5.0.318.57504.
Kommt man an das neue Feature nur indem man รผber alle FeatureDescriptoren iteriert?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
nein es sollte auch gehen, wenn man den FeatureDescripter nutzt, den man oben bekommt:
FeatureDescriptor featureDescriptor = agent.createFeature(idProvider.getUid(), revision, false);
[...]
ServerActionHandle<? extends FeatureProgress, Boolean> featureProgress = agent.createFeatureTransportFile(featureDescriptor);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Tobias Klein schrieb:
nein es sollte auch gehen, wenn man den FeatureDescripter nutzt, den man oben bekommt:
FeatureDescriptor featureDescriptor = agent.createFeature(idProvider.getUid(), revision, false);
[...]
ServerActionHandle<? extends FeatureProgress, Boolean> featureProgress = agent.createFeatureTransportFile(featureDescriptor);
Das funktioniert leider nicht. Ich muss dann den umstรคndlichen Weg gehen und รผber alle existierenden Features iterieren. Das mรผsste doch einfacher gehen?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
hm bei mir schon. und ohne Fehlerbeschreibung was mit dem Beispiel nicht geht bzw. wie sich das "funktioniert nicht" รคussert kann ich dir wohl nicht weiterhelfen.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
public static void main(String[] args) {
connection = de.espirit.firstspirit.access.ConnectionManager.getConnection(host,
port, de.espirit.firstspirit.access.ConnectionManager.HTTP_MODE, "fs5root",
user, password);
try {
connection.connect();
System.out.println("Verbindung hergestellt - ");
} catch (IOException ex) {
JOptionPane.showMessageDialog(new JFrame(), ex.getMessage());
} catch (AuthenticationException ex) {
JOptionPane.showMessageDialog(new JFrame(), ex.getMessage());
} catch (MaximumNumberOfSessionsExceededException ex) {
JOptionPane.showMessageDialog(new JFrame(), ex.getMessage());
}
project = connection.getProjectByName("Mithras Energy");
IDProvider featureTemplate = project.getUserService().getStore(Store.Type.TEMPLATESTORE, false).getStoreElement(24);
try {
createFeature(featureTemplate, getAgent());
} catch (Exception ex) {
Logger.getLogger(Feature.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static FeatureAgent getAgent() {
SpecialistsBroker broker = connection.getBroker().requireSpecialist(BrokerAgent.TYPE).getBrokerByProjectName(project.getName());
return broker.requireSpecialist(FeatureAgent.TYPE);
}
public static void createFeature(IDProvider template, FeatureAgent agent) throws Exception {
List<Revision> history = template.getHistory();
FeatureDescriptor featureDescriptor = agent.createFeature(template.getUid(), history.get(0), false);
FeatureModel featureModel = agent.createFeatureModel(featureDescriptor);
featureModel.add(template);
agent.saveFeature(featureModel);
InputStream inputStream = getInputStream(featureDescriptor, agent);
writeFile(inputStream);
}
private static InputStream getInputStream(FeatureDescriptor featureDescriptor, FeatureAgent agent) throws Exception {
ServerActionHandle<? extends FeatureProgress, Boolean> featureProgress = agent.createFeatureTransportFile(featureDescriptor);
try {
//Wait until feature is generated
while (!featureProgress.getResult(false)) {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
throw new Exception(ex);
}
}
} catch (Exception ex) {
throw new Exception(ex);
}
FeatureProgress progress = featureProgress.getProgress(true);
return agent.downloadFeatureFile(progress.getFeatureFile());
}
private static void writeFile(InputStream inputStream) {
FileOutputStream out = null;
try {
File file = new File("homepage.zip");
out = new FileOutputStream(file);
byte[] b = new byte[1024];
int count;
while ((count = inputStream.read(b)) > 0) {
out.write(b, 0, count);
}
inputStream.close();
out.close();
} catch (FileNotFoundException ex) {
Logger.getLogger(Feature.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Feature.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
out.close();
} catch (IOException ex) {
Logger.getLogger(Feature.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Im Ergebnis wird zwar eine Zip Datei erstellt, aber alle darin enthaltenen Dateien haben keine Daten.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Wenn ich die createFeature(...) Methode allerdings dahingehend รคndere:
...
public static void createFeature(IDProvider template, FeatureAgent agent) throws Exception {
List<Revision> history = template.getHistory();
FeatureDescriptor featureDescriptor = agent.createFeature(template.getUid(), history.get(0), false);
FeatureModel featureModel = agent.createFeatureModel(featureDescriptor);
featureModel.add(template);
agent.saveFeature(featureModel);
List<FeatureDescriptor> featureDescriptors = agent.getFeatureDescriptors();
for (FeatureDescriptor fd : featureDescriptors) {
if (fd.getFeatureName().equals(featureDescriptor.getFeatureName())) {
featureDescriptor = fd;
break;
}
}
InputStream inputStream = getInputStream(featureDescriptor, agent);
writeFile(inputStream);
}
...
Funktioniert es und ich bekomme einen validen Feature-Export. Bei unserem Vorgehen kommen allerdings im Laufe der Zeit immer mehr Features zum Projekt dazu. Da man ein erstelltes Features nicht mehr lรถschen kann, muss die for()-Schleife irgendwann รผber unzรคhlige Features iterieren.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Das dazugehรถrige Problem ist hier beschrieben: siehe Re: Export von Datenquellen per Skript

