// Path: api/agol-writer/src/main/java/esride/opendatabridge/agolreader/IAgolItemReader.java
// public interface IAgolItemReader {
// 
//     public AgolItem getAgolItemById(String agolId);
// 
//     public List<String> getAgolItemIdByTitle(String title);
// 
//     public List<String> getAgolItemIdByUrl(String url);
// 
//     public String getAgolItemIdByCatalogId(String catalogId);
// 
//     public void touchItem(String agolId);
// 
//     public List<String> getUntouchedAgolItems();
// 
// }
// 
// Path: api/agol-writer/src/main/java/esride/opendatabridge/item/AgolItem.java
// public class AgolItem {
//     private HashMap<String,String> _itemAttributes;
// 
//     // Constructors
//     public AgolItem(HashMap<String,String> itemAttributes)
//     {
//         _itemAttributes = itemAttributes;
//     }
// 
//     public HashMap<String,String> getAttributes()
//     {
//         return _itemAttributes;
//     }
// 
//     public String getUrl() {
//         if (_itemAttributes.get("url")!=null) {
//             return _itemAttributes.get("url");
//         }
//         return "";
//     }
// 
//     public String getId() {
//         if (_itemAttributes.get("id")!=null) {
//             return _itemAttributes.get("id");
//         }
//         return "";
//     }
// 
//     public String getTitle() {
//         return _itemAttributes.get("title");
//     }
// 
//     public String getType() {
//         return _itemAttributes.get("type");
//     }
// 
//     public String getForeignKey(String keyPrefix){
//         //todo: aus den tags muss noch der richtige Wert herausgeholt werden
//         String tags = _itemAttributes.get("tags");
//         if(tags != null && tags.trim().length() > 0){
//             if(!tags.contains(keyPrefix)){
//                 return null;
//             }
//             StringTokenizer tokenizer = new StringTokenizer(tags, ",");
//             String foreinKey = null;
//             while (tokenizer.hasMoreTokens()){
//                 String actualToken = tokenizer.nextToken().trim();
//                 if(actualToken.startsWith(keyPrefix)){
//                     foreinKey = actualToken;
//                     break;
//                 }
//             }
//             return foreinKey;
//         }
//         return null;
// 
//     }
// 
//     public void setId(String id) {
//         updateAttribute("id", id);
//     }
// 
//     public void updateAttribute(String key, String value) {
//         removeAttribute(key);
//         _itemAttributes.put(key, value);
//     }
// 
//     public void removeAttribute(String key) {
//         if (_itemAttributes.containsKey(key)) {
//             _itemAttributes.remove(key);
//         }
//     }
// }
// 
// Path: api/objectpipeline/src/main/java/esride/opendatabridge/pipeline/InvalidObjectException.java
// public class InvalidObjectException extends Exception {
//     public InvalidObjectException() {
//         super();
//     }
// 
//     public InvalidObjectException(String message) {
//         super(message);
//     }
// 
//     public InvalidObjectException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public InvalidObjectException(Throwable cause) {
//         super(cause);
//     }
// }
// 
// Path: api/objectpipeline/src/main/java/esride/opendatabridge/pipeline/controller/PipelineController.java
// public class PipelineController implements IPipeline{
// 
//     private ArrayList<IPipeline> pipelineList;
// 
//     public void setPipelineList(ArrayList<IPipeline> pPipelineList) {
//         pipelineList = pPipelineList;
//     }
// 
//     public void examineAndChangeObject(HashMap<String, String> elements) throws InvalidObjectException {
//         if(pipelineList != null){
//             for(int i=0; i<pipelineList.size(); i++){
//                 pipelineList.get(i).examineAndChangeObject(elements);
//             }
//         }
//     }
// }


