de.hoesel.dav.buv.twitter.baustelle.BaustelleTwitternDialog.java Source code

Java tutorial

Introduction

Here is the source code for de.hoesel.dav.buv.twitter.baustelle.BaustelleTwitternDialog.java

Source

/*
 * Rahmenwerk-Twitter-Anbindung
 * Copyright (C) 2014 Christian Hsel 
 * 
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your option) any later
 * version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 51
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

package de.hoesel.dav.buv.twitter.baustelle;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

import twitter4j.GeoLocation;
import twitter4j.StatusUpdate;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import de.bsvrz.buv.rw.bitctrl.CacheService;
import de.bsvrz.sys.funclib.bitctrl.modell.att.Feld;
import de.bsvrz.sys.funclib.bitctrl.modell.tmgeoreferenzierungglobal.attribute.AttWgs84Breite;
import de.bsvrz.sys.funclib.bitctrl.modell.tmgeoreferenzierungglobal.attribute.AttWgs84Laenge;
import de.bsvrz.sys.funclib.bitctrl.modell.tmgeoreferenzierungglobal.konfigurationsdaten.KdLinienKoordinaten;
import de.bsvrz.sys.funclib.bitctrl.modell.tmgeoreferenzierungglobal.objekte.Linie;
import de.bsvrz.sys.funclib.bitctrl.modell.tmverkehrglobal.konfigurationsdaten.KdStrassenSegment;
import de.bsvrz.sys.funclib.bitctrl.modell.tmverkehrglobal.objekte.AeusseresStrassenSegment;
import de.bsvrz.sys.funclib.bitctrl.modell.tmverkehrglobal.objekte.Baustelle;
import de.bsvrz.sys.funclib.bitctrl.modell.tmverkehrglobal.objekte.InneresStrassenSegment;
import de.bsvrz.sys.funclib.bitctrl.modell.tmverkehrglobal.objekte.Strasse;
import de.bsvrz.sys.funclib.bitctrl.modell.tmverkehrglobal.objekte.StrassenKnoten;
import de.bsvrz.sys.funclib.bitctrl.modell.tmverkehrglobal.objekte.StrassenSegment;
import de.bsvrz.sys.funclib.bitctrl.modell.tmverkehrglobal.objekte.StrassenTeilSegment;
import de.bsvrz.sys.funclib.bitctrl.modell.tmverkehrglobal.parameter.PdSituationsEigenschaften;
import de.bsvrz.sys.funclib.bitctrl.modell.tmverkehrglobal.parameter.PdSituationsEigenschaften.Daten;
import de.bsvrz.sys.funclib.bitctrl.modell.util.cache.NetzCacheExtended;
import de.hoesel.dav.buv.twitter.Activator;
import de.hoesel.dav.buv.twitter.internal.RahmenwerkService;

public class BaustelleTwitternDialog extends TitleAreaDialog {
    private static final String ICONS_BIRD_BLUE_48_PNG = "icons/bird_blue_32.png";
    private Text messgae;
    private Baustelle baustelle;
    private NetzCacheExtended netzCache;
    private GeoLocation location;

    /**
     * Create the dialog.
     * 
     * @param parentShell
     */
    public BaustelleTwitternDialog(Shell parentShell, Baustelle baustelle) {
        super(parentShell);
        setShellStyle(SWT.MAX | SWT.RESIZE);
        Assert.isNotNull(baustelle);
        this.baustelle = baustelle;

        final CacheService cacheService = RahmenwerkService.getService().getCacheService();
        netzCache = cacheService.getNetzCacheExtended(cacheService.getDefaultNetzPid());
    }

    /**
     * Create contents of the dialog.
     * 
     * @param parent
     */
    @Override
    protected Control createDialogArea(Composite parent) {

        ImageDescriptor imageDescriptor = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID,
                ICONS_BIRD_BLUE_48_PNG);
        ImageRegistry imageRegistry = Activator.getDefault().getImageRegistry();
        Image image = imageRegistry.get(imageDescriptor.toString());
        if (image == null) {
            imageRegistry.put(imageDescriptor.toString(), imageDescriptor);
            image = imageRegistry.get(imageDescriptor.toString());
        }
        //      setTitleImage(image);
        setTitle("Baustelle " + baustelle.getName() + " twittern");
        setMessage("Folgender Text wird via Twitter publiziert.");
        Composite area = (Composite) super.createDialogArea(parent);
        Composite container = new Composite(area, SWT.NONE);
        container.setLayout(new GridLayout(1, false));
        container.setLayoutData(new GridData(GridData.FILL_BOTH));

        messgae = new Text(container, SWT.BORDER | SWT.WRAP | SWT.MULTI);
        messgae.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        StringBuffer meldungsText = new StringBuffer();

        PdSituationsEigenschaften pdSituationsEigenschaften = baustelle.getPdSituationsEigenschaften();
        Daten situationsEigenschaften = pdSituationsEigenschaften.getDatum();

        meldungsText.append("Baustelle");
        Feld<StrassenSegment> strassenSegmente = situationsEigenschaften.getStrassenSegment();
        if (!strassenSegmente.isEmpty()) {
            KdStrassenSegment kdStrassenSegment = strassenSegmente.get(0).getKdStrassenSegment();
            de.bsvrz.sys.funclib.bitctrl.modell.tmverkehrglobal.konfigurationsdaten.KdStrassenSegment.Daten datum = kdStrassenSegment
                    .getDatum();

            Strasse strasse = datum.getGehoertZuStrasse();

            if (strasse != null) {
                meldungsText.append(" auf der " + strasse.getName());
                ;
            }
        }

        StrassenKnoten startKnoten = ermittelStartStrassenKnoten(strassenSegmente);
        StrassenKnoten endKnoten = ermittelEndStrassenKnoten(strassenSegmente);

        if (endKnoten != null && !endKnoten.equals(startKnoten)) {
            meldungsText.append(" zwischen ");
            meldungsText.append(startKnoten.getName());
            meldungsText.append(" und ");
            meldungsText.append(endKnoten.getName());
        } else {
            meldungsText.append(" - ");
            meldungsText.append(startKnoten.getName());
        }

        // Ermittel Zeiten.
        if (situationsEigenschaften.getStartZeit() != null && situationsEigenschaften.getDauer() != null) {

            Date startZeit = new Date((situationsEigenschaften.getStartZeit().getTime() / 1000) * 1000);
            long dauer = (situationsEigenschaften.getDauer().getTime() / 1000) * 1000;
            Date endZeit = new Date(startZeit.getTime() + dauer);

            DateFormat format = SimpleDateFormat.getDateInstance();
            meldungsText.append(" vom " + format.format(startZeit) + " bis " + format.format(endZeit));
        }

        if (meldungsText.length() > 140) {
            // Nachricht zu lang
            String string = meldungsText.toString();
            string = string.replace("Autobahnanschlussstelle", "");
            string = string.replaceAll("\\[\\d+\\]", "");
            string = string.replace("  ", " ");
            messgae.setText(string);
        } else {
            messgae.setText(meldungsText.toString());
        }

        location = ermittleGeoLocation(strassenSegmente);

        return area;
    }

    private GeoLocation ermittleGeoLocation(Feld<StrassenSegment> segmente) {
        if (segmente == null || segmente.isEmpty()) {
            return null;
        }

        final StrassenSegment segment = segmente.get(0);
        Feld<Linie> linienReferenz = segment.getKdBestehtAusLinienObjekten().getDatum().getLinienReferenz();
        if (linienReferenz.isEmpty()) {
            return null;
        }
        final StrassenTeilSegment sts = (StrassenTeilSegment) linienReferenz.iterator().next();
        final KdLinienKoordinaten.Daten koordinaten = sts.getKdLinienKoordinaten().getDatum();

        AttWgs84Laenge attWgs84Laenge = koordinaten.getX().get(0);
        AttWgs84Breite attWgs84Breite = koordinaten.getY().get(0);

        return new GeoLocation(attWgs84Breite.doubleValue(), attWgs84Laenge.doubleValue());
    }

    @Override
    protected void okPressed() {
        RahmenwerkService service = RahmenwerkService.getService();
        Twitter twitter = service.getTwitter();

        try {
            // TODO:Bilder funktionieren noch nicht richtig
            // InputStream resourceAsStream =
            // BaustelleTwitternDialog.class.getResourceAsStream("baustelle.gif");
            StatusUpdate update = new StatusUpdate("[Test] " + messgae.getText());

            if (location != null) {
                // TODO: Das funktioniert nur, wenn man in seinen Twitter
                // Setting via Opt-In das Anzeigen der Location erlaubt.
                update.displayCoordinates(true);
                update.setLocation(location);
            }
            // update.setMedia("Baustelle",resourceAsStream);

            twitter.updateStatus(update);
            super.okPressed();
        } catch (TwitterException e) {
            setErrorMessage(e.getLocalizedMessage());
            e.printStackTrace();
        }

    }

    /**
     * Create contents of the button bar.
     * 
     * @param parent
     */
    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        createButton(parent, IDialogConstants.OK_ID, "Absenden", true);
        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
    }

    /**
     * Return the initial size of the dialog.
     */
    @Override
    protected Point getInitialSize() {
        return new Point(450, 300);
    }

    /**
     * Ermittelt fr eine gegebene Liste von ueren Straensegmenten den
     * Startstraenknoten.
     * 
     * @param segmente
     *            die Liste der ueren Straensegmente
     * 
     * @return den fr eine gegebene Liste von ueren Straensegmenten
     *         ermittelten Startstraenknoten
     */
    private StrassenKnoten ermittelStartStrassenKnoten(final List<StrassenSegment> segmente) {
        if (segmente == null || segmente.isEmpty()) {
            return null;
        }

        final StrassenSegment segment = segmente.get(0);
        if (segment instanceof InneresStrassenSegment && segmente.size() == 1) {
            return netzCache.getNetzCache().getStrassenKnoten((InneresStrassenSegment) segment);
        }

        AeusseresStrassenSegment ass = null;
        if (segment instanceof InneresStrassenSegment) {
            ass = ((InneresStrassenSegment) segment).getKdInneresStrassenSegment().getDatum()
                    .getVonStrassenSegment();
        }
        if (segment instanceof AeusseresStrassenSegment) {
            ass = (AeusseresStrassenSegment) segment;
        }
        if (ass == null) {
            return null;
        }
        return ass.getKdAeusseresStrassenSegment().getDatum().getVonKnoten();
    }

    /**
     * Ermittelt fr eine gegebene Liste von ueren Straensegmenten den
     * Endstraenknoten.
     * 
     * @param segmente
     *            die Liste der ueren Straensegmente
     * 
     * @return den fr eine gegebene Liste von ueren Straensegmenten
     *         ermittelten Endstraenknoten
     */
    private StrassenKnoten ermittelEndStrassenKnoten(final List<StrassenSegment> segmente) {
        if (segmente == null || segmente.isEmpty()) {
            return null;
        }
        final StrassenSegment segment = segmente.get(segmente.size() - 1);

        if (segment instanceof InneresStrassenSegment) {
            return netzCache.getNetzCache().getStrassenKnoten((InneresStrassenSegment) segment);
        }

        if (segment instanceof AeusseresStrassenSegment) {
            return ((AeusseresStrassenSegment) segment).getKdAeusseresStrassenSegment().getDatum().getNachKnoten();
        }
        return null;
    }
}