/* See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* Esri Inc. licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.esri.gpt.control.harvest;
import com.esri.gpt.catalog.harvest.protocols.HarvestProtocol.ProtocolType;
import com.esri.gpt.catalog.harvest.protocols.HarvestProtocolAgp2Agp;
import com.esri.gpt.catalog.harvest.protocols.HarvestProtocolResource;
import com.esri.gpt.catalog.harvest.protocols.HarvestProtocolArcIms;
import com.esri.gpt.catalog.harvest.protocols.HarvestProtocolCsw;
import com.esri.gpt.catalog.harvest.protocols.HarvestProtocolOai;
import com.esri.gpt.catalog.harvest.protocols.HarvestProtocolWaf;
import com.esri.gpt.catalog.harvest.repository.HrRecord;
import com.esri.gpt.catalog.management.MmdEnums.ApprovalStatus;
import com.esri.gpt.control.webharvest.client.arcgis.ArcGISProtocol;
import com.esri.gpt.control.webharvest.protocol.Protocol;
import com.esri.gpt.control.webharvest.protocol.ProtocolFactory;
import com.esri.gpt.control.webharvest.protocol.ProtocolInvoker;
import com.esri.gpt.control.webharvest.validator.IValidator;
import com.esri.gpt.control.webharvest.validator.MessageCollectorAdaptor;
import com.esri.gpt.control.webharvest.validator.ValidatorFactory;
import com.esri.gpt.framework.collection.StringAttributeMap;
import com.esri.gpt.framework.context.ApplicationConfiguration;
import com.esri.gpt.framework.context.ApplicationContext;
import com.esri.gpt.framework.jsf.FacesMap;
import com.esri.gpt.framework.jsf.MessageBroker;
import com.esri.gpt.framework.util.Val;
import java.util.ArrayList;
import java.util.Map;
import java.util.TreeMap;
import javax.faces.model.SelectItem;
/**
* Provides harvest repository editing functionality.
* It assures that each harvest repository can be viewed in the same, unified
* way regardless the protocol. It also provides smooth values translation
* from/to native form as stored within the object and to/from string value as
* required in most cases to display on the form.
*/
public class HarvestEditor {
// class variables =============================================================
/** CSW profiles manager */
private static CswProfilesManager _cswProfilesManager = new CswProfilesManager();
private static final String HOST_NAME_REGEX = "(^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])([/].+)?$)|(^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])([/].+)?$)";
// instance variables ==========================================================
/** validation status */
private boolean _valid;
/** Edited repository. */
private HrRecord _harvestRepository;
/** all possible protocols */
private TreeMap<String,Protocol> protocols = new TreeMap<String,Protocol>(String.CASE_INSENSITIVE_ORDER);
{
ApplicationContext appCtx = ApplicationContext.getInstance();
ApplicationConfiguration appCfg = appCtx.getConfiguration();
for (Map.Entry<String,ProtocolFactory> e : appCfg.getProtocolFactories().entrySet()) {
protocols.put(e.getKey(), e.getValue().newProtocol());
}
}
private boolean arcgisDotComAllowed;
private boolean crossAllowed;
private FrequencyMode frequencyMode = FrequencyMode.PERIODICAL;
// constructors ================================================================
/**
* Creates instance of editor.
* @param harvestRepository repository to be edited
*/
public HarvestEditor(HrRecord harvestRepository) {
_harvestRepository = harvestRepository;
protocols.put(harvestRepository.getProtocol().getKind(), harvestRepository.getProtocol());
ApplicationContext appCtx = ApplicationContext.getInstance();
ApplicationConfiguration appCfg = appCtx.getConfiguration();
String sArcgisDotComAllowed = appCfg.getCatalogConfiguration().getParameters().getValue("webharvester.agp2agp.arcgisDotCom.allowed");
this.arcgisDotComAllowed = Val.chkBool(sArcgisDotComAllowed, false);
String sCrossAllowed = appCfg.getCatalogConfiguration().getParameters().getValue("webharvester.agp2agp.sameDomain.allowed");
this.crossAllowed = Val.chkBool(sCrossAllowed, false);
}
// properties ==================================================================
@Deprecated
public boolean getArcgisDotComAllowed() {
return arcgisDotComAllowed;
}
@Deprecated
public void setArcgisDotComAllowed(boolean arcgisDotComAllowed) {
this.arcgisDotComAllowed = arcgisDotComAllowed;
}
@Deprecated
public boolean getCrossAllowed() {
return crossAllowed;
}
@Deprecated
public void setCrossAllowed(boolean crossAllowed) {
this.crossAllowed = crossAllowed;
}
/**
* Gets edited repository.
* @return edited repository
*/
public HrRecord getRepository() {
return _harvestRepository;
}
/**
* Gets owner id as string.
* @return owner id
*/
public String getOwnerId() {
return Integer.toString(_harvestRepository.getOwnerId());
}
/**
* Sets owner id from string.
* @param value owner id
*/
public void setOwnerId(String value) {
_harvestRepository.setOwnerId(Val.chkInt(value, -1));
}
/**
* Gets map of attributes.
* @return map of attributes
*/
public Map<String,String> getAttrs() {
return new FacesMap<String>() {
@Override
public String get(Object key) {
StringAttributeMap map = _harvestRepository.getProtocol().getAttributeMap();
String value = map.getValue(key.toString());
if ("src-m".equals(key) && Val.chkStr(value).isEmpty()) {
value = HarvestProtocolAgp2Agp.getAgp2AgpMaxItems().toString();
}
return Val.chkStr(value);
}
@Override
public String put(String key, String value) {
StringAttributeMap map = _harvestRepository.getProtocol().getAttributeMap();
map.set(key.toString(), Val.chkStr(value));
_harvestRepository.getProtocol().setAttributeMap(map);
return value;
}
};
}
/**
* Gets protocol name.
* @return protocol name
*/
public String getType() {
return _harvestRepository.getProtocol().getKind().toLowerCase();
}
/**
* Sets protocol name.
* @param name protocol name name
*/
public void setType(String name) {
_harvestRepository.setProtocol(protocols.get(name));
}
/**
* Checks if 'deep harvest' is enabled.
* @return <code>true</code> if 'deep harvest' is enabled
*/
public boolean getUpdateContent() {
return ProtocolInvoker.getUpdateContent(_harvestRepository.getProtocol());
}
/**
* Enables/disables 'deep harvest'
* @param enabled <code>true</code> to enable 'deep harvest'
*/
public void setUpdateContent(boolean enabled) {
ProtocolInvoker.setUpdateContent(_harvestRepository.getProtocol(), enabled);
}
/**
* Checks if 'xml generation' is enabled.
* @return <code>true</code> if 'xml generation' is enabled
*/
public boolean getUpdateDefinition() {
return ProtocolInvoker.getUpdateDefinition(_harvestRepository.getProtocol());
}
/**
* Enables/disables 'xml generation'
* @param enabled <code>true</code> to enable 'xml generation'
*/
public void setUpdateDefinition(boolean enabled) {
ProtocolInvoker.setUpdateDefinition(_harvestRepository.getProtocol(), enabled);
}
/**
* Checks if 'auto-approve' is enabled.
* @return <code>true</code> if 'auto-approve' is enabled
*/
public boolean getAutoApprove() {
return ProtocolInvoker.getAutoApprove(_harvestRepository.getProtocol());
}
/**
* Enables/disables 'auto-approve'
* @param enabled <code>true</code> to enable 'auto-approve'
*/
public void setAutoApprove(boolean enabled) {
ProtocolInvoker.setAutoApprove(_harvestRepository.getProtocol(), enabled);
}
/**
* Checks if 'lock-title' is enabled.
* If a flag is set, it means a title is locked and synchronizer is not allowed
* to update it, although all the rest of information is allowed to be updated.
* @return <code>true</code> if 'lock-title' is enabled
*/
public boolean getLockTitle() {
return ProtocolInvoker.getLockTitle(_harvestRepository.getProtocol());
}
/**
* Enables/disables 'lock-title'
* If a flag is set, it means a title is locked and synchronizer is not allowed
* to update it, although all the rest of information is allowed to be updated.
* @param lockTitle <code>true</code> to enable 'lock-title'
*/
public void setLockTitle(boolean lockTitle) {
ProtocolInvoker.setLockTitle(_harvestRepository.getProtocol(), lockTitle);
}
/**
* Gets harvest frequency.
* @return harvest frequency
*/
public String getHarvestFrequency() {
return _harvestRepository.getHarvestFrequency().name().toLowerCase();
}
/**
* Sets harvest frequency.
* @param harvestFrequency harvest frequency
*/
public void setHarvestFrequency(String harvestFrequency) {
_harvestRepository.setHarvestFrequency(
HrRecord.HarvestFrequency.checkValueOf(harvestFrequency));
}
/**
* Gets sending notification switch flag.
* @return sending notification switch flag
*/
public String getSendNotification() {
return Boolean.toString(_harvestRepository.getSendNotification());
}
/**
* Sets sending notification switch flag.
* @param sendNotification sending notification switch flag
*/
public void setSendNotification(String sendNotification) {
_harvestRepository.setSendNotification(Val.chkBool(sendNotification, false));
}
/**
* Gets repository name.
* @return name
*/
public String getName() {
return _harvestRepository.getName();
}
/**
* Sets repository name.
* @param name name
*/
public void setName(String name) {
_harvestRepository.setName(name);
}
/**
* Gets host URL.
* @return host URL
*/
public String getHostUrl() {
return _harvestRepository.getHostUrl();
}
/**
* Sets host URL.
* @param hostUrl host URL
*/
public void setHostUrl(String hostUrl) {
_harvestRepository.setHostUrl(hostUrl);
}
/**
* Gets SOAP URL.
* @return SOAP URL
*/
public String getSoapUrl() {
return _harvestRepository.getProtocol() instanceof ArcGISProtocol?
((ArcGISProtocol)_harvestRepository.getProtocol()).getSoapUrl():
"";
}
/**
* Sets SOAP URL.
* @param url SOAP URL
*/
public void setSoapUrl(String url) {
if (_harvestRepository.getProtocol() instanceof ArcGISProtocol) {
((ArcGISProtocol)_harvestRepository.getProtocol()).setSoapUrl(url);
}
}
/**
* Gets ArcIMS properties.
* @return ArcIMS properties
*/
public HarvestProtocolArcIms getArcIms() {
return (HarvestProtocolArcIms) protocols.get(ProtocolType.ArcIms.name());
}
/**
* Gets OAI properties.
* @return OAI properties
*/
public HarvestProtocolOai getOai() {
return (HarvestProtocolOai) protocols.get(ProtocolType.OAI.name());
}
/**
* Gets WAF properties.
* @return WAF properties
*/
public HarvestProtocolWaf getWaf() {
return (HarvestProtocolWaf) protocols.get(ProtocolType.WAF.name());
}
/**
* Gets CSW properties.
* @return CSW properties
*/
public HarvestProtocolCsw getCsw() {
return (HarvestProtocolCsw) protocols.get(ProtocolType.CSW.name());
}
/**
* Gets CSW properties.
* @return CSW properties
*/
public HarvestProtocolResource getArcGis() {
return (HarvestProtocolResource) protocols.get(ProtocolType.RES.name());
}
/**
* Gets all CSW profiles.
* @return array list of all CSW profiles id's
*/
public ArrayList<SelectItem> getAllProfiles() {
return _cswProfilesManager.getAllItems();
}
/**
* Gets approval status.
* @return approval status
*/
public String getApprovalStatus() {
return getRepository().getApprovalStatus().name();
}
/**
* Approval status.
* @param status approval status
*/
public void setApprovalStatus(String status) {
getRepository().setApprovalStatus(ApprovalStatus.checkValue(status));
}
// methods =====================================================================
/**
* Prepares repository for edit.
*/
public void prepareForEdit() {
switch (getRepository().getHarvestFrequency()) {
case AdHoc:
setFrequencyMode(FrequencyMode.ADHOC);
getRepository().setHarvestFrequency(HrRecord.HarvestFrequency.Skip);
break;
default:
setFrequencyMode(FrequencyMode.PERIODICAL);
getRepository().clearAdHocEventList();
}
}
/**
* Prepares repository for update.
*/
public void prepareForUpdate() {
if (getFrequencyMode()== FrequencyMode.ADHOC) {
getRepository().setHarvestFrequency(HrRecord.HarvestFrequency.AdHoc);
} else {
getRepository().clearAdHocEventList();
}
}
/**
* Validates entered content.
* @param mb message broker
* @return <code>true</code> if data is valid
*/
public boolean validate(MessageBroker mb) {
ValidatorFactory factory = ValidatorFactory.getInstance();
IValidator validator = factory.getValidator(_harvestRepository);
return validator!=null? validator.validate(new MessageCollectorAdaptor(mb)): true;
}
/**
* Gets string representation of the object.
* @return string representation
*/
@Override
public String toString() {
return _harvestRepository.toString();
}
public FrequencyMode getFrequencyMode() {
return frequencyMode;
}
public void setFrequencyMode(FrequencyMode frequencyMode) {
this.frequencyMode = frequencyMode;
}
public String getFrequencyModeAsString() {
return frequencyMode.name();
}
public void setFrequencyModeAsString(String frequencyMode) {
frequencyMode = Val.chkStr(frequencyMode);
try {
this.frequencyMode = FrequencyMode.valueOf(frequencyMode.toUpperCase());
} catch (IllegalArgumentException ex) {
this.frequencyMode = FrequencyMode.PERIODICAL;
}
}
/**
* Gets time codes.
*
* @return time codes.
*/
public String getTimeCodes() {
return _harvestRepository.getProtocol().getAdHoc();
}
/**
* Sets time codes.
*
* @param timeCodes time codes
*/
public void setTimeCodes(String timeCodes) {
_harvestRepository.getProtocol().setAdHoc(timeCodes);
}
/**
* Frequency mode.
*/
public static enum FrequencyMode {
/** periodical (once every period of time) */
PERIODICAL,
/** ad-hoc (at the predefined exact point in time) */
ADHOC
}
}