package org.juxtasoftware.resource; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.juxtasoftware.dao.QNameFilterDao; import org.juxtasoftware.model.QNameFilter; import org.restlet.data.Status; import org.restlet.representation.Representation; import org.restlet.resource.Delete; import org.restlet.resource.Get; import org.restlet.resource.Put; import org.restlet.resource.ResourceException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import eu.interedition.text.Name; import eu.interedition.text.NameRepository; import eu.interedition.text.mem.SimpleName; @Service @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class QNameFilterResource extends BaseResource { @Autowired private QNameFilterDao qnameFilterDao; @Autowired private NameRepository nameRepository; private QNameFilter filter; private Gson gson; private JsonParser parser; @Override protected void doInit() throws ResourceException { super.doInit(); Long id = getIdFromAttributes("id"); if ( id == null ) { return; } this.filter = this.qnameFilterDao.find(id); if ( validateModel( this.filter ) == false ) { return; } this.parser = new JsonParser(); this.gson = new GsonBuilder() .excludeFieldsWithoutExposeAnnotation() .create(); } @Get("html") public Representation toHtml() { Map<String,Object> map = new HashMap<String,Object>(); map.put("filter", this.filter); return toHtmlRepresentation("qname_filter.ftl",map,false); } @Get("json") public Representation toJson() { JsonObject jsonObj = gson.toJsonTree( this.filter).getAsJsonObject(); JsonParser parser = new JsonParser(); // note: gson is unable to map the list of QNames to json for us // so we do it manually. grr. StringBuilder zzz = new StringBuilder(); zzz.append("["); for (Name qname : this.filter.getQNames()) { zzz.append("{namespace: '").append(qname.getNamespace()) .append("', localName: '").append(qname.getLocalName()).append("'}"); } zzz.append("]"); jsonObj.add("qnames", parser.parse(zzz.toString())); return toJsonRepresentation(jsonObj.toString()); } @Put("json") public void updateFromJson( final String jsonStr ) { LOG.info("Update filter with "+jsonStr); QNameFilter newFilter = this.gson.fromJson(jsonStr, QNameFilter.class ); JsonObject jsonObj = this.parser.parse(jsonStr).getAsJsonObject(); JsonArray notes = jsonObj.get("qnames").getAsJsonArray(); for ( Iterator<JsonElement> itr = notes.iterator(); itr.hasNext(); ) { JsonObject obj = itr.next().getAsJsonObject(); SimpleName qname = new SimpleName( obj.get("namespace").getAsString(), obj.get("localName").getAsString() ); Name actualQname = this.nameRepository.get(qname); newFilter.getQNames().add(actualQname); } // was this a name change? if ( this.filter.getName().equals(newFilter.getName()) == false ) { // make sure it doesn't match an existing name if ( this.qnameFilterDao.find(this.workspace, newFilter.getName()) != null ) { setStatus(Status.CLIENT_ERROR_CONFLICT, "Filter \""+filter.getName()+"\" already exists"); return; } } this.qnameFilterDao.update(newFilter); } @Delete public void deleteFilter() { LOG.info("Delete filter "+this.filter.getId()); this.qnameFilterDao.delete(this.filter); } }