import esride.opendatabridge.agolreader.IAgolItemReader;
import esride.opendatabridge.agolwriter.*;
import esride.opendatabridge.item.AgolItem;
import esride.opendatabridge.pipeline.InvalidObjectException;
import esride.opendatabridge.pipeline.controller.PipelineController;
import esride.opendatabridge.reader.*;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.util.*;
                TransformedItemResult transformedResult = reader.getTramsformedItemsFromCatalog(startPosition);
                startPosition = transformedResult.getNextStartPosition();
                hasNextElements = transformedResult.isHasNextStartPosition();

                //iterate over the result
                List<TransformedItem> itemList = transformedResult.getTransformedResultList();
                for(int i=0; i<itemList.size(); i++){
                    TransformedItem item = itemList.get(i);

                    try {
                        //enrich, change or validate the item elements
                        pipelineController.examineAndChangeObject(item.getItemElements());

                        //check, if item is already stored in AGOL
                        ItemTransaction transactionStatus = insertUpdateCheck(agolReader, item.getItemElements());

                        //create AgolItem and update/insert the item
                        switch (transactionStatus.getTransactionStatus()){
                            case 1:
                                AgolItem agolItem = null;
                                try {
                                    agolItem = agolService.createAgolItem(item.getItemElements());
                                    agolService.insertItem(agolItem, AccessType.valueOf(accessType));
                                } catch (AgolItemInvalidException e) {
                                    sLogger.error("Creating an Agol Item failed", e);
                                } catch (IOException e) {
                                    sLogger.error("The AgolItem could not be inserted", e);
                                }
                                break;
                            case 2:
// Path: api/agol-writer/src/main/java/esride/opendatabridge/agolreader/IAgolItemReader.java
// public interface IAgolItemReader {
// 
//     public AgolItem getAgolItemById(String agolId);
// 
//     public List<String> getAgolItemIdByTitle(String title);
// 
//     public List<String> getAgolItemIdByUrl(String url);
// 
//     public String getAgolItemIdByCatalogId(String catalogId);
// 
//     public void touchItem(String agolId);
// 
//     public List<String> getUntouchedAgolItems();
// 
// }
// 
// Path: api/agol-writer/src/main/java/esride/opendatabridge/item/AgolItem.java
// public class AgolItem {
//     private HashMap<String,String> _itemAttributes;
// 
//     // Constructors
//     public AgolItem(HashMap<String,String> itemAttributes)
//     {
//         _itemAttributes = itemAttributes;
//     }
// 
//     public HashMap<String,String> getAttributes()
//     {
//         return _itemAttributes;
//     }
// 
//     public String getUrl() {
//         if (_itemAttributes.get("url")!=null) {
//             return _itemAttributes.get("url");
//         }
//         return "";
//     }
// 
//     public String getId() {
//         if (_itemAttributes.get("id")!=null) {
//             return _itemAttributes.get("id");
//         }
//         return "";
//     }
// 
//     public String getTitle() {
//         return _itemAttributes.get("title");
//     }
// 
//     public String getType() {
//         return _itemAttributes.get("type");
//     }
// 
//     public String getForeignKey(String keyPrefix){
//         //todo: aus den tags muss noch der richtige Wert herausgeholt werden
//         String tags = _itemAttributes.get("tags");
//         if(tags != null && tags.trim().length() > 0){
//             if(!tags.contains(keyPrefix)){
//                 return null;
//             }
//             StringTokenizer tokenizer = new StringTokenizer(tags, ",");
//             String foreinKey = null;
//             while (tokenizer.hasMoreTokens()){
//                 String actualToken = tokenizer.nextToken().trim();
//                 if(actualToken.startsWith(keyPrefix)){
//                     foreinKey = actualToken;
//                     break;
//                 }
//             }
//             return foreinKey;
//         }
//         return null;
// 
//     }
// 
//     public void setId(String id) {
//         updateAttribute("id", id);
//     }
// 
//     public void updateAttribute(String key, String value) {
//         removeAttribute(key);
//         _itemAttributes.put(key, value);
//     }
// 
//     public void removeAttribute(String key) {
//         if (_itemAttributes.containsKey(key)) {
//             _itemAttributes.remove(key);
//         }
//     }
// }
// 
// Path: api/objectpipeline/src/main/java/esride/opendatabridge/pipeline/InvalidObjectException.java
// public class InvalidObjectException extends Exception {
//     public InvalidObjectException() {
//         super();
//     }
// 
//     public InvalidObjectException(String message) {
//         super(message);
//     }
// 
//     public InvalidObjectException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public InvalidObjectException(Throwable cause) {
//         super(cause);
//     }
// }
// 
// Path: api/objectpipeline/src/main/java/esride/opendatabridge/pipeline/controller/PipelineController.java
// public class PipelineController implements IPipeline{
// 
//     private ArrayList<IPipeline> pipelineList;
// 
//     public void setPipelineList(ArrayList<IPipeline> pPipelineList) {
//         pipelineList = pPipelineList;
//     }
// 
//     public void examineAndChangeObject(HashMap<String, String> elements) throws InvalidObjectException {
//         if(pipelineList != null){
//             for(int i=0; i<pipelineList.size(); i++){
//                 pipelineList.get(i).examineAndChangeObject(elements);
//             }
//         }
//     }
// }


// Path: api/transformation/src/main/java/esride/opendatabridge/processing/Transformer.java
import esride.opendatabridge.agolreader.IAgolItemReader;
import esride.opendatabridge.agolwriter.*;
import esride.opendatabridge.item.AgolItem;
import esride.opendatabridge.pipeline.InvalidObjectException;
import esride.opendatabridge.pipeline.controller.PipelineController;
import esride.opendatabridge.reader.*;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.util.*;

                TransformedItemResult transformedResult = reader.getTramsformedItemsFromCatalog(startPosition);
                startPosition = transformedResult.getNextStartPosition();
                hasNextElements = transformedResult.isHasNextStartPosition();

                //iterate over the result
                List<TransformedItem> itemList = transformedResult.getTransformedResultList();
                for(int i=0; i<itemList.size(); i++){
                    TransformedItem item = itemList.get(i);

                    try {
                        //enrich, change or validate the item elements
                        pipelineController.examineAndChangeObject(item.getItemElements());

                        //check, if item is already stored in AGOL
                        ItemTransaction transactionStatus = insertUpdateCheck(agolReader, item.getItemElements());

                        //create AgolItem and update/insert the item
                        switch (transactionStatus.getTransactionStatus()){
                            case 1:
                                AgolItem agolItem = null;
                                try {
                                    agolItem = agolService.createAgolItem(item.getItemElements());
                                    agolService.insertItem(agolItem, AccessType.valueOf(accessType));
                                } catch (AgolItemInvalidException e) {
                                    sLogger.error("Creating an Agol Item failed", e);
                                } catch (IOException e) {
                                    sLogger.error("The AgolItem could not be inserted", e);
                                }
                                break;
                            case 2:
                                AgolItem newAgolItem = null;