Kategorie: Spring

RSS-Feeds mit Rome & Spring 2.5

Problem: Wie erzeuge ich einen RSS-Feed mit Rome und Spring MVC

Lösung:

Man lädt sich Rome und Spring Modules herunter und packt beide Jars in seinen Classpath.

Danach erzeugt man einen RSSView:

public class RSSView extends AbstractRssView
{
	private static final String[] FEED_TYPE = {"rss_0.90","rss_0.91","rss_0.92","rss_0.93","rss_0.94","rss_1.0","rss_2.0","atom_0.3"};	

	private static final DateFormat DATE_PARSER = new SimpleDateFormat("yyyy-MM-dd");

	private String description;

	/**
	 * Generates the Feed.
	 */
	@SuppressWarnings("unchecked")
	@Override
	protected void buildFeed(Map model, HttpServletRequest request, HttpServletResponse response, SyndFeed feed)
	{
		feed.setFeedType(FEED_TYPE[6]);

		feed.setTitle("Peters Feeds");
		feed.setLink(getBaseUrl());
		feed.setDescription(description);

		SyndImage image 	= new SyndImageImpl();
		image.setLink(getBaseUrl());
		image.setUrl("URLTOIMAGE");
		image.setDescription(description);
		image.setTitle("Peter");
		feed.setImage(image);

		List entries = new ArrayList();
		SyndEntry entry;

		entry = new SyndEntryImpl();
		entry.setTitle("Rome v1.0");
		entry.setLink("http://wiki.java.net/bin/view/Javawsxml/Rome01");
		entry.setPublishedDate(DATE_PARSER.parse("2004-06-08"));
		description = new SyndContentImpl();
		description.setType("text/plain");
		description.setValue("Initial release of Rome");
		entry.setDescription(description);
		entries.add(entry);

		entry = new SyndEntryImpl();
		entry.setTitle("Rome v2.0");
		entry.setLink("http://wiki.java.net/bin/view/Javawsxml/Rome02");
		entry.setPublishedDate(DATE_PARSER.parse("2004-06-16"));
		description = new SyndContentImpl();
		description.setType("text/plain");
		description.setValue("Bug fixes, minor API changes and some new features");
		entry.setDescription(description);
		entries.add(entry);

		feed.setEntries(entries);

	}

	public void setDescription(String description)
	{
		this.description = description;
	}

}

Anschließend erzeugt man den dazugehörigen Controller:

public class RssFeedController implements Controller
{

	@Override
	public ModelAndView handleRequest(HttpServletRequest arg0,
			HttpServletResponse arg1) throws Exception
	{

		return  new ModelAndView("rSSView");
	}
}

Als Letztes verdrahtet man alles in seiner dispatcher.xml:

...
RssFeedController

	

	

	
	
...

… ab Version 3.0 des Springframework kann man das ganz einfach so machen.




Dateien mit ClamAV und Java scannen

Kleines Beispiel, wie man auf dem Server Dateien beim Upload auf Viren überprüfen kann:

Das Scanner-Interface:

public interface Scanner
{
	ScannerResults scan(File source);
}

Die ClamAV-Implementierung

public class ClamAvScannerImpl implements Scanner
{

	private static final Logger logger = Logger.getLogger(ClamAvScannerImpl.class);

	private ScannerResults scannerResults;

	/**
	 * Scans the file and returns the result.
	 */
	@Override
	public synchronized ScannerResults scan(File source)
	{

		try
		{
			Process process =  new ProcessBuilder("clamscan",source.getAbsolutePath()).start();
			int code 		= process.waitFor();

			switch (code)
			{
				case 0: scannerResults.setOk(true); break;
				case 1: 

					logger.info("Virus found in: "+source.getAbsolutePath());
					scannerResults.setMessage("Virus found!");
					scannerResults.setOk(false);
					break;

				default: logger.warn("Unexpected return code from ClamAV"); break;
			}

		} catch (IOException e)
		{
				logger.error("Problem starting ClamAV!");
		} catch (InterruptedException e)
		{
			logger.error("Problem waiting for ClamAV");
		}

		return scannerResults;
	}

	public void setScannerResults(ScannerResults scannerResults)
	{
		this.scannerResults = scannerResults;
	}

}

Die Ergebnisse:

public interface ScannerResults
{
	boolean isOk();

	List getMessages();

	void setOk(boolean ok);

	void setMessage(String message);

}

public class ClamAVScannerResultsImpl implements ScannerResults
{
	private boolean ok;
	private String message;

	public boolean isOk()
	{
		return ok;
	}

	public List getMessages()
	{
        if (message == null)
            return new ArrayList(0);
        else
            return Arrays.asList(new String[]{message});

	}

	public void setOk(boolean ok)
	{
		this.ok = ok;
	}

	public void setMessage(String message)
	{
		this.message = message;
	}

}

Dann im Controller/Service beim Upload aufrufen:

...
try
			{
				MultipartHttpServletRequest req = multiPartResolver.resolveMultipart(request);
				MultipartFile file 				= req.getFile("file");

				ScannerResults result 			= scanner.scan(new File(file.getName()));
				if(result.isOk())
				{
					//save it!
				}
				else
					mv.addObject("error","file.virus");
			} catch (MaxUploadSizeExceededException e)
			{
				mv.addObject("error","file.maxupload");
			}
...

Vorher natürlich ClamAV installieren!


Tags: