apetrov
I'm new here

Content Transport Feature per API erstellen

Jump to solution

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 (1)
0 Kudos
1 Solution

Accepted Solutions
broszeit
I'm new here

Re: Content Transport Feature per API erstellen

Jump to solution

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

View solution in original post

0 Kudos
10 Replies
broszeit
I'm new here

Re: Content Transport Feature per API erstellen

Jump to solution

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

0 Kudos
tklein
I'm new here

Re: Content Transport Feature per API erstellen

Jump to solution

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...

apetrov
I'm new here

Re: Content Transport Feature per API erstellen

Jump to solution

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?

0 Kudos
tklein
I'm new here

Re: Content Transport Feature per API erstellen

Jump to solution

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);

0 Kudos
apetrov
I'm new here

Re: Content Transport Feature per API erstellen

Jump to solution

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?

0 Kudos
tklein
I'm new here

Re: Content Transport Feature per API erstellen

Jump to solution

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.

0 Kudos
apetrov
I'm new here

Re: Content Transport Feature per API erstellen

Jump to solution

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.

16.08.png

0 Kudos
apetrov
I'm new here

Re: Content Transport Feature per API erstellen

Jump to solution

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.

0 Kudos
gockel
Crownpeak employee
Crownpeak employee

Re: Content Transport Feature per API erstellen

Jump to solution

Das dazugehörige Problem ist hier beschrieben: siehe Re: Export von Datenquellen per Skript